Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik: :Azure SQL Database
SQL-adatbázis a Fabricben
Hibaüzenetek jelenhetnek meg, ha az SQL-adatbázismotor nem tudott elegendő memóriát lefoglalni a lekérdezés futtatásához. Ezt különböző okok okozhatják, beleértve a kiválasztott szolgáltatáscél korlátait, a számítási feladatok összesített memóriaigényét és a lekérdezés memóriaigényét.
A Azure SQL Database memóriaerőforrás-korlátját a Forráskezelés a Azure SQL Database című témakörben talál. A Fabric SQL-adatbázis számos funkciót oszt meg a Azure SQL Database. A teljesítményfigyelésről további információt a Afabric SQL-adatbázis teljesítménymonitorozása.
Az SQL Server memóriakiürítési problémáinak elhárításáról további információt a MSSQLSERVER_701 című témakörben talál.
Próbálja ki a következő vizsgálati lehetőségeket a következőkre válaszul:
- "Nincs elegendő rendszermemória a%ls" erőforráskészletben a lekérdezés futtatásához" hibaüzenettel ellátott 701-s hibakód.
- "Nincs elegendő memória a pufferkészletben" hibaüzenettel ellátott 802-s hibakód.
Memóriaen kívüli események megtekintése
Ha memóriahiba lépett fel, tekintse át sys.dm_os_out_of_memory_events. Ez a nézet információkat tartalmaz a memóriahiány előrejelzett okáról, amelyet heurisztikus algoritmus határoz meg, és véges megbízhatósági szinttel rendelkezik.
SELECT * FROM sys.dm_os_out_of_memory_events ORDER BY event_time DESC;
Memóriafoglalás vizsgálata
Ha memóriahiány hibák továbbra is fennállnak az Azure SQL Database-ben, fontolja meg az adatbázis szolgáltatási szint célkitűzésének legalább ideiglenes növelését az Azure portálon.
Ha a memóriahiány továbbra is fennáll, az alábbi lekérdezésekkel szokatlanul magas lekérdezési memóriakihasználtságokat kereshet, amelyek hozzájárulhatnak a memória elégtelen állapotához. Futtassa a következő példa lekérdezéseket az adatbázisban, amely a hibát észlelte (ne a Azure SQL logikai kiszolgáló master adatbázisában).
Memóriaen kívüli események megtekintése a DMV használatával
A sys.dm_os_out_of_memory_events lehetővé teszi az Azure SQL Database memórián kívüli eseményeinek és okainak láthatóságát. A summarized_oom_snapshot kiterjesztett esemény a meglévő system_health esemény munkamenet része az észlelés egyszerűsítése érdekében. További információ: sys.dm_os_out_of_memory_events és blog: Új módszer a memóriakihasználtság hibáinak elhárítására az adatbázismotorban.
Memóriajegyzők megtekintése DMV-k használatával
Kezdje egy széles körű vizsgálattal, ha a memóriakifogyási hiba nemrégiben történt, a memória írnokoknak juttatott memória elosztásának megtekintésével. A memóriajegyzők a Azure SQL Database adatbázismotorjának belső elemei. A lefoglalt lapok tekintetében a legfelső memóriajegyzők informatívak lehetnek arról, hogy a SQL Server milyen típusú lekérdezése vagy funkciója fogyasztja a legtöbb memóriát.
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;
- Egyes gyakori memóriajegyzők, például a MEMORYCLERK_SQLQERESERVATIONS a legjobban úgy oldhatók meg, hogy azonosítják a nagy memóriahasználattal rendelkező lekérdezéseket, és jobb indexeléssel és indexhangolással javítják a teljesítményüket.
- Bár OBJECTSTORE_LOCK_MANAGER nem kapcsolódik a memóriaengedélyhez, várhatóan magas értéket mutat, ha a lekérdezés során számos zárolást használnak, például zárolás eszkalációjának letiltása vagy nagyon nagy tranzakciók miatt.
- Néhány memória kezelő várhatóan a legmagasabb kihasználtságú lesz: a MEMORYCLERK_SQLBUFFERPOOL szinte mindig a legnagyobb kihasználtságot éri el, míg a CACHESTORE_COLUMNSTOREOBJECTPOOL magas lesz, amikor oszlop tároló indexeket használnak. A legnagyobb kihasználtság ezektől a hivatalnokoktól várható.
További információ a memóriajegyzők típusairól: sys.dm_os_memory_clerks.
Aktív lekérdezések vizsgálatához a DMV-k használata
A legtöbb esetben nem a sikertelen lekérdezés okozza ezt a hibát.
Az alábbi Azure SQL Database-minta lekérdezés fontos információkat ad vissza azokról a tranzakciókról, amelyek jelenleg memóriakijuttatásokat tartanak vagy várnak. Megcélozza a vizsgálathoz és a teljesítmény finomhangolásához azonosított legfontosabb lekérdezéseket, és értékelje ki, hogy a lekérdezések a kívánt módon hajtják-e végre őket. Fontolja meg a memóriaigényes jelentéskészítő lekérdezések vagy karbantartási műveletek időzítését.
--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;
Dönthet úgy, hogy a KILL utasítással leállít egy jelenleg futó lekérdezést, amely nagy memória-hozzáférést tart vagy várakozik rá. Ezt az utasítást körültekintően használja, különösen kritikus folyamatok futtatásakor. További információ: KILL (Transact-SQL).
A Query Store használata a korábbi lekérdezési memóriahasználat vizsgálatához
Bár az előző minta lekérdezés csak élő lekérdezési eredményeket jelent, az alábbi lekérdezés a Query Store használatával ad vissza adatokat a korábbi lekérdezések végrehajtásáról. Ez hasznos lehet egy múltban bekövetkezett memóriahiányos hiba vizsgálatában.
Az alábbi Azure SQL Database-minta lekérdezés fontos információkat ad vissza a Query Store által rögzített lekérdezés-végrehajtásokról. Megcélozza a vizsgálathoz és a teljesítmény finomhangolásához azonosított legfontosabb lekérdezéseket, és értékelje ki, hogy a lekérdezések a kívánt módon hajtják-e végre őket. Figyelje meg az időszűrőt, qsp.last_execution_time hogy az eredményeket a legutóbbi előzményekre korlátozza. A TOP záradékot úgy módosíthatja, hogy a környezetétől függően több vagy kevesebb eredményt hozzon létre.
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;
Bővített események
Az előző információkon kívül hasznos lehet a kiszolgálón végzett tevékenységek nyomának rögzítése a memóriahiányos probléma alapos kivizsgálásához az Azure SQL Database esetében.
A nyomkövetések kétféleképpen rögzíthetők a SQL Server; Bővített események (XEvents) és Profiler-nyomkövetések. Azonban a SQL Server Profiler egy elavult nyomkövetési technológia, amelyet az Azure SQL Database nem támogat. Extended Events az újabb nyomkövetési technológia, amely sokoldalúbb és kevésbé befolyásolja a megfigyelt rendszert, és interfésze integrálva van a SQL Server Management Studio (SSMS) szolgáltatásba. A kiterjesztett események Azure SQL Database való lekérdezéséről további információt a Az Azure SQL Database-ben található eseményeket ismertető cikkben talál.
Tekintse meg azt a dokumentumot, amely bemutatja, hogyan használható a Bővített események új munkamenet varázslója az SSMS-ben. Az Azure SQL adatbázisok esetében azonban az SSMS egy Bővített események almappát biztosít a Object Explorer minden adatbázisában. A bővített események munkamenetével rögzítheti ezeket a hasznos eseményeket, és azonosíthatja az őket generáló lekérdezéseket:
Kategóriahibák:
error_reportedexchange_spillhash_spill_details
Végrehajtás kategória szerint:
excessive_non_grant_memory_used
Memóriakategória
query_memory_grant_blockingquery_memory_grant_usage
summarized_oom_snapshotA memóriaengedélyezési blokkok, a memóriaengedélyezési kiömlések vagy a túlzott memóriaengedélyek rögzítése lehetséges nyom lehet egy olyan lekérdezésben, amely hirtelen több memóriát vesz igénybe, mint korábban, és lehetséges magyarázat lehet egy meglévő munkafolyamatban fellépő újabb memóriakimaradásos hiba esetén. A
summarized_oom_snapshotkiterjesztett esemény a meglévősystem_healthesemény munkamenet része az észlelés egyszerűsítése érdekében. További információ : Blog: A memóriakihasználtság hibáinak elhárításának új módja az adatbázismotorban.
Memóriabeli OLTP memóriahiány
Előfordulhat, ha In-Memory OLTP-t használ, Error code 41805: There is insufficient memory in the resource pool '%ls' to run this operation. Csökkentse a memóriaoptimalizált táblákban és a memóriaoptimalizált táblaértékekkel rendelkező paraméterekben lévő adatok mennyiségét, vagy skálázza fel az adatbázist egy magasabb szolgáltatási célkitűzésre, hogy több memóriával rendelkezzen. Az SQL Server In-Memory OLTP memóriakihasználtságával kapcsolatos problémákról további információt a Memória-problémák elhárítása című témakörben talál.
Azure SQL Database támogatásának lekérése
Ha továbbra is memóriahibák jelentkeznek az Azure SQL Database-ben, küldjön egy támogatási kérelmet az Get Support kiválasztásával az Azure Support webhelyen.
Kapcsolódó tartalom
- intelligens lekérdezésfeldolgozás SQL-adatbázisokban
- lekérdezésfeldolgozási architektúra útmutatója
- Teljesítményközpont a SQL Server adatbázismotorhoz és az Azure SQL Database-hez
- Hibaelhárítás az Azure SQL Database és az Azure SQL Managed Instance csatlakozási problémáival és egyéb hibáival kapcsolatban
- Az SQL Database és az SQL Managed Instance átmeneti csatlakozási hibáinak hibaelhárítása
- Tranzakciónaplóval kapcsolatos hibák elhárítása
- Intelligens lekérdezésfeldolgozási bemutatása
- Forráskezelés az Azure SQL Database
- Blog: A memóriakihasználtság hibáinak elhárításának új módja az adatbázismotorban