上亿记录级,索引及效率问题
表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是可以重复的。