首页 新闻 会员 周边 捐助

这句sql语句能怎么优化,三十多万记录,查询时间要2秒,肯定有问题?

0
悬赏园豆:15 [已解决问题] 解决于 2016-04-23 17:22

这句sql能怎么优化,三十多万记录,查询时间要2秒,肯定有问题
SELECT * from (SELECT ROW_NUMBER() over(order by ot.IsEnd asc,ot.AddTime desc) as rownum ,em.Id as emId FROM OngoingTask ot ) t
where t.rownum between 120 and 130
其中IsEnd是int类型,0,1,2,3,代表任务状态,IsEnd与AddTime 都添加了索引。

sujiaya的主页 sujiaya | 初学一级 | 园豆:10
提问于:2016-04-23 14:46
< >
分享
最佳答案
0

首先 30w条记录 如果全表查询 就是2秒 这个没有问题(去掉缓存的情况下 因为从硬盘上要读出这么多数据大致要花这么多时间)

其次 如果查询字段是索引 另说

 

查一下 有没有聚集索引

 

然后 如果可以 你的排序索引吧 id也加进去 试试 

sql的查询 优先查询索引 如果返回值包含索引外的 字段那么会根据 当前索引指定的位置 去读相关记录 

收获园豆:12
小眼睛老鼠 | 老鸟四级 |园豆:2731 | 2016-04-23 15:18

执行计划排序占用了94%,IsEnd字段的聚集索引扫描占了6%,去掉IsEnd字段排序,搜索就非常快,这个字段建立索引好像也没啥用

sujiaya | 园豆:10 (初学一级) | 2016-04-23 15:28

@sujiaya: 想起来了 如果数据里面是大量的重复 数据 就没必要建立索引

小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2016-04-23 16:29

@小眼睛老鼠: 恩,是啊,头疼,

sujiaya | 园豆:10 (初学一级) | 2016-04-23 16:37

@sujiaya: 我知道啦,哈,创建联合索引就行啦,谢谢,结贴

sujiaya | 园豆:10 (初学一级) | 2016-04-23 17:21
其他回答(1)
0

建议看一下执行计划

收获园豆:3
dudu | 园豆:31030 (高人七级) | 2016-04-23 15:05

执行计划排序占用了94%,IsEnd字段的聚集索引扫描占了6%,去掉IsEnd字段排序,搜索就非常快,这个字段建立索引好像也没啥用

支持(0) 反对(0) sujiaya | 园豆:10 (初学一级) | 2016-04-23 15:29

@sujiaya: 如果聚集索引建在AddTime字段上,可以大幅降低排序的开销。

支持(0) 反对(0) dudu | 园豆:31030 (高人七级) | 2016-04-23 15:35

@dudu: 恩,我知道,但是IsEnd这个排序很必要,就是要把未完成的任务排在前面,有什么好的解决思路吗

支持(0) 反对(0) sujiaya | 园豆:10 (初学一级) | 2016-04-23 15:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册