Почему ТОП операция в плане выполнения 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
@ Артур Хотя это не было решением в вашем случае, это может быть причиной поведения для будущих читателей. (Извините, Роб, я позволил себе удалить ваше сообщение, потому что это действительно может быть проблемой для того же симптома.)
Аарон Бертран
Аарон, согласился и спасибо, что вернул его. Не решение для меня, но может быть для других.
Артур Егиазарян