У нас є сервер баз даних 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), як я фільтрую, щоб знайти проблемні запити?
Дякую!