Sql server SQL执行计划-估计的计划似乎比实际计划更准确

Sql server SQL执行计划-估计的计划似乎比实际计划更准确,sql-server,performance,optimization,query-optimization,database-performance,Sql Server,Performance,Optimization,Query Optimization,Database Performance,我正在编写一个存储过程,用于获取销售报告的数据。查询如下: INSERT INTO @FirstQuery SELECT t1.*, t2.* FROM t1 LEFT JOIN t2 ON t1.idT1 = t2.idT1 LEFT JOIN t3 ON t3.idT2 = t2.idT2 WHERE t1.nonIndexedField = @parameter1 AND (t2.idT2 IS NULL OR

我正在编写一个存储过程,用于获取销售报告的数据。查询如下:

INSERT INTO @FirstQuery
SELECT t1.*, t2.*
  FROM t1
       LEFT JOIN t2 ON t1.idT1 = t2.idT1
       LEFT JOIN t3 ON t3.idT2 = t2.idT2
 WHERE t1.nonIndexedField = @parameter1
   AND (t2.idT2 IS NULL
          OR
          (@parameter2 = 'XXX' AND t1.indexedField1 = @parameter3)
          OR
          (@parameter2 = 'YYY' AND t3.indexedField1 = @parameter3)
       )
根据这些结果,我再填充第二个表变量:

INSERT INTO @SecondQuery
SELECT u1.*, u2.*
  FROM u1
       INNER JOIN u2 ON u2.idU1 = u1.idU1
 WHERE u1.NONindexedField in (SELECT someField FROM @FirstQuery)
由于QA环境非常缓慢,我观察了执行计划。首先我看了一下估计的计划。它发现SecondQuery花费了很长时间,我意识到u1.NONindexedField没有索引,估计花费了总成本的97%。 但后来我看了一下实际的计划,它说FirstQuery占了总成本的100%。我检查了根据估算计划计算的估算行,在许多地方估算的行很少,而实际计划显示的行数约为100 thouthand(100K)。我认为这是因为缺少索引的字段位于没有那么多行(17K)的表中,但我还是创建了索引。令我惊讶的是,查询时间从500秒缩短到了15秒。 所以,我的问题是。。。为什么执行计划会有如此大的差异,而实际计划又是如何偏离的呢?我知道估算的计划实际上并不意味着“对计划的估算”,而是“具有估算行数的计划”,但这并不能解释差异,当然也不能解释为什么实际计划告诉我,所有成本都是在一个不需要优化的查询上

顺便说一句,我比较了相对时间,第二个查询确实占用了总执行时间的97%左右


谢谢你的阅读

如果实际计划偏离目标,这可能是由于过时的统计数据造成的

您是否尝试过更新查询中表的统计信息

如果统计数据过期,则可能导致执行计划关闭。如果没有更新的统计数据,您的查询可能会非常低效

更新统计信息的语法为:

update statistics tablename;

尝试更新统计数据,看看您是否得到了更准确的执行计划。

谢谢您的回复!我更新了所有相关表格的统计数据,但毫无帮助。实际执行计划没有改变。