请教基于Group By 时间分组统计SQL语句优化

[复制链接]
查看11 | 回复8 | 2009-10-9 08:28:00 | 显示全部楼层 |阅读模式
需求是一个大家常见的功能.博客中.对博客的时间索引归档.msn space就有这种功能.为了让热心的朋友了解.我把需求详细讲述一下:
博客中.通常有一个归档.即显示统计用户一年当中每个月份发表的文章数.如果用户那个月没有发表文章,就排除不统计.数据库表结构(USER_BLOG):
BLOG_ID,
USER_ID,
BLOG_NAME,
BLOG_CONTENT,
CREATE_TIME
我写了一条实现的
select count(*) ,to_char(ub.CREATE_TIME,'yyyy-MM') as pubTime from USER_BLOG ub WHEREub.USER_ID='111111'
group by to_char(ub.CREATE_TIME,'yyyy-MM')
order by to_char(pubTime,'yyyy-MM') (这个可加可不加)
结果如下:
COUNT(*)
pubTime
----------------------------------------------
10
2007-10
20
2007-09
用to_char但这个性能较差.发贴上来请大家帮忙优化一下.谢谢
在23万多条记录.执行时间如果我去掉WHERE 子条件接近一秒钟(没加索引).想请教大家有没有更好的SQL写法?
[ 本帖最后由 seron 于 2008-1-18 16:22 编辑 ]
回复

使用道具 举报

千问 | 2009-10-9 08:28:00 | 显示全部楼层
加 order by to_char(ub.CREATE_TIME,'yyyy-MM') 干嘛?
回复

使用道具 举报

千问 | 2009-10-9 08:28:00 | 显示全部楼层
执行计划呢
回复

使用道具 举报

千问 | 2009-10-9 08:28:00 | 显示全部楼层
这个我目前是几十万的数据.执行没加索引的时候.快接近一秒钟.我这个直接是程序调用.呵呵,如楼上eaglelzp所讲order by 是多余的...
回复

使用道具 举报

千问 | 2009-10-9 08:28:00 | 显示全部楼层
我想说的是,有没有比我这个SQL语句更好的写法
回复

使用道具 举报

千问 | 2009-10-9 08:28:00 | 显示全部楼层
原帖由 zhangfengh 于 2008-1-18 15:08 发表
设计里没有年月的字段,那就只能这样取,考虑加一个函数索引,也许能提高性能

如果字段非空,不是函数索引也可以用的
回复

使用道具 举报

千问 | 2009-10-9 08:28:00 | 显示全部楼层
带有user_id=的条件,如果user_id有索引,效率应该不会很低
如果没有这个条件其结果似乎没意义了
sql是否如下:
select count(*),user_id, to_char(ub.CREATE_TIME, 'yyyy-MM') as pubTime
from USER_BLOG ub
group by to_char(ub.CREATE_TIME, 'yyyy-MM'),user_id
对于这样的业务,应该将上面的结果生成表如:
select count(*),user_id, to_char(ub.CREATE_TIME, 'yyyy-MM') as pubTime
from USER_BLOG ub
where create_time > '当前月'
group by to_char(ub.CREATE_TIME, 'yyyy-MM'),user_id
每月月末统计上月的结果插入
而后统计工作就变成了只统计当前月,create_time的索引将过滤掉大部分数据
回复

使用道具 举报

千问 | 2009-10-9 08:28:00 | 显示全部楼层
把count(*) 改为count(0)试试
回复

使用道具 举报

千问 | 2009-10-9 08:28:00 | 显示全部楼层
.如果带Where条件USER_ID.个人针对这个优化的一些准备.一是对User_ID与CREATE_TIME这个字段建索引.
二是增加一个子查询.FROM一个带WHERE User_ID条件的子查询结果.再对它进行count及group by,这样应该能满足需要了.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行