我需要在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'
答案 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)提示。