Як простежити SQL-запити, які забивають SQL Server


9

У нас є сервер баз даних SQL Server 2008 (трапляється, він працює під MS Failover Clustering, але я не думаю, що це тут актуально).

Наш додаток працює в режимі глибокого сну для доступу до БД, і оскільки ми нещодавно оновили з версії v3.1 до 3.6, ми часто зазнавали збоїв на SQL Server (кожні 24-48 годин, але іноді і частіше).

Конкретна проблема, про яку йдеться, схоже, пов'язана з пам'яттю. Незадовго до виходу з ладу сервера (а потім автоматично перезапускається диспетчером кластерних відмов), ми отримуємо ці помилки:

Error: 701, Severity: 17, State: 130.
There is insufficient system memory in resource pool 'internal' to run this query.

також випадкові (але регулярні) повідомлення від

Error: 17300, Severity: 16, State: 1. (Params:). The error is printed in terse mode because there was error during formatting. Tracing, ETW, notifications etc are skipped.

Помилка: 17312, тяжкість: 16, стан: 1. (Парами :). Помилка надрукується у короткому режимі, оскільки під час форматування сталася помилка. Відстеження, ETW, сповіщення тощо пропускаються.

Я також отримую деякі помилки на рівні програми, такі як

java.sql.SQLException: A time out occurred while waiting to optimize the query. Rerun the query.

а потім захоплююча та, можливо, повчальна помилка:

The query processor ran out of internal resources and could not produce a query plan. 
This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions. 
Please simplify the query. If you believe you have received this message in error, contact Customer Support Services for more information.

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

Тепер до питання - як я відстежую запити, які викликають цю помилку (і, таким чином, імовірно, всі проблеми)? Схоже, що з моменту нашого сплячого режиму, на SQL Server було запущено величезні запити, і це було порушено. Як це буває, у мене є деякі ідеї щодо того, якими вони можуть бути, але було б добре простежити їх.

Я, звичайно, можу запустити профілер SQL Server, але як тільки це зроблено (і виробиться величезна кількість даних - це зайнята база даних OLTP), як я фільтрую, щоб знайти проблемні запити?

Дякую!


1
Все працює на одному сервері? Значить, чи сервер додатків з Java також працює на сервері баз даних?
swasheck

1
У зв'язку з питанням @ swasheck: Чи є у вас явне значення для максимальної пам'яті SQL Server? Ви виключили тиск зовнішньої пам'яті?
Майк Фаль

Ви спробували подивитися на сліди чорної скриньки? Вони можуть направити вас у правильному напрямку.
datagod

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

Чи використовуєте ви пошук у повному обсязі? Крім того, яка точна збірка no + edition sql-сервера, на якому ви працюєте?
Кін Шах

Відповіді:


5

Виконайте кроки, описані в розділі Як використовувати DBCC MEMORYSTATUSкоманду для контролю за використанням пам'яті на SQL Server . Дія ліків буде залежати від ваших висновків. Ви також можете прочитати, як визначити пляшки пам'яті Microsoft SQL Server, які є більш доступними.

Одне слово обережності: навряд чи ви знайдете винні окремі запити. Відстеження проблем із пам’яттю падінь є більш тонким, ніж це. Майте на увазі, що коли у вас не вистачає ресурсів, а запит видає помилку, що не має пам’яті, цілком можливо, що запит, який видає помилку, є лише жертвою , а не винуватцем.


Дякую - я вже переглянув це, але проблема полягає в тому, що сервер, здається, працює нормально, а потім раптом вибухнув, у нього поступово не вистачає пам'яті. З нічого, що я можу знайти в Інтернеті, також не зрозуміло, що таке помилка "У пулі ресурсів" внутрішнього "недостатньо системної пам'яті для запуску цього запиту." насправді означає - що таке внутрішній пул ресурсів щодо результатів DBEM MEMORYSTATUS?

Це сервер розробки? Якщо так, чи можете ви перейти на режим глибокого сну 3.1, щоб переконатися, що проблема усувається? У вас є дві початкові лінії запиту, і ви повинні спробувати усунути одну з них: або у SQL Server встановлено обмеження пам’яті та їх перевищення, або якась інша частина системи споживає пам'ять, і SQL Server видавлюється. Профілюйте систему на час аварії, щоб визначити, що відбувається.
епоха

0

Здається, ви хочете Extended Eventsконфігурувати, використовуючи події query_memory_grant_xxxxx.

Це найкращий варіант для вас, щоб записати інформацію та збережений SQL Engine розміру, який ви можете читати в будь-який час (ви також можете дивитись живі дані); збережена інформація не буде видалена при перезапуску сервера на відміну від DMVs

Швидкі кроки налаштування ..

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