Udostępnij za pomocą


sys.dm_exec_query_memory_grants (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Database w Microsoft Fabric

Zwraca informacje o wszystkich zapytaniach, które złożyły wniosek o przyznanie pamięci lub oczekują na przyznanie lub otrzymały przyznanie pamięci. Zapytania, które nie wymagają przyznania pamięci, nie pojawią się w tym widoku. Na przykład operacje sortowania i hash join mają przyznawanie pamięci do wykonywania zapytań, podczas gdy zapytania bez klauzuli ORDER BY nie mają przydziału pamięci.

W usłudze Azure SQL Database dynamiczne widoki zarządzania nie mogą ujawniać informacji, które mają wpływ na zawieranie bazy danych lub uwidacznianie informacji o innych bazach danych, do których użytkownik ma dostęp. Aby uniknąć ujawniania tych informacji, każdy wiersz zawierający dane nienależące do połączonego tenanta jest filtrowany. Dodatkowo wartości w kolumnach scheduler_id, wait_order, pool_id, group_id są filtrowane; wartość kolumny jest ustawiona na NULL.

Uwaga / Notatka

Aby wywołać to z usługi Azure Synapse Analytics lub Analytics Platform System (PDW), użyj nazwy sys.dm_pdw_nodes_exec_query_memory_grants. Ta składnia nie jest obsługiwana przez bezserwerową pulę SQL w usłudze Azure Synapse Analytics.

Nazwa kolumny Typ danych Opis
session_id smallint ID (SPID) sesji, w której to zapytanie jest wykonywane.
request_id int Identyfikator żądania. Unikatowy w kontekście sesji.
scheduler_id int ID planera, który planuje to zapytanie.
Dop smallint Stopień równoległości tego zapytania.
request_time datetime Data i godzina, kiedy to zapytanie wymagało przyznania pamięci.
grant_time datetime Data i godzina uzyskania pamięci dla tego zapytania. NULL, jeśli pamięć jeszcze nie jest przyznana.
requested_memory_kb bigint Całkowita żądana ilość pamięci w kilobajtach.
granted_memory_kb bigint Całkowita ilość pamięci faktycznie przyznawana w kilobajtach. Może być NULL, jeśli pamięć nie została jeszcze przyznana. W typowej sytuacji ta wartość powinna być taka sama jak requested_memory_kb. Do tworzenia indeksów serwer może umożliwić dodatkową pamięć na żądanie poza początkowo przyznaną pamięcią.
required_memory_kb bigint Minimalna pamięć wymagana do wykonania tego zapytania to kilobajty. requested_memory_kb jest taka sama lub większa niż ta kwota.
used_memory_kb bigint Pamięć fizyczna używana w tym momencie w kilobajtach.
max_used_memory_kb bigint Maksymalna fizyczna pamięć zużyta do tej pory to kilobajty.
query_cost float Szacowany koszt zapytania.
timeout_sec int Czas minął w kilka sekund, zanim to zapytanie zgłosiło żądanie przyznania pamięci.
resource_semaphore_id smallint Nieunikalny identyfikator semaforu zasobu, na którym czeka to zapytanie.

Nuta: Ten identyfikator jest unikalny w wersjach SQL Server starszych niż SQL Server 2008 (10.0.x). Ta zmiana może wpłynąć na wykonywanie zapytań w rozwiązywaniu problemów. Więcej informacji można znaleźć w sekcji "Uwagi" później w tym artykule.
queue_id smallint ID kolejki oczekującej, gdzie to zapytanie czeka na przyznanie pamięci. NULL, jeśli pamięć jest już przyznana.
wait_order int Kolejność oczekiwanych zapytań w obrębie określonego queue_id. Ta wartość może się zmienić dla danego zapytania, jeśli inne zapytania otrzymają przyznanie pamięci lub limit czasu. NULL, jeśli pamięć jest już nadana.
is_next_candidate bit Kandydat na kolejny grant pamięciowy.

1 = Tak

0 = Nie

NULL = Pamięć już jest przyznana.
wait_time_ms bigint Czas oczekiwania w milisekundach. NULL, jeśli pamięć jest już przyznana.
plan_handle varbinary(64) Identyfikator tego planu zapytania. Użyj sys.dm_exec_query_plan do wyodrębnienia faktycznego planu XML.
sql_handle varbinary(64) Identyfikator Transact-SQL tekstu dla tego zapytania. Używaj, sys.dm_exec_sql_text żeby uzyskać faktyczny Transact-SQL tekst.
group_id int ID grupy obciążeń, w której to zapytanie jest wykonywane.
pool_id int ID puli zasobów, do której należy ta grupa obciążeń.
is_small tinyint Gdy ustawiony na 1, oznacza, że ten grant wykorzystuje semafor małego zasobu. Gdy ustawiono na 0, oznacza to, że używany jest semafor regularny.
ideal_memory_kb bigint Rozmiar pamięci w kilobajtach (KB) pozwala pomieścić wszystko w pamięci fizycznej. Opiera się to na szacunku mocy.
pdw_node_id int Identyfikator węzła, w ramach którego znajduje się ta dystrybucja.

Dotyczy do: Azure Synapse Analytics, Analytics Platform System (PDW)
reserved_worker_count bigint Liczba zarezerwowanych wątków roboczych.

Dotyczy do: SQL Server (począwszy od SQL Server 2016 (13.x)) oraz Azure SQL Database
used_worker_count bigint Liczba wątków roboczych używanych w tym momencie.

Dotyczy do: SQL Server (począwszy od SQL Server 2016 (13.x)) oraz Azure SQL Database
max_used_worker_count bigint Maksymalna liczba wątków roboczych użytych do tej pory.

Dotyczy do: SQL Server (począwszy od SQL Server 2016 (13.x)) oraz Azure SQL Database
reserved_node_bitmap bigint Bitmapa węzłów NUMA, gdzie zarezerwowane są wątki robocze .

Dotyczy do: SQL Server (począwszy od SQL Server 2016 (13.x)) oraz Azure SQL Database

Permissions

Na SQL Server wymaga VIEW SERVER STATE to pozwolenia.
W bazie danych Azure SQL wymaga VIEW DATABASE STATE to uprawnień do bazy danych.

Uprawnienia dla programu SQL Server 2022 i nowszych

Wymaga uprawnienia WYŚWIETL STAN WYDAJNOŚCI SERWERA na serwerze.

Uwagi

Zapytania wykorzystujące dynamiczne widoki zarządzania zawierające ORDER BY agregacje mogą zwiększać zużycie pamięci i tym samym przyczyniać się do problemu, który rozwiązują.

Funkcja Resource Governor umożliwia administratorowi bazy danych rozdzielanie zasobów serwera między pule zasobów, maksymalnie do 64 pul. Począwszy od SQL Server 2008 (10.0.x), każda pula zachowuje się jak mała, niezależna instancja serwera i wymaga dwóch semaforów. Liczba wierszy zwracanych może sys.dm_exec_query_resource_semaphores być nawet 20 razy większa niż liczba wierszy zwracanych w SQL Server 2005 (9.x).

Przykłady

Typowy scenariusz debugowania dla czasu zapytania może badać następujące aspekty:

  • Sprawdź ogólny stan pamięci systemowej za pomocą sys.dm_os_memory_clerks, sys.dm_os_sys_info oraz różnych liczników wydajności.

  • Sprawdź rezerwacje pamięci wykonywanej przez zapytania w sys.dm_os_memory_clerks miejscu, gdzie type = 'MEMORYCLERK_SQLQERESERVATIONS'.

  • Sprawdź zapytania czekające1 na granty, używając:sys.dm_exec_query_memory_grants

    --Find all queries waiting in the memory queue  
    SELECT * FROM sys.dm_exec_query_memory_grants WHERE grant_time IS NULL;
    

    1 W tym scenariuszu typ oczekiwania to zazwyczaj RESOURCE_SEMAPHORE. Więcej informacji można znaleźć w sys.dm_os_wait_stats (Transact-SQL).

  • Przeszukuj pamięć podręczną zapytań z przyznawaniami pamięci, używając sys.dm_exec_cached_plans (Transact-SQL) i sys.dm_exec_query_plan (Transact-SQL)

    -- retrieve every query plan from the plan cache  
    USE master;  
    GO  
    SELECT * FROM sys.dm_exec_cached_plans cp CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle);  
    GO  
    
  • Jeśli podejrzewane jest zapytanie o ucieczkę, przejrzyj Showplan w kolumnie query_planz sys.dm_exec_query_plan oraz batch text zapytań z sys.dm_exec_sql_text. Analizuj dalej zapytania wymagające dużo pamięci, które są obecnie wykonywane, używając sys.dm_exec_requests.

    --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;
    GO
    

Zobacz także