加速SQL Server查询

时间:2012-11-16 14:20:02

标签: sql sql-server performance tsql

我需要在SQL Server上加快一些查询。

感谢您的帮助。

第一个在实时DB上大约需要30-45秒,第二个需要90秒。

如果您想知道我在医院工作,那么类别名称和我们有一个非常大的数据库

select Status, StatusChoice, Category, VisitID, 
     OrderedProcedureName, OrderDateTime, ServiceDateTime 
from OeOrders 
where Category IN 'RAD' 
    and StatusChoice = 'S'

select Status, StatusChoice, Category, VisitID, 
     OrderedProcedureName, OrderDateTime, ServiceDateTime 
from OeOrders 
where Category IN ('RAD','CT','US','MRI') 
    and StatusChoice = 'S'

3 个答案:

答案 0 :(得分:1)

您可以尝试通过在表上创建索引来提高SELECT性能;它可能会使非查询命令(例如,UPDATE,INSERT,DELETE)的性能有点差,因为SQL也必须更新其索引,但可以随意尝试。

运行此脚本一次,然后再以秒为单位再次检查延迟:

CREATE INDEX iCategoryChoiche ON OeOrders 
(StatusChoice,Category) INCLUDE (Status, StatusChoice, Category, VisitID, OrderedProcedureName, OrderDateTime, ServiceDateTime)

答案 1 :(得分:0)

我可以说在第一个SQL中你可以使用=而不是IN,我相信它会更快。

select Status, StatusChoice, Category, VisitID, OrderedProcedureName, OrderDateTime, ServiceDateTime from OeOrders where Category='RAD' and StatusChoice = 'S'

另外看看这些,它可能会有所帮助: http://hungred.com/useful-information/ways-optimize-sql-queries/

答案 2 :(得分:0)

您可以尝试通过将子查询放在FROM:

中来首先强制执行StatusChoice过滤
select src.*
from (
select Status, StatusChoice, Category, VisitID, 
     OrderedProcedureName, OrderDateTime, ServiceDateTime 
from OeOrders 
where StatusChoice = 'S'
) src
where src.Category IN ('RAD','CT','US','MRI') 

但改进机会相当小 - DBMS可能已经以这种方式执行查询。这个rewerite的推理是,具有多个值的“IN”通常转换为使用“或”谓词进行过滤,这在SQL中相当慢,因此可能更快地返回更小的行集合“或”。

查询非常简单,因此您无需查看执行计划。从执行计划中您将了解哪些索引可以使用重组,以及哪些统计信息应该更新(或者可能是新创建的)。当然,(StatusChoice,Category)上的新索引将有所帮助,如果它还没有出现。

如果你不关心得到一些“脏”的结果,你也可以使用(NOLOCK)提示。