Почему ТОП операция в плане выполнения SQL


9

Пройдя некоторое время, я решил опубликовать этот вопрос из-за отсутствия ответа и извиниться, если есть аналогичный вопрос / ответ.

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

Запрос:

SELECT process_id
INTO #temp
FROM revrep_revenue_fact
WHERE process_id = 284 
DROP TABLE #temp

План выполнения сервера А Сервер Б

План выполнения сервера B Сервер B http://s2.postimg.org/z9fjrfv4n/server_B.png

Вы заметите, что сервер B имеет физическую операцию TOP в фактическом плане выполнения, и мы пытаемся выяснить, почему. Оба запроса используют один и тот же индекс в поиске индекса.

Вот некоторые детали сервера A и сервера B

Сервер A и B оба

Windows Server 2008 R2 Стандартный пакет обновления 1

24 ГБ ОЗУ

64-битная операционная система

Версии SQL Server 2012, полученные с помощью ( SELECT SERVERPROPERTY ('ProductVersion') )

Сервер A SQL версия 11.0.3000.0

Сервер B SQL версия 11.0.5058.0

Что мы пробовали

  1. Очистка кэшей процедуры
  2. Восстановление индексов
  3. Обновление статистики
  4. УСТАНАВЛИВАЙТЕ ROWCOUNT 0 с количеством строк и вперед

Почему сервер B имеет ТОП в плане выполнения? В этом простом примере запроса реальных проблем нет, но в более крупном запросе стоимость TOP увеличивается, и мы видим снижение производительности. Мы будем благодарны за любую помощь в устранении неполадок, и мы можем получить любую дополнительную информацию, которая может вам понадобиться.


TOPОператор предполагает ненулевая SET ROWCOUNTранее был выполнен на этой связи. Попробуйте еще раз с выполнением SET ROWCOUNT 0;. Кроме того, опубликованные вами версии SQL не являются версиями SQL 2008 R2. Запустите SELECT SERVERPROPERTY('ProductVersion');на 2 серверах, чтобы получить актуальную версию SQL Server.
Дан Гусман

Я обновил исходный пост версиями sql, используя предоставленный запрос select. Серверы, на которых установлен sql, являются серверами Windows 2008 R2, в то время как серверы sql установлены на 2012. Как ранее предложил другой участник, затем удалил, мы попытались установить ROWCOUNT в 0 без изменений в плане выполнения. Смотрите обновленный вопрос
Артур Егиазарян

Можете ли вы поставить GOпосле строки подсчета строк. Вы также можете опубликовать свойства оператора Top?
Роб Фарли

Роб, добавил GO и свойства из TOP в исходное сообщение
Артур Егиазарян

Ответы:


12

Убедитесь, что уровень совместимости базы данных одинаков на 2 серверах. Я провел быстрый тест на экземпляре SQL Server 2012 и увидел, что введен оператор TOP, если уровень совместимости равен 100 или ниже. Если у вас нет особых причин поступать иначе, лучше всего использовать уровень совместимости 110 (SQL Server 2012) в экземпляре SQL Server 2012.


2

Я считаю, что у вас есть значение для ROWCOUNT. Делать:

SET ROWCOUNT 0

... чтобы выключить его.


1
SET ROWCOUNT 0 не удаляла ТОП из плана исполнения
Артур Егиазарян

1
@ Артур Хотя это не было решением в вашем случае, это может быть причиной поведения для будущих читателей. (Извините, Роб, я позволил себе удалить ваше сообщение, потому что это действительно может быть проблемой для того же симптома.)
Аарон Бертран

Аарон, согласился и спасибо, что вернул его. Не решение для меня, но может быть для других.
Артур Егиазарян
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.