上亿记录级,索引及效率问题

ysai 2007-10-11 11:22:56
表T,有以下字段
id(PK) a(int) b(datetime) c(int) d(char(32)) e(int)
记录有上亿条

存储过程中有个子查询
select c,sum(e)
from T
where a=@a and b=@b
group by c,d

要提高这个子查询的执行效率,应该如何建索引?
A.不要索引
B.为a,b,c,d分别建索引
C.为a,b,c,d建立一个联合索引
D.为a,b建立一个联合索引,为c,d建立另一联合索引
E.其它?
...全文
201 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ysai 2007-10-15
  • 打赏
  • 举报
回复
select c,sum(e)
from T
where a=@a and b=@b
group by c,d
-------------------
结果集中没有“d”,数据无意义,此处应为笔误:
select c,d,sum(e)
from T
where a=@a and b=@b
group by c,d

=========================
结果集中没有"d"就不能按d分组了? 哪本书上说的?
d列对我来说只是区分唯一用户,我不需要它出现在结果集



select c,d,sum(e) from T where a=@a and b=@b group by c,d
等价于
select c,d,e from T where a=@a and b=@b
==========================
真不知道这两句怎么相等的,group by白写的?


如果不是全局唯一标识符,请不要乱用名词——GUID
======================
正如楼上所说,d是日志文件记录的用户ID,一个用户多条日志难道不行?
GUID只是在生成的时候唯一(MS的API也不能完全保证唯一),但以后怎么用就随便了



现在用的是方案D,效率提高不少,暂时先这样了
Limpire 2007-10-12
  • 打赏
  • 举报
回复
a的取值范围不大,100组以内
b为无时间部分日期值,取值范围也不大
c的取值范围不大,100组以内
d为GUID,取值范围最大,有1,000,000至10,000,000组
----------------------------
GUID?全局唯一标识符?
对全局唯一标识符汇总,是否多次一举?
select c,d,sum(e) from T where a=@a and b=@b group by c,d
等价于
select c,d,e from T where a=@a and b=@b

如果不是全局唯一标识符,请不要乱用名词——GUID。
Limpire 2007-10-12
  • 打赏
  • 举报
回复
select c,sum(e)
from T
where a=@a and b=@b
group by c,d
-------------------
结果集中没有“d”,数据无意义,此处应为笔误:
select c,d,sum(e)
from T
where a=@a and b=@b
group by c,d

选中查询语句 -> 索引优化向导 -> 参考MS的建议。
dobear_0922 2007-10-12
  • 打赏
  • 举报
回复
如果d不是数据据库自动生成的,而是来自另外一个表的主键,出现重复值很正常。
dobear_0922 2007-10-12
  • 打赏
  • 举报
回复
a的取值范围不大,100组以内
b为无时间部分日期值,取值范围也不大
c的取值范围不大,100组以内
d为GUID,取值范围最大,有1,000,000至10,000,000组
----------------------------
GUID?全局唯一标识符?
对全局唯一标识符汇总,是否多次一举?
select c,d,sum(e) from T where a=@a and b=@b group by c,d
等价于
select c,d,e from T where a=@a and b=@b

如果不是全局唯一标识符,请不要乱用名词——GUID。

--------------
GUID是可以重复的。
ysai 2007-10-11
  • 打赏
  • 举报
回复
>>取值范围不大,建索引的意义也不大
好象有道理,那么如果是group by c,d的话,单独为d建立索引与为c,d建立联合索引,哪个效率更高呢
ysai 2007-10-11
  • 打赏
  • 举报
回复
>>C 建立聚集索引,
>>a,b,d建立联合索引

这是什么道理?


>>d为字符串型,建立索引没有必要.
字符型没必要建立索引?


>>试一下,为a,b建立一个联合索引,为c,d建立另一联合聚集索引
因为每天都有百万级数据插入到表中,所以聚集索引是不考虑的
先试试a,b|c,d分别建立联合索引看看吧



另有一问题,while条件中的 between @formvalue and @tovalue 能不能利用索引?
hb_gx 2007-10-11
  • 打赏
  • 举报
回复
取值范围不大,建索引的意义也不大

上亿条数据,取值范围在100组以内,这样也能利用到索引吗?
真正适合建索引的是d

mengmou 2007-10-11
  • 打赏
  • 举报
回复
试一下,为a,b建立一个联合索引,为c,d建立另一联合聚集索引
dawugui 2007-10-11
  • 打赏
  • 举报
回复
上亿条记录?
可考虑:
ID:主键.
对a,b,c,e分别建立索引,d为字符串型,建立索引没有必要.
ysai 2007-10-11
  • 打赏
  • 举报
回复
PS:
a的取值范围不大,100组以内
b为无时间部分日期值,取值范围也不大
c的取值范围不大,100组以内
d为GUID,取值范围最大,有1,000,000至10,000,000组
WangZWang 2007-10-11
  • 打赏
  • 举报
回复
C 建立聚集索引,
a,b,d建立联合索引
lang8134 2007-10-11
  • 打赏
  • 举报
回复
建议做分区,或者历史表.
IAmXirour 2007-10-11
  • 打赏
  • 举报
回复
个人意见:
为a,b建立一个联合索引,为c,d,e建立另一联合索引
这样AB 用于条件,cde用于分组
具体还要看执行计划逐步调整,这个只是猜测
hb_gx 2007-10-11
  • 打赏
  • 举报
回复
LZ 如果要看看索引具体的利用率可以按Ctrl+L看看执行计划,执行计划是很准确的,用事实说话,LZ还是去测试吧,如果我要1亿条资料的表我一定测试一下


27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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