Sql server 固定值和表之间的查询性能差异

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

以下查询在不到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 dbo.tblData
WHERE tblData.RevisionID in (SELECT number FROM @Revisions)
这是我所看到的情景的一个例子

执行
连接
没有任何区别。 使用临时表(#)和创建
唯一索引
也没有什么区别

我想问题不在tblData中,因为使用固定值“1”它运行得非常快

执行计划:

更新: 仅包含修订ID索引的执行计划:

有什么想法吗

谢谢大家!

我会检查这些:

  • tblData.RevisionID的数据类型是什么。确保它与您的“数字”字段(INT)相同
  • 我假设索引tblData.IX_IndicatorRevision是一个综合指数,第二个字段是修订ID。在RevisionID上创建索引,以避免索引扫描,这是基于执行计划的最严重违规行为

  • 你比较过执行计划了吗?@hatchet是的,只是附在问题后面。我还是不明白有什么不同!第一个带有文本的文本相当于
    ,其中RevisionId=1
    。第二个原因是,优化器对表var的假设比对文本的假设要少,因此要复杂得多。这可能会给您一些尝试的机会:您可以使用
    forceseek
    loop join
    提示来获得所需的计划,但如果表变量的行数过多,则提示可能会适得其反。Hi@igorjrr,这是“以最简单的形式保持查询”的另一个示例,如果出现任何问题,请寻找替代方法。如果您在执行计划中查看,有一个针对不同值的哈希匹配(这是有问题的部分),然后连接表,我已经测试了它,这个场景在探测输入很大时发生,对于较小的表,它首先连接,然后再区分行。如果您被迫使用table variable或temp table,请查看上面的martin smith注释。它的类型相同,int。在RevisionID上创建了一个索引,第一个查询(固定值)仍然运行得非常快,但第二个查询仍然需要5秒钟以上。您可以附加新的执行计划吗?@IIan Done!看起来是相同的执行计划,但改用新索引。仍然需要4秒以上的时间执行。