+ -
当前位置:首页 → 问答吧 → 分享:查询优化案例一

分享:查询优化案例一

时间:2011-12-07

来源:互联网

场景:统计独立用户数,一个不同的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 就省掉了排序的消耗了。

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



作者: Rock_Wu   发布时间: 2011-12-07

该回复于2011-12-07 16:21:50被管理员删除

  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
#2楼 得分:0回复于:2011-12-07 16:05:22

作者: xuam   发布时间: 2011-12-07

该回复于2011-12-07 16:21:53被管理员删除

  • 对我有用[0]
  • 丢个板砖[0]
  • 引用
  • 举报
  • 管理
  • TOP
  • Rock_Wu
  • (东雨肥牛)
  • 等 级:
#4楼 得分:0回复于:2011-12-07 16:15:54
如果改用checksum之类的函数会更快,一般都是10秒内
但是有重复,有点遗憾

作者: szstephenzhou   发布时间: 2011-12-07

distinct 的效率是不会高的

作者: qianjin036a   发布时间: 2011-12-07

弱弱问一句,为什么楼主的方案二、方案三都快那么多,没弄明白。

作者: Rock_Wu   发布时间: 2011-12-07

奇怪,为什么不试试:
SQL code
select count(*)
FROM VisitLog110101
group by UserKey

呢?

作者: fredrickhu   发布时间: 2011-12-07

呵呵,我是说:
SQL code
select count(*) from tb group by id
select @@rowcount

作者: tabno   发布时间: 2011-12-07

呵呵,我是说:
SQL code
select count(*) from tb group by id
select @@rowcount

作者: qianjin036a   发布时间: 2011-12-07

引用 7 楼 qianjin036a 的回复:
奇怪,为什么不试试:

SQL code
select count(*)
FROM VisitLog110101
group by UserKey

呢?

这个很慢的,他需要把值返回回来了,相当于把列表返回来了。

作者: qianjin036a   发布时间: 2011-12-07

唉,都没涉及到那么多数据的查询

作者: qianjin036a   发布时间: 2011-12-07