2013-07-04 2 views
1

Недавно мы столкнулись с странные проблемы производительности с SQL Server 2008Weird производительность запросов с использованием 'Макс'

Учитывая эти два запроса (которые эквивалентны)

select max(tfiv_value) from tablefieldintvalue where tfiv_fk_tablefield = 48 

и

select max(tfiv_value) from tablefieldintvalue where tfiv_fk_tablefield = 
(select tbfl_pk from tablefield where tbfl_name = 'Field with pk 48') 

Первый занимает около 20 секунд, а второй - 0.

To cle ар подзапрос

(select tbfl_pk from tablefield where tbfl_name = 'Field with pk 48') 

имеет в качестве результата 48.

Мы видим в плане запроса, что она превращает второй запрос в соединение, но это еще не объясняет мне, почему эта разница в производительности происходит. На мой взгляд, если будет разница, чем первая, она должна быть быстрее.

У нас есть индекс во всех соответствующих полях.

+0

Являются ли эти тайминги согласованными? Или, вы только запустили первый, обратите внимание, что это заняло много времени, а затем запустить второй? –

+0

Они согласованы, первый запрос начинает работать немного быстрее через некоторое время (доходит до 6 секунд), но все еще намного медленнее, чем второй. –

ответ

1

Моя первая мысль, однако, состоит в том, что первый запрос заполнил кеш страницы, а второй просто воспользовался им. Кэширование может иметь большое значение.

Если таймеры настолько различны (и последовательно) для двух запросов, то я бы предположил, что разница связана с использованием сканирования таблицы по сравнению с использованием индекса. Вы можете проверить это, посмотрев планы запросов. Следующий вопрос: «Что бы это вызвало?»

Первый запрос обычно выполняет сканирование индекса. , , если нет много и много строк, где tfiv_fk_tablefield = 48. Если это так, то это может сделать сканирование таблицы вместо сканирования индекса. То есть SQL Server имеет «умный» оптимизатор, учитывающий статистику. И он может выбрать неправильный подход, если статистика устарела.

Второй способ может вызвать сканирование индекса, поскольку он использует тип соединения. В этом случае устаревшая статистика не будет иметь эффекта, и запрос будет правильным.

Это все предположения, конечно. Вы должны посмотреть на планы запросов и, если по-прежнему уместно, включить их в этот или другой вопрос.

+0

Я думаю, что статистика была действительно странной, после снижения индексов она даже начала развиваться быстрее. Теперь с хорошими индексами оба запроса запускаются мгновенно. Не могу сказать, что я понимаю, почему, но спасибо в любом случае! –

Смежные вопросы