我有一个双重自连接查询,当交换搜索值时,性能会严重下降。
-- 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'
为什么SQL查询优化器没有正确识别在两个实例中查询计划的最内部连接应该是行数最少的连接?
答案 0 :(得分:3)
SQL Server不会在每次执行时重新编译查询。它只执行一次,并针对第一次看到的确切值进行了优化。我猜你有一个不幸的计划缓存。
尝试在最后添加OPTION (RECOMPILE)
。