仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 875|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL网站制作之完成万万级数据的分页显现--收拾材料...

[复制链接]
变相怪杰 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:36:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
为了在某种程序上弥补这一缺陷,许多SQL命令都有一个DELAY_KEY_WRITE项。这个选项的作用是暂时制止MySQL在该命令每插入一条新记录和每修改一条现有之后立刻对索引进行刷新,对索引的刷新将等到全部记录插入/修改完毕之后再进行。分页|数据|显现CREATEPROCEDUREGetRecordFromPage
@tblNamevarchar(255),--表名
@fldNamevarchar(255),--字段名
@PageSizeint=10,--页尺寸
@PageIndexint=1,--页码
@IsCountbit=0,--前往纪录总数,非0值则前往
@OrderTypebit=0,--设置排序范例,非0值则降序
@strWherevarchar(1000)=--查询前提(注重:不要加where)
AS

declare@strSQLvarchar(6000)--主语句
declare@strTmpvarchar(100)--一时变量
declare@strOrdervarchar(400)--排序范例

if@OrderType!=0
begin
set@strTmp="<(selectmin"
set@strOrder="orderby["+@fldName+"]desc"
end
else
begin
set@strTmp=">(selectmax"
set@strOrder="orderby["+@fldName+"]asc"
end

set@strSQL="selecttop"+str(@PageSize)+"*from["
+@tblName+"]where["+@fldName+"]"+@strTmp+"(["
+@fldName+"])from(selecttop"+str((@PageIndex-1)*@PageSize)+"["
+@fldName+"]from["+@tblName+"]"+@strOrder+")astblTmp)"
+@strOrder

if@strWhere!=
set@strSQL="selecttop"+str(@PageSize)+"*from["
+@tblName+"]where["+@fldName+"]"+@strTmp+"(["
+@fldName+"])from(selecttop"+str((@PageIndex-1)*@PageSize)+"["
+@fldName+"]from["+@tblName+"]where"+@strWhere+""
+@strOrder+")astblTmp)and"+@strWhere+""+@strOrder

if@PageIndex=1
begin
set@strTmp=""
if@strWhere!=
set@strTmp="where"+@strWhere

set@strSQL="selecttop"+str(@PageSize)+"*from["
+@tblName+"]"+@strTmp+""+@strOrder
end

if@IsCount!=0
set@strSQL="selectcount(*)asTotalfrom["+@tblName+"]"

exec(@strSQL)

GO



修正后,便于利用的代码:


修正一点点便于其别人利用
CREATEPROCEDUREGetRecordFromPage
@tblNamevarchar(255),--表名
@fldNamevarchar(255),--字段名
@OrderfldNamevarchar(255),--排序字段名
@StatfldNamevarchar(255),--统计字段名
@PageSizeint=10,--页尺寸
@PageIndexint=1,--页码
@IsCountbit=0,--前往纪录总数,非0值则前往
@OrderTypebit=0,--设置排序范例,非0值则降序
@strWherevarchar(1000)=--查询前提(注重:不要加where)
AS

declare@strSQLvarchar(6000)--主语句
declare@strTmpvarchar(100)--一时变量
declare@strOrdervarchar(400)--排序范例

if@OrderType!=0
begin
set@strTmp="<(selectmin"
set@strOrder="orderby["+@OrderfldName+"]desc"
end
else
begin
set@strTmp=">(selectmax"
set@strOrder="orderby["+@OrderfldName+"]asc"
end

set@strSQL="selecttop"+str(@PageSize)+""+@fldName+"from["
+@tblName+"]where["+@OrderfldName+"]"+@strTmp+"(["
+@OrderfldName+"])from(selecttop"+str((@PageIndex-1)*@PageSize)+"["
+@OrderfldName+"]from["+@tblName+"]"+@strOrder+")astblTmp)"
+@strOrder

if@strWhere!=
set@strSQL="selecttop"+str(@PageSize)+""+@fldName+"from["
+@tblName+"]where["+@OrderfldName+"]"+@strTmp+"(["
+@OrderfldName+"])from(selecttop"+str((@PageIndex-1)*@PageSize)+"["
+@OrderfldName+"]from["+@tblName+"]where"+@strWhere+""
+@strOrder+")astblTmp)and"+@strWhere+""+@strOrder

if@PageIndex=1
begin
set@strTmp=""
if@strWhere!=
set@strTmp="where"+@strWhere

set@strSQL="selecttop"+str(@PageSize)+""+@fldName+"from["
+@tblName+"]"+@strTmp+""+@strOrder
end

if@IsCount!=0
set@strSQL="selectcount("+@StatfldName+")asTotalfrom["+@tblName+"]"

exec(@strSQL)

GO


申明:
增添了上面两个部分,其别人拷贝往可依据本人必要举行设定。
@OrderfldNamevarchar(255),--排序字段名
@StatfldNamevarchar(255),--统计字段名

fldName感化由排序变化为把持必要翻开的字段。
@fldNamevarchar(255),--字段名

----------------------------------------------
团体测试了局:
经由过程测试,功能并没有原帖子所说的好。但这多是呆板缘故原由,要晓得,在SQLServer中,2万万条空纪录约莫要占用3G摆布的空间,而拔出这2万万笔记录,在我的测试平台上泯灭了近10个小时,内存占用从125M增加到350M摆布。我实践测试了一下,在创建索引的情形下,实行一次依据主键,前往一笔记录的查询,在512M内存,2.2GCPU,20G单分区存储数据库文件,100M局域网的设置情形下,均匀约莫必要15s摆布(这只是我的团体测试,不具有任何本色性意义。)。

别的我发明,关于上述设置的呆板,运转SQLServer时,在百万级别以下的表中实行查询--(索引优秀,没有坏点,大概最新索引),速率不同不年夜,但到达8位数以上,也就是万万以上时分,SQLServer体现就不太好了,固然,这与呆板设置有很年夜干系了。但无能否认,SQLServer2000还不是企业级数据库的最好选择,在Oracle实行相似的查询,功能要好过SQLServer。拔出实行终了的工夫是4个小时,内存占用一向没有变更:400M。实行不异查询,必要的工夫是10s摆布。

小弟比来忙于一个公积金项目,关于部门数据库、中心数据库的调剂举行了一些评价,Oracle软件+SUN/HP的硬件仍旧占了中国当局机构服务器的年夜部分市场,再就是IBM,占有了高端和甚高真个年夜部分营业。

微软在这方面打个败仗,另有很长的路要走--团体以为,和硬件公司互助研发相配套硬件是不贰秘诀。提供TCP/IP、ODBC和JDBC等多种数据库连接路径。
活着的死人 该用户已被删除
沙发
发表于 2015-1-19 18:48:09 | 只看该作者
很多书籍啊,不过个人认为看书太慢,还不如自己学。多做实际的东西,就会遇到很多问题,网上搜下解决问题。不断重复这个过程,在配合sql的F1功能。
只想知道 该用户已被删除
板凳
发表于 2015-1-26 14:53:40 | 只看该作者
如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。
灵魂腐蚀 该用户已被删除
地板
发表于 2015-2-4 17:00:45 | 只看该作者
如果处理少量数据,比如几百条记录的数据,我不知道这两种情况哪个效率更高,如果处理大量数据呢?比如有表中有20万条记录.
冷月葬花魂 该用户已被删除
5#
发表于 2015-2-10 04:51:23 | 只看该作者
入门没那么困难,精通没那么容易
柔情似水 该用户已被删除
6#
发表于 2015-2-28 20:35:19 | 只看该作者
SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。
小妖女 该用户已被删除
7#
发表于 2015-3-10 07:56:39 | 只看该作者
在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。
飘灵儿 该用户已被删除
8#
发表于 2015-3-17 05:20:28 | 只看该作者
对于数据库来说,查询是数据库的灵魂,那么SQL查询效率究竟效率如何呢?下文将带对SQL查询的相关问题进行讨论,供您参考。
精灵巫婆 该用户已被删除
9#
发表于 2015-3-23 21:58:58 | 只看该作者
光写几个SQL实在叫无知。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-4-27 13:51

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表