Як вирішити RESOURCE_SEMAPHORE та RESOURCE_SEMAPHORE_QUERY_COMPILE типи очікування


13

Ми намагаємося з’ясувати першопричину повільно запущених запитів сервера sql, які потрапляють / отримують дані з однієї бази даних, розміром 300 ГБ, розміщеної на сервері з конфігурацією нижче:

Windows Server 2003 R2, SP2, Enterprise Edition, 16 Гб оперативної пам’яті, 12 процесорних 32-бітних

SQL сервер 2005, SP4, Enterprise Edition, 32 біт.

Ми вже повідомили бізнес про оновлення до 64 біт, яке зайняло б місяць.

Але для поточного питання ми намагаємось зібрати дані, чи зможемо ми вирішити тиск у пам'яті або нарешті дійти висновку щодо збільшення оперативної пам’яті.

Дія завершена: статистика повторної індексації та оновлення є належною для цієї БД.

Як показано нижче, ми помічали тип очікування семафору протягом останніх 5 днів, що працює протягом годин завантаження:

чекань

Мало інформації після запитів нижче: розмір буфера = 137272

SELECT SUM(virtual_memory_committed_kb)
FROM sys.dm_os_memory_clerks
WHERE type='MEMORYCLERK_SQLBUFFERPOOL'

і семафорної пам'яті = 644024 за запитом нижче

 SELECT SUM(total_memory_kb)
FROM sys.dm_exec_query_resource_semaphores

Нижче наведено додаткову інформацію, зібрану з dm_exec_query_resource_semaphoresта sys.dm_exec_query_memory_grantsdmv's

dmvserror

Тож, зверху зібрана інформація та за семафором ресурсів SP_Blitz, здається, проблема.

Чи призначено пам'ять 'target_memory_kb' для ідентифікатора семафору ресурсу занадто низьким, порівняно з 16 ГБ оперативної пам’яті.

Примітка * за аналіз на 8 годин роботи «target_memory_kb» завжди менше 1 ГБ, порівняно з 16 ГБ доступними?

що може бути тут питанням і як вирішити, будь ласка, підкажіть

Дякую


Коментарі не для розширеного обговорення; ця розмова була переміщена до чату . Подальші коментарі поза темою будуть просто видалені.
Пол Білий 9

Відповіді:


25

О, добро, у мене є тут погані новини.

У 32-розрядної ОС SQL Server використовує лише перші 4 Гб пам'яті для таких речей, як робоча область запитів. (І він бореться з ОС за ці 4 Гб - будь-які інші запущені програми також змагатимуться за цю пам'ять.)

4 Гб може здатися дуже багато, але відносно легко написати запит, на який потрібно кілька ГБ пам’яті для запуску. Коли достатньо запитів вимагає достатньої кількості пам'яті, SQL Server кидає RESOURCE_SEMAPHORE чекає, оскільки запити не можуть отримати достатньо пам'яті для запуску. RESOURCE_SEMAPHORE_QUERY_COMPILE означає, що вони навіть не можуть отримати достатньо пам'яті для складання плану виконання - і так, це дуже погано.

То як це виправити?

  • Перехід на 64-бітну ОС (операційна система все одно не підтримує)
  • Переключіться на 64-бітну збірку SQL Server
  • Зменшіть вимоги до пам’яті на сервері (не запускайте жодних інших програм у цьому вікні, і це особливо важливо для 32-бітових ящиків, оскільки ми обмежені лише 4 ГБ)
  • Використовуйте більше пам'яті за допомогою перемикачів AWE / PAE - за винятком того, що RESOURCE_SEMAPHORE не працює, оскільки SQL Server може використовувати ці перші 4 ГБ для робочої області запитів
  • Налаштуйте запити та індекси, щоб їм було потрібно менше пам’яті

Я вагаюся навіть сказати, що останній, тому що 32-розрядна проблема настільки погана, і на старих версіях SQL Server це дуже важко. Якщо ви працювали на поточному, ви можете пройти кеш плану та сортувати запити за грант пам’яті, знайти найбільших одержувачів грантів та налаштувати їх. Однак це не варіант для давнього антикваріату.

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