Чому ТОП працює в плані виконання SQL


9

Дещо шукаючи, я вирішив поставити це питання через відсутність пошуку відповіді та вибачтесь, якщо є подібне питання / відповідь там.

Під час запуску запиту нижче на двох аналогічно налаштованих SQL-серверах ми стикаємося з різними планами виконання, що впливає на продуктивність, і нам потрібна допомога в з'ясуванні причини.

Запит:

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

План виконання сервера A Сервер B

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

Ви помітите, що сервер B має ТОП-фізичну роботу у фактичному плані виконання, і ми намагаємось з’ясувати, чому. Обидва запити використовують один і той же індекс у пошуковій індексі.

Ось деякі деталі сервера A та сервера B

Сервери A і B - це обидва

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

24 Гб оперативної пам’яті

64-розрядна операційна система

Версії SQL Server 2012, отримані за допомогою ( SELECT SERVERPROPERTY ("ProductVersion") )

Сервер SQL версії 11.0.3000.0

Сервер B версії SQL 11.0.5058.0

Що ми спробували

  1. Очищення кеш-процедур
  2. Перебудова індексів
  3. Освіжаюча статистика
  4. Встановити ЗНИЖКУ 0 з рядом і йдіть

Чому сервер B має ТОП у плані виконання? У цьому простому прикладі запиту немає справжніх проблем, але в більшому запиті вартість підвищується для ТОП, і ми бачимо хіт на ефективність. Будь-яка допомога з налагодження цього буде дуже вдячна, і ми можемо отримати будь-яку додаткову інформацію, яка вам може знадобитися, щоб допомогти.


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

Я оновив оригінальну публікацію версіями sql, використовуючи наданий запит вибору. Сервери, на яких встановлено sql, - це сервери Windows 2008 R2, а встановлені сервери sql - 2012. Як раніше запропоновано іншим учасником, а потім видалено, ми спробували встановити ROWCOUNT на 0 без зміни плану виконання. Дивіться оновлене запитання
— Артур Єгіазарян

Чи можете ви поставити GOпісля рядка рядків. Чи можете ви також розміщувати властивості Top оператора?
— Роб Фарлі

Роб, додав GO та властивості від TOP до оригінальної публікації
— Артур Єгіязарян

Відповіді:


12

Переконайтеся, що рівень сумісності баз даних однаковий на двох серверах. Я провів швидкий тест на екземплярі SQL Server 2012 і бачу, чи вводиться оператор TOP, якщо рівень сумісності становить 100 або нижче. Якщо у вас немає конкретної причини зробити інше, найкраще використовувати рівень сумісності 110 (SQL Server 2012) на екземплярі SQL Server 2012.


2

Я вважаю, що у вас є значення ROWCOUNT. Зробіть:

SET ROWCOUNT 0

... щоб вимкнути його.


1
SET ROWCOUNT 0 не вилучив ТОП з плану страти
— Артур Єгіазарян

1
@Arthur Хоча це не було рішенням у вашому випадку, це може стати причиною поведінки майбутніх читачів. (Вибачте, Роб, я взяв на себе сміливо відміняти вашу посаду, оскільки це справді може бути проблемою для того ж симптому.)
— Аарон Бертран

Аарон, погодився і вдячний за те, що повернув його назад. Не рішення для мене, але може бути для інших.
— Артур Єгіазарян
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.