分页存储过程的问题

todaywlq 2006-10-18 09:24:37
我用下面的存储过程做分页,数据库有160万条记录,我的查询条件里有CONTAINS(mingc,'儿童'),在查询分析器里需要3分多才能返回结果,web前台一查询就超时,各位有没有什么改进的办法,分不够可以再加。

CREATE PROCEDURE pagination
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = '*', -- 需要返回的列
@fldName varchar(255)='', -- 排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@doCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)
AS

declare @strSQL varchar(5000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型

if @doCount != 0
begin
if @strWhere !=''
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where (' + @strWhere + ')'
else
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
end
--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况:
else
begin
if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by [' + @fldName +'] desc'
--如果@OrderType不是0,就执行降序,这句很重要!
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by [' + @fldName +'] 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
--以下代码赋予了@strSQL以真正执行的SQL代码
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from [' + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['+ @fldName + '])
       from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['+ @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'+ @strOrder

if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
+ @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 + '(['
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @fldName + '] from [' + @tblName + '] '
+ @strOrder + ') as tblTmp) ' + @strOrder
end
end

print @strSQL

exec (@strSQL)
GO
...全文
700 37 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
Homers 2006-10-20
  • 打赏
  • 举报
回复
'select count(*) as Total from [' + @tblName + '] where (' + @strWhere + ')'
像这样的语句,如果数据多的话,会影响速度的

将需要查询的字段索引
todaywlq 2006-10-20
  • 打赏
  • 举报
回复
………………
lih163 2006-10-19
  • 打赏
  • 举报
回复
jedliu 2006-10-19
  • 打赏
  • 举报
回复
or 会引起全表扫描,也许就是这个弄慢的。其他的我都试过,即使200万的数据,查最后几页也只要13秒左右!
todaywlq 2006-10-19
  • 打赏
  • 举报
回复
我改为@strWhere = 'CONTAINS(mingc,''儿童'')'也一样慢,第一页用了12秒, 第二页就要用5分09秒,怎么差这么多?
xiaoyuehen 2006-10-19
  • 打赏
  • 举报
回复
SELECT @strWhere = 'nian >=''2000'' and nian<=''2006'' and (bianh like ''001%'' OR bianh like ''002%'' OR bianh like ''003%'' OR bianh like ''004%'' OR bianh like ''005%'' OR bianh like ''006%'' OR bianh like ''007%'' OR leftbianh like ''008%'' OR bianh like ''009%'' OR bianh like ''010%'' OR bianh like ''011%'' OR bianh like ''012%'') AND CONTAINS(mingc,''儿童'')'
netlg 2006-10-19
  • 打赏
  • 举报
回复
学习
chenjunjarysky 2006-10-19
  • 打赏
  • 举报
回复
建议用case when then end结构。
szc21 2006-10-19
  • 打赏
  • 举报
回复
太长了,顶
Edisoncat 2006-10-19
  • 打赏
  • 举报
回复
帮顶,接分
hertcloud 2006-10-19
  • 打赏
  • 举报
回复
http://www.cnblogs.com/hertcloud/
todaywlq 2006-10-19
  • 打赏
  • 举报
回复
和SQL Server 补丁有没有关系,我没有装补丁?
todaywlq 2006-10-19
  • 打赏
  • 举报
回复
自已顶
jinher 2006-10-19
  • 打赏
  • 举报
回复
ding
www.jh0101.com
todaywlq 2006-10-19
  • 打赏
  • 举报
回复
怎么搞的
我用mingc like '%儿童%' 也比 CONTAINS(mingc,'儿童')要快
todaywlq 2006-10-19
  • 打赏
  • 举报
回复
怎么搞的
我用mingc like '%儿童%' 也比 CONTAINS(mingc,'儿童')
todaywlq 2006-10-19
  • 打赏
  • 举报
回复
我觉得我的问题出在全文索引上,请问使全文索引有要什么注意的吗?
belldandy11 2006-10-19
  • 打赏
  • 举报
回复
学习
jedliu 2006-10-19
  • 打赏
  • 举报
回复
奇怪,我即使按你的那样做,也是很快!
exec pagination 'Item',default,'It_Itemid',200,default,default,default,
'It_Itemid=''EST-1000'' or It_Itemid=''EST-1020'' or It_Itemid=''EST-1020000''
or It_Productid like ''RP-LI-4%'' or It_Productid like ''RP-LI-3%''
or It_Productid like ''RP-LI-2%'' or It_Productid like ''RP-LI-5%''
or It_Productid like ''RP-LI-1%'''

每页的大小都加到了200!

你为什么不把bianh截掉呢,用substring(bianh,0,3)截出前两位,如果是“00”,则截出第三位substring(bianh,3,1),判断当大于1小于11时,可以进行查询!

不知道这样会不会快点!
junmail 2006-10-18
  • 打赏
  • 举报
回复
帮顶!
加载更多回复(17)

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧