Підказки щодо оптимізації запитів SQL Server 2005/8


13

Я дивлюся на те, щоб навчити команду писати кращі запити на SQL Server, і мені було цікаво, що найкращі підказки для покращення продуктивності.

Наприклад, колись у мене був DBA, який наполягав на тому, що підрахунок (*) буде гіршим, ніж count (1) (я не маю уявлення, чи правильно вона, чи вона все-таки діє щодо останніх оптимізаторів запитів).

Які прості речі я повинен говорити команді намагатися і завжди використовувати чи уникати? Я в ідеалі шукаю речі, які (а) можуть змінити розумно і (b) прямо вперед, 1 - 2 рядки, які слід зазначити.

Відповіді:


13

Настроювання запитів 101

Немає чарівної срібної кулі для налаштування запитів, хоча я можу дати вам підказки та поради. Перше, що потрібно зробити - зрозуміти, що насправді відбувається за лаштунками. Отримайте хорошу внутрішню книгу, як-от третя книга Посібника Гуру.

Погано виконуючі запити, як правило, мають два основні смаки: запити транзакцій, які займають занадто багато часу, і шліфування пакетних завдань (або звітів), які займають занадто довго. Хороший знак запиту, в якому щось не так - це окремий елемент плану запитів, який займає 99% часу.

Трансакційні запити

У більшості випадків неякісний запит трансакцій є однією з кількох речей:

  • Відсутній індекс. Це можна побачити в плані запитів - сканування таблиць великих таблиць на з'єднання, яке повинно бути дуже вибіркове (тобто повернути кілька рядків).

  • Запит не може використовувати індекс. Якщо у пункті "де" є умови АБО, приєднується до обчисленого значення чи іншому елементу запиту, який не може бути sarg-можливо, тоді вам може знадобитися переписати запит. Якщо коротко, sargs - це предикати запитів, які можуть використовувати індекси для усунення рядків. Логічні І, рівність і нерівність (>,> =, <, <= і! =) - все це можливо. АБО традиційно не здатний до саргування. Однак ви часто можете переводити АБО в sarg-здатні предикати, перевертаючи сенс з конструкцій типу "АБО" в "НЕ" (foo і не бар).

  • Неефективні предикати. Наприклад, якщо у вас є where inпосилання на вкладений підзапит, перевірте, чи може він бути переписаний як where existsабо як об'єднання. Це може призвести до більш ефективних планів запитів, і ось інші стандартні переписування ви також можете спробувати. Знову ж таки, довідники Гуру та інші на цю тему є гарною відправною точкою.

Пакетні запити

Пакетні запити є складнішими та мають різні проблеми налаштування. Деякі поради:

  • Індексація. Це може істотно змінитись з тієї ж причини, що і з трансакційними запитами. Часто доброю ознакою відсутнього індексу є довга операція шліфування (99% плану запитів), яка, здається, не перемолола машину.

  • Тимчасові столи. Можливо, вам буде краще розбити запит на кілька запитів, що містять тимчасові таблиці. Більші запити дають оптимізатору більше місця для викрутки, хоча це менше питання, ніж раніше. Зробіть таблиці темп, select intoоскільки ця операція мінімально реєструється (набагато менше активності журналу), що зменшує навантаження вводу / виводу.

    Зауважте, що тимчасові таблиці в tempdb - це та сама структура даних, яку оптимізатор використовує для зберігання проміжних результатів з'єднання, тому за це не передбачено покарання за ефективність. Ви також можете створити індекс (включаючи кластеризовані та охоплюючі індекси) на темп-таблиці, що може покращити ефективність запитів, читаючи його з тих же причин, що вони покращують запити в статичних таблицях.

    Однак не перестарайтеся з тимчасовими таблицями, оскільки вони можуть ускладнити відстеження за запитом. Для менших таблиць у межах збереженої процедури перевіряйте, чи допомагають змінні таблиці. Це структура даних в пам'яті, тому вони можуть стати виграшним показником.

  • Кластеризовані та охоплюють індекси. Вони можуть покращити ефективність запиту, оскільки вони змушують локальність посилання на диску на основі деякого стовпчика групування. Кластерний індекс може істотно змінити ефективність пакетної роботи.

  • Неефективні предикати. Вони можуть спричинити проблеми із заригами та іншими субсептимізаційними аналізами приблизно так само, як і з транзакційними запитами.

  • Сканування таблиці - ваш друг. Всупереч поширеній думці, сканування таблиці не є по суті злом. Як правило, вони є ознакою чогось неправильного в запиті трансакцій, але вони часто є найбільш ефективним способом зробити велику пакетну операцію. Якщо ви робите щось із кількома відсотками рядків у таблиці, сканування таблиці найчастіше є найбільш ефективним способом накрити таблицю.

  • Приєднуються вкладені петлі. Погляньте, що робить оптимізатор з обох сторін з'єднання. Вони можуть бути неефективними, якщо ви є (наприклад, сканування таблиці двох великих таблиць з обох сторін вкладених циклів об'єднання. Подумайте про використання кластерних індексів або order byнамагання змінити операцію на об'єднання злиття або натякнути на просування хеш-з'єднання, якщо одна сторона є досить малий, щоб це зробити.

Блокування

Блокування також може спричинити проблеми з продуктивністю. Якщо ваша система погано спрацьовує під навантаженням, перегляньте лічильники профілів та парфмонів, пов'язані із замками, і перевірте, чи є суттєві суперечки. sp_who2У наборі результатів стовпчик "BlkBy", який показує, чи запит заблокований та що його блокує. Крім того, для усунення проблем із блокуванням можуть бути корисні профілі із подіями 'графік тупикової ситуації' (якщо у вас є запит із блокуванням запитів) та пов’язані із цим запитом події.


1
+1, оскільки це чудова інформація про налаштування продуктивності (мені сподобалося побувати на заняттях Кален. Вона знає, про що йдеться!). Ви можете просто додати інформацію про динамічні представлення даних.
Уейн

3

Найкраща підказка: Використовуйте SQL Server 2008 і запускайте Монітор активності під час запуску тестів Зверніть увагу на запити, які займають найдовше / мають найбільше вводу / виводу тощо. Клацніть правою кнопкою миші ці запити, щоб переглянути запит та / або план виконання.

Далі: навчіться розуміти плани виконання.

Далі: Використовуйте майстра настройки баз даних.

Ці кроки допоможуть вам створити власні "найкращі підказки".


2

Чудова безкоштовна електронна книга від RedGate щодо роботи та розуміння планів виконання SQL Server

http://www.red-gate.com/specials/Grant.htm?utm_content=Grant080623

Shameless затикає, я посилатися на налаштування продуктивності матеріали на моєму блозі по SQL Server Performance .

Після того, як у вас з’явилася можливість переварити частину цього матеріалу, будь ласка, не соромтесь або опублікувати тут, або зв’яжіться зі мною безпосередньо з конкретними питаннями.


1

По-перше, індексація. Багато людей не розуміють, що зовнішні ключі автоматично не отримують індекси. Оскільки вони використовуються в з'єднанні, вони майже завжди повинні мати індекс.

Уважно вивчіть усі курсори, щоб побачити, чи замість них можна замінити набір встановленого коду. Я змінив код, який біг годинами на секунди, роблячи це.

Уникайте запитів. Якщо у вас є їх у коді, замініть їх на приєднання або приєднання до похідних таблиць.

Переконайтесь, що пункт де є вагомим.

Навчіться читати плани виконання.

Переконайтесь, що в офісі є кілька хороших книг про налаштування продуктивності.

Змінні таблиці краще, ніж таблиці темп у деяких випадках, а таблиці тимчасово краще, в інших. Якщо вам потрібно використовувати їх, спробуйте обидві та подивіться, що працює в цьому конкретному випадку.

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