C#.net + sql server2000 分页存储过程

fgh0302 2009-06-19 11:00:48
RT
我自己写了2个,一个是排序必须是 主键 top+2分法。另一个是 临时表,任意字段排序。
我现在 数据表 有500W+ 数据,而且 需要做关联,或者视图 。排序字段也任意
用临时表 效果不好,7 8秒钟。
第一种 如果是单表 + 主键排序 非常快 1000W数据没问题。
可如果是视图,或者需要关联表显示 就大打折扣咯。 排序不是主键 更是直接不能用。
贴下第二种 方法!

alter PROCEDURE proc_paged
(
@tblName nvarchar(200), ----要显示的表或多个表的连接
@fldName nvarchar(500) = '*', ----要显示的字段列表
@pageSize int = 10, ----每页显示的记录个数
@page int = 1, ----要显示那一页的记录
@fldSort nvarchar(200) = null, ----排序字段列表或条件
@Sort bit = 0, ----排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ')
@strCondition nvarchar(1000) = null, ----查询条件,不需where
@ID nvarchar(150), ----主表的主键
@Dist bit = 0, ----是否添加查询字段的 DISTINCT 默认0不添加/1添加
@pageCount int = 1 output, ----查询结果分页后的总页数
@Counts int = 1 output ----查询到的记录数
)
AS
SET NOCOUNT ON
Declare @strTmp nvarchar(1000) ----存放取得查询结果总数的查询语句
DECLARE @PageLowerBound int
DECLARE @PageUpperBound int

-- Set the page bounds
SET @PageLowerBound = @PageSize * @page
SET @PageUpperBound = @PageLowerBound + @PageSize + 1

--------生成查询语句--------
--此处@strTmp为取得查询结果数量的语句
if @strCondition is null or @strCondition='' --没有设置显示条件
begin

set @strTmp = 'select @Counts=count(*) FROM '+@tblName
end
else
begin
set @strTmp = 'select @Counts=count(*) FROM '+@tblName + ' where (1>0) ' + @strCondition
end

----取得查询结果总数量-----
exec sp_executesql @strTmp,N'@Counts int out ',@Counts out
declare @tmpCounts int
if @Counts = 0
set @tmpCounts = 1
else
set @tmpCounts = @Counts
--取得分页总数
set @pageCount=(@tmpCounts+@pageSize-1)/@pageSize

create table #tempNews (id int identity(1,1),nid int)

if(@Sort=0)
begin
set @strTmp='insert into #tempNews(nid) select '+@id+' from '+@tblname+' where 1=1 '+@strCondition+' order by '+@fldSort+' asc'
end
else
begin
set @strTmp='insert into #tempNews(nid) select '+@id+' from '+@tblname+' where 1=1 '+@strCondition+' order by '+@fldSort+' desc'
end
execute(@strTmp)
set @strTmp='SELECT' +@fldName+' FROM '+@tblname+' TableA, #tempNews T WHERE T.nid = TableA.'+@ID+' AND T.id > '+ cast(@PageLowerBound as varchar)+' AND T.id < '+cast(@PageUpperBound as varchar)+' ORDER BY T.id'
execute(@strTmp)

SET NOCOUNT OFF


GO

第一种http://topic.csdn.net/u/20090515/11/96dc896e-ce4c-493b-b6fd-7682e73dcae9.html

求高手 发下 效率高的存储过程!

...全文
373 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
fgh0302 2009-06-26
  • 打赏
  • 举报
回复
哎,我把数据库卸了 装了2005 效率好多了。统计速度还可以接受。

就是 显示时候 条件复杂的话 还是有点慢~~
注册失败 2009-06-25
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 fgh0302 的回复:]
select sum(shidaoshu) from fenjianbiao
我就简单一条求列和 都要一分钟。。
[/Quote]

你一千万的数据去求和,不要一分钟才怪
求和每条记录都去访问,必须要做全表扫描
除非你在 shidaoshu 这个列上建的是聚集索引,不过这种情况一般不可能
fgh0302 2009-06-25
  • 打赏
  • 举报
回复
select sum(shidaoshu) from fenjianbiao
我就简单一条求列和 都要一分钟。。
jxzhao1985 2009-06-25
  • 打赏
  • 举报
回复
帮顶
注册失败 2009-06-25
  • 打赏
  • 举报
回复
嘿嘿,我就没事常来看看

对于这样的问题,具体问题具体解决
如果是要出报表的话呢,建议建一些附加信息表来存些信息,报表别直接从大表里读数据
fgh0302 2009-06-25
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 kingdomgps 的回复:]
引用 40 楼 fgh0302 的回复:
select sum(shidaoshu) from fenjianbiao
我就简单一条求列和 都要一分钟。。



你一千万的数据去求和,不要一分钟才怪
求和每条记录都去访问,必须要做全表扫描
除非你在 shidaoshu 这个列上建的是聚集索引,不过这种情况一般不可能
[/Quote]

谢谢一直关注,闹心。领导要看了,我解释数据量太大了 鸟用 。。
hecker728 2009-06-25
  • 打赏
  • 举报
回复
学习,,用到的时候再来。。谢谢
燃烧的荷尔蒙 2009-06-25
  • 打赏
  • 举报
回复
学习了~
fgh0302 2009-06-24
  • 打赏
  • 举报
回复
谢谢 等
昕颖 2009-06-24
  • 打赏
  • 举报
回复
学习中。。。
lizheng19860824 2009-06-24
  • 打赏
  • 举报
回复
很热闹嘛
lizheng19860824 2009-06-24
  • 打赏
  • 举报
回复
很热闹嘛
fgh0302 2009-06-24
  • 打赏
  • 举报
回复
顶 起来
yang_xingxing88 2009-06-24
  • 打赏
  • 举报
回复
数据量大的话,最好用联合索引这样来提高,访问数据速度。
注册失败 2009-06-24
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 fgh0302 的回复:]
谢谢 工作没激情,

表连接我也做过,exists 也用了。 都不理想  哎。。。

您让我把leixing的索引去掉? 索引不就是提高查询效率么? 去掉了 试了下 更慢 。。。

[/Quote]

索引是什么?简单理解就是排序

像你的leixing这样的字段,总共就三个值:1,2,3,建了索引没什么用处的

如果你总是把 kehuhao 和leixing 作为条件的话,可以建 (kehuhao,leixing) 这样的联合索引来提高查询效率
注册失败 2009-06-22
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 fgh0302 的回复:]
引用 13 楼 kingdomgps 的回复:

还有,如果你的表数据非常多,又要和别的表做连接之类的话
建议单独写存储过程来做分页,不要用通用的
用通用存储过程会慢很多
而且通用存储过程一般用动态SQL语句,不会被数据库优化和缓存


俺的 查询条件 是随时变的啊 如果不拼 动态sql不知道怎么写啦~

create PROCEDURE proc_pageddd
(
@page        int = 1,        ----要显示那一页的记录
@fldSort    nvarchar(200) = null,   …
[/Quote]

不身临其境很难给你很明确的建议

查询条件是变化的,确实没办法不用动态SQL
但如果仅仅是查询的字符串变化,而涉及到查询条件的列不变的话,可以传个参数进来
比如 WHERE 1=1 AND xxxxColumn like @xxxxPara
如果你的xxxxColumn也是变化的,就只能做动态的SQL了
fgh0302 2009-06-22
  • 打赏
  • 举报
回复
坐等~~!
TOPGUN79 2009-06-22
  • 打赏
  • 举报
回复
学习中……
fgh0302 2009-06-22
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 lchy110 的回复:]
没主键的 也可以用临时表啊
[/Quote]

朋友 有主键。
from911cs 2009-06-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xiaozhulo 的回复:]
网上自有颜如玉
[/Quote]
加载更多回复(27)

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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