日期:2014-05-18  浏览次数:20408 次

上亿记录级,索引及效率问题
表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.其它?

------解决方案--------------------
C 建立聚集索引,
a,b,d建立联合索引

------解决方案--------------------
上亿条记录?
可考虑:
ID:主键.
对a,b,c,e分别建立索引,d为字符串型,建立索引没有必要.
------解决方案--------------------
试一下,为a,b建立一个联合索引,为c,d建立另一联合聚集索引
------解决方案--------------------
取值范围不大,建索引的意义也不大

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


------解决方案--------------------
个人意见:
为a,b建立一个联合索引,为c,d,e建立另一联合索引
这样AB 用于条件,cde用于分组
具体还要看执行计划逐步调整,这个只是猜测

------解决方案--------------------
建议做分区,或者历史表.
------解决方案--------------------
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是可以重复的。