Производительность SQL-запроса снижается в зависимости от порядка значений поиска

У меня есть двойной запрос с самообъединением, производительность которого сильно снижается при перестановке значений поиска.

-- 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» указано 150 000 раз в таблице «bar».
  • Значение «60» указано 500 раз в таблице «bar».
  • Планы запроса такие же, за исключением того, что самый внутренний цикл возвращает либо 150 000 строк, либо 500 строк в зависимости от того, какое значение поиска указано первым.
  • Поиск выполняется по некластеризованным индексам.
  • Статистика была обновлена ​​в обеих таблицах с помощью FULLSCAN.

Почему оптимизатор запросов SQL неправильно определяет, что в обоих случаях самым внутренним соединением плана запроса должно быть соединение с наименьшим количеством строк?

5
задан Josh Bond 15 May 2012 в 18:33
поделиться