2015-04-06 47 views
1

我对SQL有点新,我有(希望)一个简单的问题。加速昂贵的SQL查询

此查询大约需要7分钟在我们的数据库上运行,数百万行为10。

SELECT TOP 100 collectView.tagName, collectView.time, collectView.value 
FROM TIMELINE.dbo.collectView collectView` 
WHERE 
(collectView.tagName='currentGS.volume' and 
collectView.time>getdate()-1) 
ORDER BY collectView.time DESC 

我一直希望select 100中的TOP 100能加快速度,因为它只需要100行,但是没有。

任何人有任何建议吗?

+0

如果不知道更多细节,我们无法真正帮助您。这是一个视图还是一张桌子? (名字指向一个视图),在这种情况下,它可能是很多事情。如果它是一个表,它是否有索引? – Lamak

+0

这是一个视图,使用'TOP 100'是 –

+0

并不一定会花费更少的时间..数据库在执行'ORDER BY'时仍然需要访问所有行,但实际显示所需的时间会更少*查询完成后的结果*。 –

回答

0

正如你在做ORDERcollectView.time限制的结果不会加速,直到SQL没有完成排序。尝试在列上添加索引:

CREATE INDEX time_index ON collectView (time); 

从我的经验,我可以说的是,在你有大的表大多数情况下,你需要对大多数的记录工作,增加指数将提高你的代码情侣几分钟到几秒钟

让我知道,如果这有助于

+0

索引将在VIEW上工作吗? –

+0

我认为它是表 - 你能告诉我们这个视图的定义吗? –

+0

@Orin - 尝试在视图中使用的表上创建索引。请参阅[这个问题](http://stackoverflow.com/q/13944946/2775748) –

1

这是您的查询:

SELECT TOP 100 collectView.tagName, collectView.time, collectView.value 
FROM TIMELINE.dbo.collectView collectView 
WHERE collectView.tagName = 'currentGS.volume' and 
     collectView.time > getdate() - 1 
ORDER BY collectView.time DESC; 

这个查询的最好的指数是覆盖索引collectView(tagName, time, value)。但是,这假定collectView确实是而不是视图

如果它是一个视图,一个选项是创建一个索引视图,描述here(基于表名,我假设你正在使用SQL Server)。或者,您需要加快视图本身。也许解决方案和重新编译视图一样简单,以修复破坏的执行计划。

+0

这是一个视图,我不相信我有权限添加索引 - 除非我只是试图做错了 –