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 Database 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.
Az Azure SQL Database memóriaerőforrás-korlátját az Azure SQL Database erőforrás-kezelésével foglalkozó cikkben talál. A Fabric SQL Database számos funkciót oszt meg az Azure SQL Database-zel. A teljesítménymonitorozásról további információt a Fabric SQL-adatbázis teljesítménymonitorozásával kapcsolatban talál.
Az SQL Server memóriakihasználtságával kapcsolatos problémák 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 az Azure SQL Database-ben memóriahiba áll fenn, fontolja meg legalább az adatbázis szolgáltatásiszint-célkitűzésének ideiglenes növelését az Azure Portalon.
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 (nem az master Azure SQL logikai kiszolgáló adatbázisában).
Memóriaen kívüli események megtekintése a DMV használatával
Ez sys.dm_os_out_of_memory_events lehetővé teszi az Azure SQL Database-ben a memóriakihasználtság (OOM) 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 az Azure SQL Database adatbázismotorjának belső elemei. A lefoglalt lapok tekintetében a legfontosabb memóriajegyzők informatívak lehetnek arról, hogy az SQL Server milyen típusú lekérdezést vagy funkciót használ fel 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 Azure SQL Database következő minta lekérdezése 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 Lekérdezéstár használata a korábbi lekérdezési memóriahasználat vizsgálatához
Míg az előző minta lekérdezés csak élő lekérdezési eredményeket jelent, a következő lekérdezés a Lekérdezéstár 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 Azure SQL Database következő minta lekérdezése fontos információkat ad vissza a lekérdezéstár á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, hogy alaposan kivizsgálhassa az Azure SQL Database-ben a memóriakihasználtsággal kapcsolatos problémákat.
A nyomkövetések kétféleképpen rögzíthetők az SQL Serveren; Bővített események (XEvents) és Profiler-nyomkövetések. Az SQL Server Profiler azonban elavult nyomkövetési technológia, amely nem támogatott az Azure SQL Database-ben. A Kiterjesztett események az újabb nyomkövetési technológia, amely sokoldalúbb és kevésbé befolyásolja a megfigyelt rendszert, és a felülete integrálva van az SQL Server Management Studióba (SSMS). A kiterjesztett események Azure SQL Database-ben való lekérdezéséről további információt az Azure SQL Database kiterjesztett eseményei című témakörben 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 Kiterjesztett események almappát biztosít az Object Explorerben lévő adatbázisok alatt. 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óriakihasználtság problémáinak megoldása című témakörben talál.
Az Azure SQL Database támogatásának lekérése
Ha nem áll fenn memóriahiba az Azure SQL Database-ben, küldjön egy Azure-támogatási kérést az Azure támogatási webhelyén a Támogatás kérése lehetőség kiválasztásával.
Kapcsolódó tartalom
- intelligens lekérdezésfeldolgozás SQL-adatbázisokban
- lekérdezésfeldolgozási architektúra útmutatója
- Teljesítmény Központ a SQL Server Database Engine és Azure SQL Database részére
- Az Azure SQL Database és a felügyelt Azure SQL-példány csatlakozási problémáinak és egyéb hibáinak elhárítása
- Átmeneti csatlakozási hibák elhárítása az SQL Database-ben és a felügyelt SQL-példányban
- Intelligens lekérdezésfeldolgozási bemutatása
- Erőforrás-kezelés az Azure SQL Database
- Blog: A memóriakihasználtság hibáinak elhárításának új módja az adatbázismotorban