Пройдя некоторое время, я решил опубликовать этот вопрос из-за отсутствия ответа и извиниться, если есть аналогичный вопрос / ответ.
При выполнении запроса ниже на двух одинаково настроенных серверах 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
Что мы пробовали
Почему сервер B имеет ТОП в плане выполнения? В этом простом примере запроса реальных проблем нет, но в более крупном запросе стоимость TOP увеличивается, и мы видим снижение производительности. Мы будем благодарны за любую помощь в устранении неполадок, и мы можем получить любую дополнительную информацию, которая может вам понадобиться.
источник
TOP
Оператор предполагает ненулеваяSET ROWCOUNT
ранее был выполнен на этой связи. Попробуйте еще раз с выполнениемSET ROWCOUNT 0;
. Кроме того, опубликованные вами версии SQL не являются версиями SQL 2008 R2. ЗапуститеSELECT SERVERPROPERTY('ProductVersion');
на 2 серверах, чтобы получить актуальную версию SQL Server.GO
после строки подсчета строк. Вы также можете опубликовать свойства оператора Top?Ответы:
Убедитесь, что уровень совместимости базы данных одинаков на 2 серверах. Я провел быстрый тест на экземпляре SQL Server 2012 и увидел, что введен оператор TOP, если уровень совместимости равен 100 или ниже. Если у вас нет особых причин поступать иначе, лучше всего использовать уровень совместимости 110 (SQL Server 2012) в экземпляре SQL Server 2012.
источник
Я считаю, что у вас есть значение для ROWCOUNT. Делать:
... чтобы выключить его.
источник