SQL查询性能会降低,具体取决于搜索值的顺序

时间:2012-05-15 18:33:42

标签: sql sql-server query-optimization self-join

我有一个双重自连接查询,当交换搜索值时,性能会严重下降。

-- 500,000 i/o & 500ms execution
select
  fooA.ID
  , fooB.ID
from
  foo AS fooA
  INNER JOIN bar AS barA ON fooA.barID = barA.barID
  INNER JOIN foo AS fooB ON fooA.fooID = fooB.fooID -- self join
  INNER JOIN bar AS barB ON fooB.barID = barB.barID
where
  barA.value = 'xyz'
  AND barB.value = '60'

-- 5,000 i/o & 5ms execution
select
  fooA.ID
  , fooB.ID
from
  foo AS fooA
  INNER JOIN bar AS barA ON fooA.barID = barA.barID
  INNER JOIN foo AS fooB ON fooA.fooID = fooB.fooID -- self join
  INNER JOIN bar AS barB ON fooB.barID = barB.barID
where
  barA.value = '60'
  AND barB.value = 'xyz'
  • 值“xyz”在“bar”表中列出150,000次。
  • 值“60”在“条形”表中列出500次。
  • 查询计划是相同的,除了最内层循环返回150,000行或500行,具体取决于首先列出的搜索值。
  • 搜索执行非聚集索引的搜索。
  • 使用FULLSCAN在两个表上更新了统计信息。

为什么SQL查询优化器没有正确识别在两个实例中查询计划的最内部连接应该是行数最少的连接?

1 个答案:

答案 0 :(得分:3)

SQL Server不会在每次执行时重新编译查询。它只执行一次,并针对第一次看到的确切值进行了优化。我猜你有一个不幸的计划缓存。

尝试在最后添加OPTION (RECOMPILE)