日期:2014-05-18  浏览次数:20498 次

如何优化这样的查询,在线等!
select a,b,c,d from A inner join B on A.a=b.a where A.time>='2012-01-01 00:00:00' and A.time<='2012-01-31 23:59:59' 
order by A.time desc


查询出得数据量在10万左右,但不加order by速度很快,加了order by几乎等死,A.time是datetime格式,已经加了索引,还是查询很慢,估计查询出的10万条记录正在排序,order by又不能去除,如何优化?



------解决方案--------------------
很明显,在time上加聚集索引.
不过这样操作之前,你得慎重考虑一下,对time的查询是否足够频繁,如果频繁,那毫不犹豫了.否则不要轻易改变表的聚焦索引,试方式
加上非聚焦索引吧.
------解决方案--------------------
查询结果和排序分开写试试行吗。

或者用视图试试。
------解决方案--------------------
SQL code

--测试一下,有变化没?
select  a ,
        b ,
        c ,
        d
from    A
        inner join b on A.a = b.a
where   A.time between '2012-01-01' and '2012-02-01'
order by A.time desc

------解决方案--------------------
对于经常使用的数据可以建立视图,另外可以对表中常用的字段建立索引,这样可以使查询速度加快。
------解决方案--------------------

Select * From (
select a,b,c,d
from A
inner join B
on A.a=b.a
where A.time>='2012-01-01 00:00:00' and A.time<='2012-01-31 23:59:59'
) as aa
order by aa.time desc

先将结果做成一个结果集,然后再进行排序。

看数据量,总表与结果表大小差别越大,速度差别也就越大。


------解决方案--------------------
从描述上来看主要是排序影响的.

你要按a表的time字段排序,则可以在time字段上面建立一个聚集索引
正好满足你的范围查找且加排序

------解决方案--------------------
1. 你的硬件设施太落后了 才这点数据就这样了
2.加time 索引
------解决方案--------------------
两个a字段有无索引?无的话增加下

------解决方案--------------------
两个a字段有无索引,无的话增加下。

------解决方案--------------------
如果2008,把time上的索引删除,然后执行

SQL code
create index IX_a_time on a(time) include(a,b,c,d) --如果这四个字段有些不是A表的,不要这个字段