分享:查询优化案例一
场景:统计独立用户数,一个不同的UserKey算一个用户
数据表:VisitLog110101,行数3000万左右
字段:
ID int 主键
URL varchar(500)
UserKey varchar(36) --类似GUID字符串 --有索引
VisitDate Datetime
方案一:
- SQL code
select Count(Distinct UserKey) FROM VisitLog110101耗时近4分
方案二:
- SQL code
SELECT count(distinct HashBytes ('md5',upper(UserKey))) FROM VisitLog110101耗时近30秒
个人理解:看执行计划,好像是HashBytes 优化了hashmatch
方案三:
- SQL code
select UV=Count(UV)from (select UV=1FROM VisitLog110101group by UserKey) a
耗时30秒
个人理解,去掉了distinct 就省掉了排序的消耗了。
个人理解不知道对不对,欢迎大家继续讨论
[解决办法]
distinct 的效率是不会高的
[解决办法]
弱弱问一句,为什么楼主的方案二、方案三都快那么多,没弄明白。
[解决办法]
奇怪,为什么不试试:
- SQL code
select count(*)FROM VisitLog110101group by UserKey
[解决办法]
唉,都没涉及到那么多数据的查询
[解决办法]
如果UserKey上有索引,
直接count(*)应该很快.
[解决办法]
- SQL code
select count(*) from (select distinct UserKey FROM VisitLog110101) a
[解决办法]
UserKey字段是否真的唯一, 即没有重复值的?
如果是, 可以把索引修改为唯一索引(unique index),
这样distinct就很快了.