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

分享:查询优化案例一
场景:统计独立用户数,一个不同的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=1
FROM VisitLog110101
group by UserKey
) a


耗时30秒
个人理解,去掉了distinct 就省掉了排序的消耗了。

个人理解不知道对不对,欢迎大家继续讨论





------解决方案--------------------
distinct 的效率是不会高的
------解决方案--------------------
弱弱问一句,为什么楼主的方案二、方案三都快那么多,没弄明白。
------解决方案--------------------
奇怪,为什么不试试:
SQL code
select count(*)
FROM VisitLog110101
group by UserKey

------解决方案--------------------
唉,都没涉及到那么多数据的查询
------解决方案--------------------
如果UserKey上有索引,

直接count(*)应该很快.
------解决方案--------------------
SQL code
select count(*) from (select distinct UserKey FROM VisitLog110101) a

------解决方案--------------------
UserKey字段是否真的唯一, 即没有重复值的?

如果是, 可以把索引修改为唯一索引(unique index),

这样distinct就很快了.