手机版

查询超时 卡在SQL2005最后一页的解决方案 超过百万页的SQL2008

时间:2021-08-04 来源:互联网 编辑:宝哥软件园 浏览:

类型:数据库类规模:36.0M语言:中文评分:1.0标签:大约2年前马上遇到的下载。题目中的问题研究了好几天,都没能完全解决。后来,人们发现了许多解决问题的方法。最近又遇到了这个问题,但是真的解决不了。我冷静思考,改进了分页查询方法。现在我贴出代码供大家参考。如有漏洞,请及时联系Jiri Gala。如果有错误,我会积极改正。希望你不要反复浪费生命,直接拿去用就好。这种方法也用于一般权限管理系统组件中的分页。最近维护了一个每天IP访问量超过10万的网站,也用了这个分页存储过程。分页效率还可以,最后一页没有卡住。如有问题,请及时联系作者QQ: 252056973。欢迎大家交流分享。

当最后一页断了,卡住了,整个网站的性能就会明显下降。不知道为什么,微软一直没有处理好这个BUG。希望SQL2012不存在这个问题。

参考代码如下:

-===============================================================-作者:吉日嘎拉-创建日期:2012年02月23日-描述:2012年02月23日编码规范化-=========================================================alter process[dbo]. [GetRecordByPage]@ TableNameVarChar(4000),-表名@SelectFieldVARCHAR(4000),-要显示的字段名(不要加选择)@WhereConditionalVARCHAR(4000),-查询条件(注意:不要加其中)@SortExpressionVARCHAR(255),-排序索引字段名@PageSizeINT=20,-页大小@PageIndexINT=1,-页码@ RecordCountINTOUTPUT,-返回记录总数@SortDireVARCHAR(5)='DESC' -设置排序类型,非0值则降序asbeginclare @ commandTextVARCHAR(8000)-主语句DECLARE@TopNINT -获取前几条记录DECLARE@PageCountINT -总共会是几页DECLARE@TopLimitINT -获取多少条记录DECLARE @ SQLRowCountNVARCHAR(4000)-用于查询记录总数的语句DECLARE@SQLOrderVARCHAR(400) -排序类型DECLARE@SQLTempVARCHAR(4000) -临时变量SET @ sort expression=LTRIM(RTRIM(@ sort expression))SET @ sort dire=UPPER(LTRIM(RTRIM(@ sort dire)))-这里是计算整体记录行数IF @ recordcountinisullbeginif @ where条件!=' beginet @ SQLRowCount=' SELECT @ RecordCount=COUNT(1)FROM ' @ TableName ' WHERE ' @ WHERE conditionalendelsbeginet @ SQLRowCount=' SELECT @ RecordCount=COUNT(1)FROM ' @ TableName endendendended-SELECT @ RecordCount=@ @ rowcontexecsp _ executesql @ SQLRowCount,N'@RecordCountINTOUT ',@ RecordCount outif @ RecordCount isullbeginet @ RecordCount=0 end-这里是控制页数最多少SET @页数=@记录数/@页面大小1-这里检查当前页的有效性IF(@页索引1)begin et @页索引=1 END-这里限制最后一页的有效性IF(@ page index @ page count)begin et @ page index=@ page countendif @ sort dire!=' ASC ' begin et @ SqlTEMP='(SelectMIN ' set @ Sqlorder=' order by ' @排序表达式' desc ' endelsbegin et @ SqlTEMP='(Selectmax ' set @ Sqlorder=' order by ' @排序表达式' ASC ' end-这里是调试信息- SELECT@SQLOrder -获取几条数据?吉日嘎拉2010-11-02更新SET @ TopN=@ RecordCount-@ PageSize *(PageIndex-1)IF @ TopN @ PageSizeBeginText @ TopN=@ PageSizeendSet @ TopLimit=@ PageSize *(PageIndex-1)IF @ TopLimit @ RecordCountBeginText @ TopLimit=@ RecordCountEndSet @ CommandText=' SelectToP ' STR(@ TopN)' ' @ SelectField ' FROM ' @ TableName ' WHERE ' @ sortEXPRESSion @ SQLTEMP '(' RIGHT(@ sortEXPRESSION,LEN(@ sortEXPRES=' SET @ commandText=' SELECTTOP ' STR(@ TopN)' ' @ SelectField ' FROM ' @ TableName ' WHERE ' @ sort expression @ SqlTEMP '(' RIGHT(@ sort expression,LEN(@SortExpression)-CHARINDEX '),@ sort expression())')FROM(SELECTTOP ' STR(@ TopLimit)' ' @ sort expression ' FROM ' @ TableName ' WHERE ' @ WHERE conditional ' ' @ SQLOrder ')ASTableTemp)和@ WHERE条件' ' @ SQLOrderIF @ page index=1 begin-第一页的显示效率提高SET @ SqlTEMP=' ' IF @ where条件!=' SET @ SqlTEMP=' WHERE ' @ WHERE conditional SET @ command text=' SELECTTOP ' STR(@ TopN)' ' @ SelectField ' FROM ' @ TableName @ SqlTEMP ' ' @ SqLorderendelsebegin-解决大数据最有一页卡死的问题IF @ PageIndex=@ PageCountBEGINIF @ sort dire=' ASC ' beginet @ SQLOrder=' order by ' @ sort expression ' desc ' endelsbeginet @ SQLOrder=' order by ' @ sort expression ' ASC ' endset @ SQLTemp=' IF @ where conditional!=' SET @ sqltenmp=' WHERE ' @ WHERE conditionalset @ command text=' SELECTTOP ' STR(@ TopN)' ' @ SelectField ' FROM ' @ TableName @ sqltenmp ' ' @ SQLOrderSET @ command text=' SELECT ' @ SelectField ' FROM(' @ command text ')astabletemporadeaderby ' @ sort expression ' ' @ sort direendexec(@ command text)-这个是调试程序用的-SELECT @ commandextend

将权限管理、工作流管理做到我能力的极致,一个人只能做好那么很少的几件事情。

版权声明:查询超时 卡在SQL2005最后一页的解决方案 超过百万页的SQL2008是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。

相关文章推荐