Řešení chyb nedostatku paměti ve službě Azure SQL Database
Platí pro: Azure SQL Database
Můžou se zobrazit chybové zprávy, když databázový stroj SQL nepodařilo přidělit dostatek paměti ke spuštění dotazu. To může být způsobeno různými příčinami, včetně limitů zvoleného cíle služby, agregovanými požadavky na paměť úlohy a požadavky na paměť, které má dotaz. Další informace o limitu prostředků paměti pro azure SQL Database najdete v tématu Správa prostředků ve službě Azure SQL Database.
Poznámka:
Tento článek se zaměřuje na Azure SQL Database. Další informace o řešení potíží s nedostatkem paměti v SQL Serveru najdete v tématu MSSQLSERVER_701.
Vyzkoušejte následující způsoby šetření v reakci na:
- Kód chyby 701 s chybovou zprávou "Pro spuštění tohoto dotazu není dostatek systémové paměti ve fondu zdrojů %ls".
- Kód chyby 802 s chybovou zprávou :V fondu vyrovnávací paměti není k dispozici dostatek paměti.
Zobrazení událostí nedostatku paměti
Pokud dojde k chybám s nedostatkem paměti, zkontrolujte sys.dm_os_out_of_memory_events. Toto zobrazení obsahuje informace o predikované příčině nedostatku paměti určené heuristickým algoritmem a poskytuje konečný stupeň spolehlivosti.
SELECT * FROM sys.dm_os_out_of_memory_events ORDER BY event_time DESC;
Prozkoumání přidělení paměti
Pokud chyby nedostatku paměti přetrvávají ve službě Azure SQL Database, zvažte alespoň dočasné zvýšení cíle na úrovni služby databáze na webu Azure Portal. Pokud chyby nedostatku paměti přetrvávají, pomocí následujících dotazů vyhledejte neobvykle vysoké nároky na paměť dotazů, které by mohly přispět k nedostatečnému stavu paměti. Spusťte následující ukázkové dotazy v databázi, u kterých došlo k chybě (ne v master
databázi logického serveru Azure SQL).
Zobrazení událostí nedostatku paměti pomocí zobrazení dynamické správy
Umožňuje sys.dm_os_out_of_memory_events
viditelnost událostí a příčin událostí nedostatku paměti (OOM) ve službě Azure SQL Database. Rozšířená summarized_oom_snapshot
událost je součástí existující system_health
relace událostí, která zjednodušuje detekci. Další informace najdete v tématu sys.dm_os_out_of_memory_events a blog: Nový způsob řešení chyb nedostatku paměti v databázovém stroji.
Zobrazení úředníků paměti pomocí zobrazení dynamické správy
Začněte rozsáhlým šetřením, pokud k chybě nedostatku paměti došlo nedávno, zobrazením přidělení paměti pro pracovníky paměti. Pracovníci paměti jsou interní pro databázový stroj pro tuto službu Azure SQL Database. Nejvyšší správci paměti z hlediska přidělených stránek můžou mít informace o tom, jaký typ dotazu nebo funkce SQL Serveru využívá nejvíce paměti.
SELECT [type], [name], pages_kb, virtual_memory_committed_kb
FROM sys.dm_os_memory_clerks
WHERE memory_node_id <> 64 -- ignore Dedicated Admin Connection (DAC) node
ORDER BY pages_kb DESC;
GO
SELECT [type], [name], pages_kb, virtual_memory_committed_kb
FROM sys.dm_os_memory_clerks
WHERE memory_node_id <> 64 -- ignore Dedicated Admin Connection (DAC) node
ORDER BY virtual_memory_committed_kb DESC;
- Některé běžné pracovníky paměti, jako je například MEMORYCLERK_SQLQERESERVATIONS, jsou nejlépe vyřešeny identifikací dotazů s velkými přiděleními paměti a zlepšením jejich výkonu s lepším indexováním a laděním indexů.
- I když OBJECTSTORE_LOCK_MANAGER nesouvisí s přidělením paměti, očekává se, že je vysoká, když dotazy deklarují mnoho zámků, například kvůli eskalaci zakázaného zámku nebo velmi velkých transakcí.
- U některých úředníků se očekává nejvyšší využití: MEMORYCLERK_SQLBUFFERPOOL je téměř vždy nejvyšší úředník, zatímco CACHESTORE_COLUMNSTOREOBJECTPOOL bude při použití indexů columnstore vysoké. Očekává se nejvyšší využití těchto úředníků.
Další informace o typech pracovníka paměti najdete v tématu sys.dm_os_memory_clerks.
Zkoumání aktivních dotazů pomocí zobrazení dynamické správy
Ve většině případů není příčinou této chyby dotaz, který selhal.
Následující ukázkový dotaz pro Azure SQL Database vrátí důležité informace o transakcích, které aktuálně uchovávají nebo čekají na udělení paměti. Zaměřte se na nejčastější dotazy určené pro zkoumání a ladění výkonu a vyhodnoťte, jestli se provádějí podle očekávání. Zvažte načasování dotazů na generování sestav náročných na paměť nebo operací údržby.
--Active requests with memory grants
SELECT
--Session data
s.[session_id], s.open_transaction_count
--Memory usage
, r.granted_query_memory, mg.grant_time, mg.requested_memory_kb, mg.granted_memory_kb
, mg.required_memory_kb, mg.used_memory_kb, mg.max_used_memory_kb
--Query
, query_text = t.text, input_buffer = ib.event_info, query_plan_xml = qp.query_plan
, request_row_count = r.row_count, session_row_count = s.row_count
--Session history and status
, s.last_request_start_time, s.last_request_end_time, s.reads, s.writes, s.logical_reads
, session_status = s.[status], request_status = r.status
--Session connection information
, s.host_name, s.program_name, s.login_name, s.client_interface_name, s.is_user_process
FROM sys.dm_exec_sessions s
LEFT OUTER JOIN sys.dm_exec_requests AS r
ON r.[session_id] = s.[session_id]
LEFT OUTER JOIN sys.dm_exec_query_memory_grants AS mg
ON mg.[session_id] = s.[session_id]
OUTER APPLY sys.dm_exec_sql_text (r.[sql_handle]) AS t
OUTER APPLY sys.dm_exec_input_buffer(s.[session_id], NULL) AS ib
OUTER APPLY sys.dm_exec_query_plan (r.[plan_handle]) AS qp
WHERE mg.granted_memory_kb > 0
ORDER BY mg.granted_memory_kb desc, mg.requested_memory_kb desc;
Můžete se rozhodnout použít příkaz KILL k zastavení aktuálně spuštěného dotazu, který se drží nebo čeká na udělení velké paměti. Tento příkaz používejte pečlivě, zejména pokud jsou spuštěny důležité procesy. Další informace naleznete v tématu KILL (Transact-SQL).
Použití úložiště dotazů k prozkoumání využití paměti minulých dotazů
Zatímco předchozí ukázkový dotaz hlásí pouze výsledky živého dotazu, následující dotaz používá úložiště dotazů k vrácení informací o minulém spuštění dotazu. To může být užitečné při zkoumání chyby nedostatku paměti, ke které došlo v minulosti.
Následující ukázkový dotaz pro Azure SQL Database vrací důležité informace o spouštění dotazů zaznamenaných úložištěm dotazů. Zaměřte se na nejčastější dotazy určené pro zkoumání a ladění výkonu a vyhodnoťte, jestli se provádějí podle očekávání. Všimněte si časového filtru qsp.last_execution_time
, abyste omezili výsledky na poslední historii. Klauzuli TOP můžete upravit tak, aby v závislosti na vašem prostředí vytvářela více nebo méně výsledků.
SELECT TOP 10 PERCENT --limit results
a.plan_id, query_id, plan_group_id, query_sql_text
, query_plan = TRY_CAST(query_plan as XML)
, avg_query_max_used_memory
, min_query_max_used_memory
, max_query_max_used_memory
, last_query_max_used_memory
, last_execution_time
, query_count_executions
FROM (
SELECT
qsp.plan_id, qsp.query_id, qsp.plan_group_id, qsp.query_plan, qsqt.query_sql_text
, last_execution_time = MAX(qsp.last_execution_time)
, query_count_executions = SUM(qsrs.count_executions)
, avg_query_max_used_memory = AVG(qsrs.avg_query_max_used_memory)
, min_query_max_used_memory = MIN(qsrs.min_query_max_used_memory)
, max_query_max_used_memory = MAX(qsrs.max_query_max_used_memory)
, last_query_max_used_memory = MAX(qsrs_latest.last_query_max_used_memory) --only from latest result
FROM sys.query_store_plan AS qsp
INNER JOIN sys.query_store_query AS qsq
ON qsp.query_id = qsq.query_id
INNER JOIN sys.query_store_query_text AS qsqt
ON qsq.query_text_id = qsqt.query_text_id
INNER JOIN sys.query_store_runtime_stats AS qsrs
ON qsp.plan_id = qsrs.plan_id
INNER JOIN (SELECT plan_id
, last_query_max_used_memory
, rownum = ROW_NUMBER() OVER (PARTITION BY plan_id ORDER BY last_execution_time DESC)
FROM sys.query_store_runtime_stats qsrs) AS qsrs_latest
ON qsrs_latest.plan_id = qsp.plan_id
AND qsrs_latest.rownum = 1 --use latest last_query_max_used_memory per plan_id
WHERE DATEADD(hour, -24, sysdatetime()) < qsp.last_execution_time --past 24 hours only
AND qsrs_latest.last_query_max_used_memory > 0
GROUP BY qsp.plan_id, qsp.query_id, qsp.plan_group_id, qsp.query_plan, qsqt.query_sql_text
) AS a
ORDER BY max_query_max_used_memory DESC, avg_query_max_used_memory DESC;
Rozšířené události
Kromě předchozích informací může být užitečné zachytit trasování aktivit na serveru a důkladně prozkoumat problém s nedostatkem paměti ve službě Azure SQL Database.
Trasování v SQL Serveru lze zachytit dvěma způsoby; Rozšířené události (XEvents) a trasování profileru Sql Server Profiler je však zastaralá trasovací technologie, která není pro Azure SQL Database podporovaná. Extended Events je novější technologie trasování, která umožňuje všestrannější a menší dopad na pozorovaný systém a jeho rozhraní je integrované do aplikace SQL Server Management Studio (SSMS). Další informace o dotazování rozšířených událostí ve službě Azure SQL Database najdete v tématu Rozšířené události ve službě Azure SQL Database.
Přečtěte si dokument, který vysvětluje, jak používat Průvodce vytvořením nové relace rozšířených událostí v nástroji SSMS. Pro databáze Azure SQL však SSMS poskytuje podsložku Rozšířených událostí v každé databázi v Průzkumník objektů. Pomocí relace rozšířených událostí zachyťte tyto užitečné události a identifikujte dotazy, které je generují:
Chyby kategorií:
error_reported
exchange_spill
hash_spill_details
Provádění kategorií:
excessive_non_grant_memory_used
Paměť kategorií:
query_memory_grant_blocking
query_memory_grant_usage
summarized_oom_snapshot
Zachycení bloků přidělení paměti, přelití paměti nebo nadměrného přidělení paměti může být potenciálním vodítkem pro dotaz, který náhle přebírá více paměti, než v minulosti, a potenciální vysvětlení nově vznikající chyby nedostatku paměti v existující úloze. Rozšířená
summarized_oom_snapshot
událost je součástí existujícísystem_health
relace událostí, která zjednodušuje detekci. Další informace najdete v tématu Blog: Nový způsob řešení chyb nedostatku paměti v databázovém stroji.
Nedostatek paměti OLTP v paměti
Pokud používáte OLTP v paměti, můžete narazit Error code 41805: There is insufficient memory in the resource pool '%ls' to run this operation
. Snižte množství dat v tabulkách optimalizovaných pro paměť a parametrech optimalizovaných pro paměť nebo vertikálně navyšte kapacitu databáze na vyšší cíl služby, aby měla více paměti. Další informace o problémech s nedostatkem paměti u OLTP v paměti SQL Serveru najdete v tématu Řešení problémů s nedostatkem paměti.
Získání podpory služby Azure SQL Database
Pokud chyby nedostatku paměti přetrvávají ve službě Azure SQL Database, vytvořte žádost podpora Azure výběrem možnosti Získat podporu na webu podpory Azure.
Související obsah
- Inteligentní zpracování dotazů v databázích SQL
- Průvodce architekturou zpracování dotazů
- Centrum výkonu pro databázový stroj SQL Serveru a Azure SQL Database
- Řešení potíží s připojením a dalších chyb ve službách Azure SQL Database a Azure SQL Managed Instance
- Řešení přechodných chyb připojení ve službách SQL Database a SQL Managed Instance
- Předvedení inteligentního zpracování dotazů
- Správa prostředků ve službě Azure SQL Database
- Blog: Nový způsob řešení chyb nedostatku paměti v databázovém stroji