Megosztás a következőn keresztül:


Memóriahiánnyal összefüggő hibák elhárítása az Azure SQL Database-zel

A következőre vonatkozik: Azure SQL Database

Hibaüzenetek jelenhetnek meg, ha az SQL-adatbázismotor nem tudott elegendő memóriát lefoglalni a lekérdezés futtatásához. Ennek sokféle oka lehet, például a választott szolgáltatásiszint-célkitűzés, a számítási feladatok összesített memóriaigénye, vagy a lekérdezés memóriaigényei. Az Azure SQL Database-ekhez tartozó memóriaerőforrás-korlátról az Azure SQL Database erőforrás-kezelésével kapcsolatos további információkért lásd : Erőforrás-kezelés az Azure SQL Database-ben.

Feljegyzés

Ez a cikk az Azure SQL Database-ről szól. Az SQL Server memóriakihasználtságával kapcsolatos problémák elhárításáról további információt az MSSQL Standard kiadásRVER_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:

  • A(z) "%ls" erőforráskészletben nincs elegendő rendszermemória 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óriahiány miatti hibákat tapasztal, tekintse át a sys.dm_os_out_of_memory_events dokumentációját. 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óriakihasználtság nemrégiben történt, a memória memória-elosztásának megtekintésével a memória írnokok számára. 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_SQLQEREStandard kiadás RVATIONS, a legjobb megoldás a nagy memóriahasználattal rendelkező lekérdezések azonosítása és teljesítményük javítása jobb indexeléssel és indexhangolással.
  • Bár OBJECTSTORE_LOCK_MANAGER nem kapcsolódik a memóriahasználathoz, várhatóan magas lesz, ha a lekérdezések számos zárolást igényelnek, például letiltott zárolás eszkalációja vagy nagyon nagy tranzakciók miatt.
  • Néhány írnok várhatóan a legmagasabb kihasználtságú: MEMORYCLERK_SQLBUFFERPOOL szinte mindig a felső jegyző, míg CACHESTORE_COLUMNSTOREOBJECTPOOL magas lesz, ha oszlopcentrikus indexeket használ. 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.

DMV-k használata aktív lekérdezések vizsgálatához

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ítja a nagy memóriakiadásra várakozó vagy várakozó lekérdezéseket. 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 a múltban előforduló memóriakihasználtság 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_reported
    • exchange_spill
    • hash_spill_details
  • Kategória végrehajtása:

    • excessive_non_grant_memory_used
  • Kategóriamemória:

    • query_memory_grant_blocking
    • query_memory_grant_usage
  • summarized_oom_snapshot

    A memóriakiadási blokkok, a memóriakiömlések vagy a túlzott memóriakivételek rögzítése potenciális nyom lehet egy olyan lekérdezésben, amely hirtelen több memóriát vesz fel, mint korábban, és lehetséges magyarázat arra, hogy egy meglévő számítási feladat memóriahibája kiugróan magas. 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ó: Blog: A memóriakihasználtság hibáinak elhárításának új módja az adatbázismotorban.

Memóriabeli OLTP memóriakihasználtság

Előfordulhat, Error code 41805: There is insufficient memory in the resource pool '%ls' to run this operation hogy memóriabeli OLTP-t használ. 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 memóriabeli OLTP-vel kapcsolatos 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 az Azure SQL Database-ben nem áll fenn memóriahiba, küldjön egy Azure-támogatás kérést az Azure támogatási webhelyén a Támogatás kérése gombra kattintva.