Sql server 固定值和表之间的查询性能差异
以下查询在不到1秒的时间内返回结果:Sql server 固定值和表之间的查询性能差异,sql-server,query-optimization,Sql Server,Query Optimization,以下查询在不到1秒的时间内返回结果: SELECT DISTINCT IndicatorID FROM dbo.tblData WHERE tblData.RevisionID in (1) 以下查询生成相同的结果,但至少需要5秒钟才能返回: DECLARE @Revisions AS TABLE ( number INT PRIMARY KEY ) INSERT INTO @Revisions SELECT 1 SELECT DISTINCT IndicatorID FROM db
SELECT DISTINCT IndicatorID
FROM dbo.tblData
WHERE tblData.RevisionID in (1)
以下查询生成相同的结果,但至少需要5秒钟才能返回:
DECLARE @Revisions AS TABLE
(
number INT PRIMARY KEY
)
INSERT INTO @Revisions
SELECT 1
SELECT DISTINCT IndicatorID
FROM dbo.tblData
WHERE tblData.RevisionID in (SELECT number FROM @Revisions)
这是我所看到的情景的一个例子
执行连接
没有任何区别。
使用临时表(#)和创建唯一索引
也没有什么区别
我想问题不在tblData中,因为使用固定值“1”它运行得非常快
执行计划:
更新:
仅包含修订ID索引的执行计划:
有什么想法吗
谢谢大家! 我会检查这些:
你比较过执行计划了吗?@hatchet是的,只是附在问题后面。我还是不明白有什么不同!第一个带有文本的文本相当于
,其中RevisionId=1
。第二个原因是,优化器对表var的假设比对文本的假设要少,因此要复杂得多。这可能会给您一些尝试的机会:您可以使用forceseek
或loop join
提示来获得所需的计划,但如果表变量的行数过多,则提示可能会适得其反。Hi@igorjrr,这是“以最简单的形式保持查询”的另一个示例,如果出现任何问题,请寻找替代方法。如果您在执行计划中查看,有一个针对不同值的哈希匹配(这是有问题的部分),然后连接表,我已经测试了它,这个场景在探测输入很大时发生,对于较小的表,它首先连接,然后再区分行。如果您被迫使用table variable或temp table,请查看上面的martin smith注释。它的类型相同,int。在RevisionID上创建了一个索引,第一个查询(固定值)仍然运行得非常快,但第二个查询仍然需要5秒钟以上。您可以附加新的执行计划吗?@IIan Done!看起来是相同的执行计划,但改用新索引。仍然需要4秒以上的时间执行。