Чому ТОП працює в плані виконання 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.