re: 海量存储过程(500w数据,分页只需2秒) laifangsong 2008-05-04 10:51
楼主,我的分页存储过程和你的类似,但没要求排序的字段必须是主键
/****** 对象: 存储过程 dbo.sp_Paging 脚本日期: 2007-11-27 9:43:17 ******/
/****** 对象: 存储过程 dbo.sp_Paging 脚本日期: 2007-4-27 13:19:03 ******/
/*
分页存储过程(来源于网络,经过修改以适应多表联合查询)
注意:该存储过程和和网络上其他分页存储过程一样,存在经典的SQL注入漏洞; 不论在asp/asp.net等中调用时,
都要把 @strWhere参数中的非法字符(逗号过滤掉)
*/
CREATE PROCEDURE sp_Paging
@tblName varchar(255) , -- 表名
@strGetFields varchar(1000) = '*', -- 需要返回的列
@fldName varchar(255)='', -- 主关键字字段名
@orderfield varchar(255)='', -- 排序的字段名
@pageSize int = 10, -- 页尺寸
@pageIndex int = 1, -- 页码
@recordCount int = 0 output, -- 返回记录总数
@pageCount int = 0 output, --分页总数
@orderType int = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)
AS
declare @strSQL nvarchar(3000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
begin
if @strWhere !=''
set @strSQL = 'select @recordCount = count(*) from ' + @tblName + ' where '+@strWhere
else
set @strSQL = 'select @recordCount = count(*) from ' + @tblName
end
exec sp_executesql @strSQL,N'@recordCount int out ',@recordCount out
if @recordCount % @pageSize = 0
set @pageCount = @recordCount / @pageSize
else
set @pageCount = @recordCount / @pageSize + 1
--以上代码的意思是计算出记录是总数和求出总共的页数
begin
if @orderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by ' + @orderfield +' desc'
--如果@orderType不是0,就执行降序,这句很重要!
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by ' + @orderfield +' asc'
end
if @pageIndex = 1
begin
if @strWhere != ''
set @strSQL = 'select top ' + str(@pageSize) +' '+@strGetFields+ ' from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top ' + str(@pageSize) +' '+@strGetFields+ ' from '+ @tblName + ' '+ @strOrder
--如果是第一页就执行以上代码,这样会加快执行速度
end
else
begin
if @strWhere != ''
set @strSQL = 'select top ' + str(@pageSize) +' '+@strGetFields+ ' from '
+ @tblName + ' where ' + @fldName + '' + @strTmp + '('
+ substring(@fldName, charindex('.',@fldName)+1, len(@fldName)) + ') from (select top ' + str((@pageIndex-1)*@pageSize) + ' '
+ @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top ' + str(@pageSize) +' '+@strGetFields+ ' from '
+ @tblName + ' where ' + @fldName + '' + @strTmp + '('
+ substring(@fldName, charindex('.',@fldName)+1, len(@fldName)) + ') from (select top ' + str((@pageIndex-1)*@pageSize) + ' '
+ @fldName + ' from ' + @tblName + '' + @strOrder + ') as tblTmp)'
+ @strOrder
end
end
print @strSQL
exec sp_executesql @strSQL
GO
re: 你的胸怀是被谁撑大的? laifangsong 2007-11-02 00:01
这篇文笔很好
读起来相当舒服!
我没在这家公司
所以没办法回答你,如果你有去面试的话,祝你好运:)
re: 常用SQL语句(整) laifangsong 2007-09-24 18:39
回楼上的朋友:
你没注意到后面有 group by field1,field2
是每组只剩一条记录
re: 不错的分页存储过程(转) laifangsong 2007-09-19 12:46
if @pageIndex > @pageCount
set @pageIndex = @pageCount
re: 不错的分页存储过程(转) laifangsong 2007-09-18 17:49
回楼上:
这个存储过程是别人写的,我只是修改了他的代码而已
re: 一种做事的精神,记师傅陕北吴旗娃 laifangsong 2007-09-05 22:22
不论是技术、人品和意志力,都值得敬佩和学习
re: 看似诡异的session赋值错误 laifangsong 2007-09-05 18:20
是 !=
我写错了,马上改下
re: 今天向我女朋友求婚了~ laifangsong 2007-08-17 13:48
有点佩服你了,脸皮确实有点”厚“,哈哈
re: 我希望自己是个医生 laifangsong 2007-08-17 13:41
对比楼主文章中说到的每个点,我们公司里基本能找到一个对应的
好文章。
re: 数据库团队欢迎你的加入 laifangsong 2007-08-13 15:16
laifangsong
laifangsong@gmail.com
http://jiny-z.cnblogs.com/
申请加入。
re: 我也谈谈这个执行力吧 laifangsong 2007-08-08 15:01
@佚名
如果苏老大文章写的很差,就算他跟bill gate差不多NB,估计也没什么人拍“马屁”吧。应该可以说是对他观点的赞同和文章的肯定吧。
re: 在csdn上看到奶牛问题,写了下算法 laifangsong 2007-08-07 22:00
@fffly
对啊,有时候小问题,大学问,呵呵
@silent x
好像蛮长的,我看看;)
@周银辉
确实挺费时间的,我算法较差,非递归真的写不出来,我看看你的算法。
re: asp/asp.net中遍历树型结构. laifangsong 2007-08-07 12:16
@海洋
本次查询的ID做为下次的ParentID
re: 用AspJpeg组件,按宽高比例,真正生成缩略图 laifangsong 2007-08-01 08:52
@123
检查图片路径,注意要用相对路径
re: C#(1.1)邮件发送类,功能全面,调用灵活、方便 laifangsong 2007-07-31 16:25
@ddy
你说的我也不懂怎么实现,估计不行。就算你发过去的标题是链接,邮件服务器也会做处理的,因为他一般要保证点着该链接可以到邮件正文。
re: C#(1.1)邮件发送类,功能全面,调用灵活、方便 laifangsong 2007-07-29 07:35
@superstar
可能是你的smtp服务器设置有问题,例:163的smtp是 smtp.163.com
另外,调用例子中的邮箱地址和登录密码,要改成你自己的。
re: 狙击艾滋病,共同努力 laifangsong 2007-07-09 08:13
汗。这东西都有!
楼主的 51aspx.com上面的源码真的不错,没有死链,下载下来的压缩包里的数据也比较完整。
我下了几个不错的代码。MS mvp liuwei写的个人blog站点代码和一个仿codeproject论坛的代码,都很不错。
但是,网站上老外写的代码比较少(是不是因为翻译比较困难),即使有,放在网站上也不容易找到。建议楼主把老外写的源码单独列一块,其中比较好的做个推荐的标识就更好了。
re: 关于分页这点事 -- 如何才能分得准 laifangsong 2007-07-04 09:58
分析的很全面,:)
re: VS2005(c#)项目调试问题解决方案集锦 laifangsong 2007-07-02 10:28
不错。
re: 下周将去北京寻找投资 laifangsong 2007-06-29 14:57
只要是学.net的,应该没有人不知道博客园的。
祝顺利。
re: 不喜欢数据库编程 laifangsong 2007-06-26 09:05
@kiler
分页写成存储过程,这两个也算原因吧:
1.分页程序逻辑上独立,一般写好后不需要做修改,做为存储过程放在数据库中就是独立的一个文件,使用方便又带来些效率上的提升。
2.分页存储过程独立于语言之外,写好后放在数据库中,不管是asp.net/asp/java...,只要写一次。
re: 欢迎加入 Visual Basic 团队 laifangsong 2007-06-25 08:20
听说楼主才14岁,惊讶...
我虽然不做vb.net开发,也帮你捧个场。
re: 服务器已经成功搬迁到新机房 laifangsong 2007-06-25 08:08
不论我还公司还是在家里访问博客园,都比以前快多了,真好。
re: 麻烦大家测试一下新机房的网速 laifangsong 2007-06-25 08:07
电信lan 10M宽带 下载平均300k左右.
re: 经营分析工作总结 laifangsong 2007-06-20 17:19
(这段应该好好写)
谢谢党和国家给我这么一个大环境,让我可以安居,让我可以娶妻生子,更重要的是让我可以在三个代表的光辉下茁壮成长。
感谢那些给我无穷压力也被我无数次暗骂的客户们:贵州联通、广西联通、云南联通、重庆移动、江西移动、浙江移动、吉林移动、天津电信、河北移动、山东移动。没有他们的刻薄,我也无法作出这个东西。
//太搞笑了。
re: 迅速把握需求要点? laifangsong 2007-06-20 17:17
对你有点帮助呢?
//有:)
re: 与访问您网站(或Blog)的朋友即时交流 laifangsong 2007-06-19 09:22
这东西跟 网页上的那种 “QQ客服” 相比,不知道有什么优势?:)
聊天的内容不知道会不会保存在 提供服务 的提供商的数据库中?
re: 做了三年开发之后由博客园引发的一点感想 laifangsong 2007-06-18 17:03
共勉。
re: 给面试者的建议,认真对待你的作品 laifangsong 2007-06-18 10:49
楼主还是不错的了。
面试的时候准备不充分是难免的,但作品至少应该拿的出手,自己做的,跟应聘的工作有关,运行的起来。
re: 网站项目开发要点---一个实际项目开发心得 laifangsong 2007-06-18 10:38
第16点以前都不知道,:)
re: 滥用存储过程的思考 laifangsong 2007-06-15 11:20
@henry
先向博主道个歉,我确实没有测试过 50w在datareader中循环的速度,只是感觉慢。
你说的 “p4 1.8 512m 的电脑通过索引分页对100W记录拿任何一页都是秒杀”,在单机上测试出现这个结果应该也没什么问题。
但是分页程序放在网络上n人同时访问时,n次的100w访问,是要消耗很多内存的。
存储过程可以做到“按需去取”,datareader却不能,差别就在这里。
re: 滥用存储过程的思考 laifangsong 2007-06-15 00:11
首先是数据少,不具有代表性。数据量较大时(比如50万条),不敢想象点击到最后一页时,datareader里做了50w次循环要花多少时间。
其次,用创建临时表方法很不可取,虽然创建临时表对 各种有查询条件的分页存储过程支持的比较好(比如 文章列表分页,要实现文章置顶有些比较高效的分页存储过程不能用),但创建临时表消耗了很多内存和时间,完全可以用
2个 top 的写法代替,相信效果也比测试中的数据要好的多。
re: 是谁愚弄了咱中国人(转于Yahoo论坛) laifangsong 2007-06-10 23:10
很牛B的一篇文章.......
re: 贱货 黑人 家丑 laifangsong 2007-06-10 22:44
博主处理的很恰当,佩服!!
re: 项目开发经验谈(一) laifangsong 2007-05-23 09:27
好文。
厉害干系人部分说的挺好。
楼主可以在该虚拟目录下,建一个 .html或者 .asp的文件,看看能不能正常访问。
如果正常,说明 iis6解释 asp.net的时候才出了问题,再继续查查原因。
re: 网速测试[未登录] laifangsong 2007-05-17 09:01
250K左右,
福建福州电信LAN 10M
re: javascript分页 laifangsong 2007-05-14 11:51
挺特别的。
re: 我也说说王开源吧 laifangsong 2007-04-27 08:33
一流人才,一流口才!:):(
re: 您未必知道的Js技巧 laifangsong 2007-04-23 09:00
好东西。
re: 学会对客户说“不”! laifangsong 2007-04-22 21:28
好文章。
re: 不错的分页存储过程(转) laifangsong 2007-04-13 09:20
试了下,发现确实可以注入。
其实很多分页存储过程TSQL语句都是这样写的,基本都有注入问题。
declare @sqlstr
set @sqlstr = '...'
exec(@sqlstr )
/*
先 生成一个大的sql语句串,再调用执行;如果查询条件中传入逗号,逗号全部变成执行语句的一部分了,注入漏洞就出现了。
即使在asp.net中,通过sqlparam那种形式构建参数,还是免不了sql注入
*/
或者
exec sp_executesql(@sqlstr)
防止注入:
1.
如果不是构造成大的sql语句串来执行,就不会有注入问题。
例如:
select * from admin where username=@username and password=@password
2.参数传入之前先过滤
//过滤提交的非法字符串(防止sql注入)
public static string GetSafeStr(string str)
{
return str.Replace("'", "").Replace("\"", "").Replace(":", "");
}
re: asp.net获取URL和IP地址 laifangsong 2007-04-11 10:50
good!
re: 团队建设(4)-天下没有不散的筵席 laifangsong 2007-04-01 01:20
您的团队令我羡慕。
re: 向大家汇报一下3月份博客园的访问量情况 laifangsong 2007-04-01 01:05
周平均访问量总是在上升,不错啊。