按出现次数最多排序....!

编程有钱人了 2014-01-23 12:27:56
数据库:MSSQL 2005
有个操作日志表(记录操作)数据量800万,已建索引

select top 100 s_word,count(1) as c from SearchLog where s1=1 and s3=0 group by s_word order by c desc
--s1 是条件


s_word 为操作日志关键字,有重复

这个语句有时候查询能到30秒,有时候10秒以内,这个语句还能优化吗?或者说还有别的好办法吗?

如果加上查询条件
where .... and (DATEDIFF(day, S_Date, GETDATE()) >= 0) and ....

表达式在where 后面我知道是影响效率的,怎么判断时间范围比较好呢?
...全文
332 34 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
s_word,s1,s3 这三个做一个组合非聚集索引
LongRui888 2014-01-23
  • 打赏
  • 举报
回复
引用 8 楼 wangjun8868 的回复:
[quote=引用 5 楼 yupeigu 的回复:] 要是加上时间范围的条件,建议这么写: select top 100 s_word,count(1) as c from SearchLog where s1=1 and s3=0 and S_Date >=GETDATE() group by s_word order by c desc
(DATEDIFF(day, S_Date, GETDATE()) <= 365) 这个怎么变换写法?[/quote] S_Date<= dateadd(day,-365,GETDATE())
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
S_Date<= dateadd(dd,-365,getdate())这样试试
LongRui888 2014-01-23
  • 打赏
  • 举报
回复
引用 7 楼 wangjun8868 的回复:
[quote=引用 3 楼 DBA_Huangzj 的回复:] 另外用ctrl+M 再执行select top 100 s_word,count(1) as c from SearchLog where s1=1 and s3=0 group by s_word order by c desc 把那个图(执行计划)贴出来
[/quote] 从执行计划上来看,是采用了聚集索引扫描,也就是表扫描,占了55%的开销,这个是导致慢的原因。 可以按照s1 和s3中涉及的字段,以及s_word字段,建立索引,就能加快速度。
编程有钱人了 2014-01-23
  • 打赏
  • 举报
回复
引用 5 楼 yupeigu 的回复:
要是加上时间范围的条件,建议这么写: select top 100 s_word,count(1) as c from SearchLog where s1=1 and s3=0 and S_Date >=GETDATE() group by s_word order by c desc
(DATEDIFF(day, S_Date, GETDATE()) <= 365) 这个怎么变换写法?
编程有钱人了 2014-01-23
  • 打赏
  • 举报
回复
引用 3 楼 DBA_Huangzj 的回复:
另外用ctrl+M 再执行select top 100 s_word,count(1) as c from SearchLog where s1=1 and s3=0 group by s_word order by c desc
把那个图(执行计划)贴出来

LongRui888 2014-01-23
  • 打赏
  • 举报
回复
有qq不,方便的话,帮你看一下
LongRui888 2014-01-23
  • 打赏
  • 举报
回复
要是加上时间范围的条件,建议这么写: select top 100 s_word,count(1) as c from SearchLog where s1=1 and s3=0 and S_Date >=GETDATE() group by s_word order by c desc
LongRui888 2014-01-23
  • 打赏
  • 举报
回复
不要对s_date字段用函数,这样会导致用不上索引的。
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
另外用ctrl+M 再执行select top 100 s_word,count(1) as c from SearchLog where s1=1 and s3=0 group by s_word order by c desc 把那个图(执行计划)贴出来
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
聚集索引建在哪个列上的?
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
不要在列上使用标量函数,另外你那个查询不稳定有可能是因为别的操作影响了,也有可能搜索的范围中,数据分布严重不均匀所导致的
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
结贴就好
编程有钱人了 2014-01-23
  • 打赏
  • 举报
回复
引用 31 楼 DBA_Huangzj 的回复:
按照我经验,你这个查询大概3秒左右是极限了
嗯,到现在已经很不错了,之前都是30秒 现在快了很多
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
加了之后效果如何?另外如果你的区间是比较稳定的话,可以考虑预存结果,直接查询,不用再运算,不过这个前提条件太多了,不通用
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
按照我经验,你这个查询大概3秒左右是极限了
编程有钱人了 2014-01-23
  • 打赏
  • 举报
回复
知道怎么解决了,毕竟这个表数据量大,而且有并发写入的情况,考虑到这个情况,3-10秒还是可以接受的 谢了2位大神,结贴
编程有钱人了 2014-01-23
  • 打赏
  • 举报
回复
引用 25 楼 yupeigu 的回复:
[quote=引用 24 楼 wangjun8868 的回复:]
我觉得索引要重新建,因为表也 update statistics 了


你建立索引的语句,能贴出来看看不[/quote]
编程有钱人了 2014-01-23
  • 打赏
  • 举报
回复
引用 25 楼 yupeigu 的回复:
[quote=引用 24 楼 wangjun8868 的回复:] 我觉得索引要重新建,因为表也 update statistics 了
你建立索引的语句,能贴出来看看不[/quote] 我使用界面操作 没用语句过会截图给你看
發糞塗牆 2014-01-23
  • 打赏
  • 举报
回复
我发现你加了s5进去查询,你把刚才3列的索引再加上这列试试
加载更多回复(14)

27,582

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧