Rozwiązywanie problemów z błędami braku pamięci w usłudze Azure SQL Database i bazie danych SQL Fabric
Dotyczy: Baza danych SQL Usługi Azure SQL Database w sieci szkieletowej
Mogą pojawić się komunikaty o błędach, gdy aparat bazy danych SQL nie może przydzielić wystarczającej ilości pamięci do uruchomienia zapytania. Może to być spowodowane różnymi przyczynami, takimi jak limity wybranego celu usługi, zapotrzebowanie na pamięć zagregowanych obciążeń oraz zapotrzebowanie na pamięć zapytania.
Aby uzyskać więcej informacji na temat limitu zasobów pamięci dla usługi Azure SQL Database, zobacz Zarządzanie zasobami w usłudze Azure SQL Database. Usługa Fabric SQL Database udostępnia wiele funkcji w usłudze Azure SQL Database, aby uzyskać więcej informacji na temat monitorowania wydajności, zobacz Monitorowanie wydajności bazy danych SQL w sieci szkieletowej.
Aby uzyskać więcej informacji na temat rozwiązywania problemów z brakiem pamięci w programie SQL Server, zobacz MSSQLSERVER_701.
Spróbuj wykonać następujące kroki badania w odpowiedzi na:
- Kod błędu 701 z komunikatem o błędzie "Brak pamięci systemowej w puli zasobów %ls" do uruchomienia tego zapytania.
- Kod błędu 802 z komunikatem o błędzie "Brak pamięci dostępnej w puli".
Wyświetlanie zdarzeń braku pamięci
Jeśli wystąpią błędy dotyczące braku pamięci, przejrzyj widok sys.dm_os_out_of_memory_events. Ten widok zawiera informacje na temat przewidywanej przyczyny braku pamięci, określonych przez algorytm heurystyczny i jest dostarczany ze skończonym stopniem ufności.
SELECT * FROM sys.dm_os_out_of_memory_events ORDER BY event_time DESC;
Badanie alokacji pamięci
Jeśli błędy braku pamięci będą nadal występować w usłudze Azure SQL Database, rozważ przynajmniej tymczasowe zwiększenie celu poziomu usługi bazy danych w witrynie Azure Portal.
Jeśli błędy braku pamięci będą nadal występować, użyj następujących zapytań, aby wyszukać niezwykle wysokie przydziały pamięci zapytań, które mogą przyczynić się do niewystarczającego stanu pamięci. Uruchom następujące przykładowe zapytania w bazie danych, które napotkały błąd (nie w master
bazie danych serwera logicznego Azure SQL).
Wyświetlanie zdarzeń braku pamięci za pomocą dynamicznego widoku zarządzania
Funkcja sys.dm_os_out_of_memory_events
umożliwia widoczność zdarzeń i przyczyn braku pamięci (OOM) w usłudze Azure SQL Database. Zdarzenie summarized_oom_snapshot
rozszerzone jest częścią istniejącej system_health
sesji zdarzeń, aby uprościć wykrywanie. Aby uzyskać więcej informacji, zobacz sys.dm_os_out_of_memory_events i Blog: nowy sposób rozwiązywania problemów z błędami braku pamięci w a aparatu bazy danych.
Wyświetlanie pamięci za pomocą widoków DMV
Zacznij od szerokiego badania, jeśli ostatnio wystąpił błąd braku pamięci, wyświetlając alokację pamięci do urzędników pamięci. pamięci są wewnętrzne dla aparatu bazy danych dla tej usługi Azure SQL Database. Najważniejsze pamięci pod względem przydzielonych stron mogą być informacyjne dla typu zapytania lub funkcji programu SQL Server zużywa najwięcej pamięci.
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;
- Niektóre typowe urzędy obsługi pamięci, takie jak MEMORYCLERK_SQLQERESERVATIONS, najlepiej rozwiązać, identyfikując zapytania z dużymi przydziałami pamięci i poprawiając ich wydajność dzięki lepszym indeksowaniu i dostrajaniu indeksów.
- Chociaż OBJECTSTORE_LOCK_MANAGER nie ma związku z udzielaniem pamięci, oczekuje się, że jest wysokie, gdy zapytania zgłaszają wiele blokad, na przykład z powodu wyłączonej eskalacji blokady lub bardzo dużych transakcji.
- Oczekuje się, że niektórzy urzędnicy będą najwyższym wykorzystaniem: MEMORYCLERK_SQLBUFFERPOOL jest prawie zawsze najwyższym urzędnikem, podczas gdy CACHESTORE_COLUMNSTOREOBJECTPOOL będą wysokie, gdy są używane indeksy magazynu kolumn. Oczekuje się najwyższego wykorzystania przez tych urzędników.
Aby uzyskać więcej informacji na temat typów urzędników pamięci, zobacz sys.dm_os_memory_clerks.
Używanie widoków DMV do badania aktywnych zapytań
W większości przypadków zapytanie, które zakończyło się niepowodzeniem, nie jest przyczyną tego błędu.
Poniższe przykładowe zapytanie dla usługi Azure SQL Database zwraca ważne informacje dotyczące transakcji, które są obecnie w posiadaniu lub oczekujących na dotacje na pamięć. Określ najważniejsze zapytania zidentyfikowane na potrzeby badania i dostrajania wydajności oraz oceń, czy są wykonywane zgodnie z oczekiwaniami. Rozważ czas wykonywania zapytań raportowania intensywnie korzystających z pamięci lub operacji konserwacji.
--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;
Możesz użyć instrukcji KILL, aby zatrzymać aktualnie wykonywane zapytanie, które jest wstrzymujące lub oczekujące na przyznanie dużej ilości pamięci. Użyj tej instrukcji ostrożnie, szczególnie w przypadku uruchamiania procesów krytycznych. Aby uzyskać więcej informacji, zobacz KILL (Transact-SQL).
Korzystanie z magazynu zapytań w celu zbadania wcześniejszego użycia pamięci zapytań
Chociaż poprzednie przykładowe zapytanie raportuje tylko wyniki zapytań na żywo, następujące zapytanie używa magazynu zapytań do zwracania informacji dotyczących poprzedniego wykonywania zapytania. Może to być przydatne podczas badania błędu braku pamięci, który wystąpił w przeszłości.
Poniższe przykładowe zapytanie dla usługi Azure SQL Database zwraca ważne informacje dotyczące wykonań zapytań zarejestrowanych przez magazyn zapytań. Określ najważniejsze zapytania zidentyfikowane na potrzeby badania i dostrajania wydajności oraz oceń, czy są wykonywane zgodnie z oczekiwaniami. Zanotuj filtr czasu, qsp.last_execution_time
aby ograniczyć wyniki do najnowszej historii. Możesz dostosować klauzulę TOP, aby wygenerować więcej lub mniej wyników w zależności od środowiska.
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;
Zdarzenia rozszerzone
Oprócz poprzednich informacji pomocne może być przechwycenie śladu działań na serwerze w celu dokładnego zbadania problemu z brakiem pamięci w usłudze Azure SQL Database.
Istnieją dwa sposoby przechwytywania śledzenia w SQL Server; Zdarzenia rozszerzone (XEvents) i Śledzenie profilera. Jednak program SQL Server Profiler jest przestarzałą technologią śledzenia, która nie jest obsługiwana w przypadku usługi Azure SQL Database. Zdarzenia rozszerzone to nowsza technologia śledzenia, która umożliwia bardziej wszechstronność i mniejszy wpływ na obserwowany system, a jego interfejs jest zintegrowany z programem SQL Server Management Studio (SSMS). Aby uzyskać więcej informacji na temat wykonywania zapytań dotyczących zdarzeń rozszerzonych w usłudze Azure SQL Database, zobacz Zdarzenia rozszerzone w usłudze Azure SQL Database.
Zapoznaj się z dokumentem, w ramach którego wyjaśniono, jak używać Kreatora nowych sesji zdarzeń rozszerzonych w programie SSMS. Jednak w przypadku baz danych Azure SQL Database program SSMS udostępnia podfolder zdarzeń rozszerzonych w każdej bazie danych w Eksplorator obiektów. Użyj sesji zdarzeń rozszerzonych, aby przechwycić te przydatne zdarzenia i zidentyfikować zapytania generujące je:
Błędy kategorii:
error_reported
exchange_spill
hash_spill_details
Wykonanie kategorii:
excessive_non_grant_memory_used
Pamięć kategorii:
query_memory_grant_blocking
query_memory_grant_usage
summarized_oom_snapshot
Przechwytywanie bloków przydziału pamięci, rozlanie przydziału pamięci lub nadmierne przydziały pamięci może być potencjalną wskazówką dla zapytania, które nagle zajęło więcej pamięci niż w przeszłości, oraz potencjalne wyjaśnienie wystąpienia błędu pamięci w istniejącym obciążeniu. Zdarzenie
summarized_oom_snapshot
rozszerzone jest częścią istniejącejsystem_health
sesji zdarzeń, aby uprościć wykrywanie. Aby uzyskać więcej informacji, zobacz Blog: nowy sposób rozwiązywania problemów z błędami braku pamięci w a aparatze bazy danych.
Brak pamięci olTP w pamięci
W przypadku korzystania z funkcji OLTP w pamięci może wystąpić Error code 41805: There is insufficient memory in the resource pool '%ls' to run this operation
błąd OLTP. Zmniejsz ilość danych w tabelach zoptymalizowanych pod kątem pamięci i zoptymalizowanych pod kątem pamięci parametrów tabel lub przeprowadź skalowanie bazy danych w górę do wyższego celu usługi, aby mieć więcej pamięci. Aby uzyskać więcej informacji na temat problemów z brakiem pamięci z funkcją OLTP programu SQL Server w pamięci, zobacz Rozwiązywanie problemów z brakiem pamięci.
Uzyskiwanie pomocy technicznej usługi Azure SQL Database
Jeśli błędy braku pamięci będą nadal występować w usłudze Azure SQL Database, prześlij żądanie pomoc techniczna platformy Azure, wybierając pozycję Uzyskaj pomoc techniczną w witrynie pomocy technicznej platformy Azure.
Powiązana zawartość
- Inteligentne przetwarzanie zapytań w bazach danych SQL
- Przewodnik po architekturze przetwarzania zapytań
- Centrum wydajności dla aparatu bazy danych programu SQL Server i usługi Azure SQL Database
- Rozwiązywanie problemów z łącznością i usuwanie innych błędów w usługach Microsoft Azure SQL Database i Azure SQL Managed Instance
- Rozwiązywanie problemów z przejściowymi błędami połączenia w usługach SQL Database i SQL Managed Instance
- Demonstrowanie inteligentnego przetwarzania zapytań
- Zarządzanie zasobami w usłudze Azure SQL Database
- Blog: Nowy sposób rozwiązywania problemów z błędami braku pamięci w aucie bazy danych