对于老生常谈的分页问题:

bwangel 2009-04-17 03:57:19
由于历史的原因,公司的数据库表都没有一个流水号作主键.
但是都有一个或多个字段作主键.数据量很大.现在要分页显示.
我想出了一个类似"边界ID"的分页方法.但是由于没有流水号,我的这个"边界ID"只有通过多个主键字段的字符串拼接来完成.而这就无法利用索引,导致分页速度很慢.

如果碰巧遇到只有一个主键的表,那么速度还是很快.因为不需要进行主键的拼接,有效利用了主索引.


那么我问下,在不建流水号ID的情况下,多主键表分页速度慢的问题是否无解,在sql2000下.
...全文
145 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
-晴天 2009-04-21
  • 打赏
  • 举报
回复
主键的目的,是为了创建参照完整性.由主键创建了主索引,可以加快速度,如果主索引是聚集索引,速度会更快.
从这样的基本面去考虑:你的表中的主键是干什么用的?有没有创建为聚集索引?它对你的分页有没有用?
而后,再去考虑采用什么样的方式分页,是否要另外创建自增列之类的.
其实,创建一个自增列很简单,只要alter一下表就行了,创建了自增列后,创建一个索引,用它来查找就可能方便一些.
long_0662 2009-04-21
  • 打赏
  • 举报
回复
usher_gml 2009-04-20
  • 打赏
  • 举报
回复
帮顶
sdhdy 2009-04-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 bwangel 的帖子:]
由于历史的原因,公司的数据库表都没有一个流水号作主键.
但是都有一个或多个字段作主键.数据量很大.现在要分页显示.
我想出了一个类似"边界ID"的分页方法.但是由于没有流水号,我的这个"边界ID"只有通过多个主键字段的字符串拼接来完成.而这就无法利用索引,导致分页速度很慢.

如果碰巧遇到只有一个主键的表,那么速度还是很快.因为不需要进行主键的拼接,有效利用了主索引.


那么我问下,在不建…
[/Quote]

表大概有多少条记录?
你的多主键是聚集索引吧?不管用?
实在不行的话,只能用流水ID.
bwangel 2009-04-20
  • 打赏
  • 举报
回复
看不懂
  • 打赏
  • 举报
回复
关注
lg_tz 2009-04-17
  • 打赏
  • 举报
回复
帮你顶
凌枫 2009-04-17
  • 打赏
  • 举报
回复
学习
taoistong 2009-04-17
  • 打赏
  • 举报
回复


declare @first binary(6)
select @first = first from sysindexes where id = object_id('fms_transport') and indid in(0,1)
declare @PageNum int
select @PageNum = convert(int, substring(@first,4,1) + substring(@first,3,1) +
substring(@first,2,1) + substring(@first,1,1) )
declare @FileNum int
select @FileNum = convert(int, substring(@first,6,1) + substring(@first,5,1))
select @FileNum, @PageNum

--执行DBCC Page
declare @sql varchar(1000)
select @sql = 'dbcc page (''' + db_name() + ''', ' + convert(varchar(10),@FileNum) + ', ' +
convert(varchar(10),@PageNum) + ', 1)'
select @sql
dbcc traceon(3604)
exec (@sql)


dbcc page ('eProcessDBTest', 1, 23496, 1)



给你研究一下这个

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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