优化下SQL

w290601645 2012-10-30 09:36:20

--数据量在130W左右

select projectid,username,completestate,count(1) as amount from projectlink201209 where starttime between
'2012-10-29 00:00:00' and '2012-10-29 23:59:59' and len(username)>0 and len(username)<14 and
isnull(completestate,'') in ('C','S','Q') group by projectid,completestate,username
...全文
157 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2012-10-30
  • 打赏
  • 举报
回复
如果是08 的话,在completestate上还能加一个filter index(有些译成过滤索引,有些说成筛选索引)
發糞塗牆 2012-10-30
  • 打赏
  • 举报
回复
1、starttime加聚集索引。
2、projectid、username、completestate加一个联合非聚集索引
3、更新表的统计信息
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
加完索引 速度还是比较可观的
[/Quote]

你可以在completestate 字段加索引 我刚刚整了个例子 结果执行计划显示有索引查找这一步 证明还是走了索引的 哈哈
max20120614 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
SQL code

--数据量在130W左右

select projectid,username,completestate,count(1) as amount from projectlink201209 where starttime between
'2012-10-29 00:00:00' and '2012-10-29 23:59:59' and len(username)>0……
[/Quote]

最后的条件没有必要判断 isnull,就像2楼那样。completestate 用 in 的话 估计也不会走索引,但这个应该还好吧 不会太慢啊,都在一个表里都没有连接查询。
w290601645 2012-10-30
  • 打赏
  • 举报
回复

加完索引 速度还是比较可观的
zy891013 2012-10-30
  • 打赏
  • 举报
回复
好东西,学习下
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:

SQL code
SELECT projectid,
username,
completestate,
Count(1) AS amount
FROM projectlink201209
WHERE starttime BETWEEN '2012-10-29 00:00:00'
……


给completestate加索引会走……
[/Quote]

应该是不会走 你可以试试
w290601645 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

SQL code
SELECT projectid,
username,
completestate,
Count(1) AS amount
FROM projectlink201209
WHERE starttime BETWEEN '2012-10-29 00:00:00'
……
[/Quote]

给completestate加索引会走索引吗?
以学习为目的 2012-10-30
  • 打赏
  • 举报
回复
SELECT   projectid,
username,
completestate,
Count(1) AS amount
FROM projectlink201209
WHERE starttime BETWEEN '2012-10-29 00:00:00'
AND '2012-10-29 23:59:59'
AND Len(username) > 0
AND Len(username) < 14
AND completestate IN ('C',
'S',
'Q')
GROUP BY projectid,
completestate,
username


给starttime 、completestate加索引
汤姆克鲁斯 2012-10-30
  • 打赏
  • 举报
回复
username 这个字段感觉应该是 not null
那么语句能修改的地方

AND username <>''
AND LEN(username) < 14
AND completestate IN ('C', 'S', 'Q')
--修改的原则就是尽量不要再where 条件上面使用函数
使用了函数,这些条件就不可SARG了

然后就是补上缺失的索引
  • 打赏
  • 举报
回复
starttime 字段加索引试试 username completestate字段加了索引应该也不会走索引

xuam 2012-10-30
  • 打赏
  • 举报
回复
select projectid,username,completestate,count(1) as amount from projectlink201209 where starttime between 
'2012-10-29 00:00:00' and '2012-10-29 23:59:59' and len(username)>0 and len(username)<14 and completestate in ('C','S','Q') group by projectid,completestate,username


xuam 2012-10-30
  • 打赏
  • 举报
回复
查询条件建索引.

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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