Dela via


Snabbstart: Utökade händelser

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Förhandsversion av Microsoft Fabric

Extended Events är en enkel funktion för prestandaövervakning som gör det möjligt för användare att samla in data för att övervaka och felsöka problem. Med hjälp av Extended Events kan du se information om de interna åtgärder för databasmotorn som är relevanta för prestandaövervakning och felsökning. Mer information om Utökade händelser finns i Översikt över utökade händelser.

Den här artikeln syftar till att hjälpa SQL-administratörer, tekniker och utvecklare som är nya för Extended Events och som vill börja använda den och se händelsedata på bara några minuter.

Extended Events kallas även XEvents och ibland bara XE.

När du har läst den här artikeln kan du:

  • Se hur du skapar en händelsesession i SQL Server Management Studio (SSMS) med exempel på skärmbilder.
  • Korrelera skärmbilder med motsvarande Transact-SQL-instruktioner.
  • Förstå i detalj termerna och begreppen bakom SSMS-användargränssnittet och XEvents T-SQL-instruktioner.
  • Lär dig hur du testar din evenemangssession.
  • Förstå sessionsresultat, inklusive:
    • Tillgängliga alternativ för resultatlagring
    • Bearbetade kontra råa resultat
    • Verktyg för att visa resultaten på olika sätt och på olika tidsskalor
  • Se hur du kan söka efter och identifiera alla tillgängliga händelser.
  • Förstå relationerna mellan Extended Events-systemvyer.

Tips/Råd

Mer information om utökade händelser i Azure SQL Database, inklusive kodexempel, finns i Extended Events in Azure SQL Database and Azure SQL Managed Instance (Utökade händelser i Azure SQL Database och Azure SQL Managed Instance).

Förutsättningar

För att komma igång måste du:

  • Ladda ned SQL Server Management Studio (SSMS). Vi rekommenderar att du använder en ny version av SSMS med de senaste förbättringarna och korrigeringarna.
  • Kontrollera att ditt konto har CREATE ANY EVENT SESSION (introducerades i SQL Server 2022) eller ALTER ANY EVENT SESSIONserverbehörighet.
  • När du använder SSMS och för att visa sessioner som skapas kräver inloggningen dessutom behörigheten VIEW SERVER PERFORMANCE STATE.
  • För Azure SQL Database, Azure SQL Managed Instance och SQL Database i Fabric lagras extended events-händelsefiler i Azure Storage. Du behöver ett Azure Storage-konto.

Information om säkerhet och behörigheter som rör utökade händelser finns i slutet av den här artikeln i tillägget.

Utökade händelser i SSMS

SSMS tillhandahåller ett fullt fungerande användargränssnitt (UI) för utökade händelser. Många scenarier kan utföras med hjälp av det här användargränssnittet, utan att behöva använda T-SQL- eller dynamiska hanteringsvyer (DMV:er).

I nästa avsnitt kan du se UI-stegen för att skapa en extended events-session och för att se de data som den rapporterar. När du har gått igenom stegen praktiskt eller granskat dem i den här artikeln kan du läsa om de begrepp som ingår i stegen för en djupare förståelse.

Skapa en händelsesession i SSMS

När du skapar en extended events-session meddelar du systemet:

  • Vilka händelser du är intresserad av.
  • Hur du vill att systemet ska rapportera data till dig.

Demonstrationen öppnar dialogrutan Ny session och visar hur du använder dess fyra sidor med namnet:

  • General
  • Evenemang
  • Datalagring
  • Advanced

Texten och skärmbilderna kan skilja sig något åt i din version av SSMS, men bör fortfarande vara relevanta för förklaringen av grundläggande begrepp.

  1. Anslut till en databasmotorinstans. Utökade händelser stöds från och med SQL Server 2014 (12.x), i Azure SQL Database och Azure SQL Managed Instance.

  2. I Object Explorer väljer du Hantering > av utökade händelser. I Azure SQL Database är händelsesessioner databasomfattande, så alternativet Utökade händelser finns under varje databas, inte under Hantering.

  3. Högerklicka på mappen Sessioner och välj Ny session.... Dialogrutan Ny session... är att föredra framför guiden Ny session, även om de två är liknande.

    Tips/Råd

    I de här självstudiestegen går du inte till OK förrän du har gått igenom alla fyra sidorna: Allmänt, Händelser, Datalagring och Avancerat.

  4. Välj sidan Allmänt . Skriv YourSessionsedan , eller vilket namn du vill, i textrutan Sessionsnamn . Välj inte OK ännu, eftersom du fortfarande behöver ange viss information på andra sidor.

  5. Välj sidan Händelser .

  6. I området Händelsebibliotek går du till listrutan och väljer endast Händelsenamn.

    • Skriv sql_statement i textrutan. Detta filtrerar listan så att endast händelser visas med sql_statement i namnet.
    • Rulla och välj händelsen med namnet sql_statement_completed.
    • Välj högerpil > för att flytta händelsen till rutan Valda händelser .
  7. Stanna kvar på sidan Händelser och välj knappen Konfigurera . Då öppnas rutan Händelsekonfigurationsalternativ för de valda händelserna.

    Skärmbild av Ny sessionshändelse > Händelser > Välj bland händelserna i biblioteket. sql_statement_completed har valts. Knappen Konfigurera är nästa åtgärd.

  8. Välj fliken Filter (predikat). Välj sedan den nya filterraden med texten Klicka här om du vill lägga till en sats. I den här självstudien konfigurerar du det här filtret (även kallat predikat) för att samla in alla SELECT instruktioner med en HAVING -sats.

  9. I listrutan Fält väljer du sqlserver.sql_text.

    • För Operator väljer du like_i_sql_unicode_string. Här significa i i operatörens namn skiftlägesokänslig.
    • För Värde skriver du %SELECT%HAVING%. Här är procenttecken (%) jokertecken som står för valfri teckensträng.

    Anmärkning

    I fältets sqlserver tvådelade namn är paketnamnet och sql_text fältnamnet. Händelsen vi valde tidigare, sql_statement_completed, måste finnas i samma paket som det fält vi väljer.

    Skärmbild av fältet Konfigurera > filter (predikat) > för nya sessionshändelser >>.

  10. Välj sidan Datalagring .

  11. I området Mål väljer du den nya raden Måltyp med texten Klicka här för att lägga till ett mål. I den här handledningen skriver vi våra insamlade utökade händelsedata till en händelsefil. Det innebär att händelsedata lagras i en fil som vi kan öppna och visa senare. Från och med SQL Server 2019 (15.x) kan händelsedata också skrivas för att lagras i Azure Storage. För Azure SQL Database, Azure SQL Managed Instance och SQL Database i Fabric lagras händelsefiler alltid i Azure Storage.

    • I listrutan Typ väljer du event_file.
  12. I området Egenskaper skriver du in den fullständiga sökvägen och filnamnet i textrutan Filnamn på servern . Du kan också använda knappen Bläddra . Filnamnstillägget måste vara xel. I vårt exempel använde vi C:\temp\YourSession_Target.xel.

    Skärmbild av nya sessionsdatalagringsmål av typen >>>> event_file.

  13. Välj sidan Avancerat . Som standardkonfiguration bör det här .xel-målet för den utökade händelsesessionen ha minimal eller ingen inverkan på serverns prestanda, men de här inställningarna på sidan Avancerat kan användas för att öka eller minska resurserna och svarstiden.

    Skärmbild av ny avancerad session >.

  14. Välj knappen OK längst ned för att skapa den här händelsesessionen.

  15. Gå tillbaka till SSMS Object Explorer, öppna eller uppdatera mappen Sessions och se den nya noden för den utökade händelsesessionen YourSession . Sessionen har inte startats än. I den här handledningen kommer vi att starta den senare.

Redigera en händelsesession i SSMS

I SSMS Object Explorer kan du redigera händelsesessionen genom att högerklicka på noden och sedan välja Egenskaper. Samma dialogruta för flera sidor visas.

Skapa en händelsesession med T-SQL

I SSMS kan du generera ett T-SQL-skript för att skapa händelsesessionen på följande sätt:

  • Högerklicka på händelsesessionsnoden och välj sedan Skriptsession som > SKAPA till > Urklipp.
  • Klistra in i valfri textredigerare.

Här är den genererade CREATE EVENT SESSION T-SQL-instruktionen för YourSession:

CREATE EVENT SESSION [YourSession]
    ON SERVER -- For SQL Server and Azure SQL Managed Instance
    -- ON DATABASE -- For Azure SQL Database
    ADD EVENT sqlserver.sql_statement_completed
    (
        ACTION(sqlserver.sql_text)
        WHERE
        ( [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text], N'%SELECT%HAVING%')
        )
    )
    ADD TARGET package0.event_file
    (SET filename=N'C:\temp\YourSession_Target.xel');
GO

Anmärkning

I Azure SQL Database använder du ON DATABASE i stället för ON SERVER.

Villkorsstyrd DROP för händelsesessionen

Innan -instruktionen CREATE EVENT SESSION kan du villkorligt köra en DROP EVENT SESSION -instruktion, om det redan finns en session med samma namn. Detta tar bort den befintliga sessionen. Utan detta orsakar försök att skapa en session med samma namn ett fel.

IF EXISTS (SELECT *
      FROM sys.server_event_sessions
      WHERE name = 'YourSession')
BEGIN
    DROP EVENT SESSION YourSession
          ON SERVER;
END
GO

Starta och stoppa händelsesessionen med T-SQL

När du skapar en händelsesession är standardinställningen att den inte börjar köras automatiskt. Du kan starta eller stoppa händelsesessionen när som helst med hjälp av följande ALTER EVENT SESSION T-SQL-instruktion.

ALTER EVENT SESSION [YourSession]
      ON SERVER
    STATE = START; -- STOP;

Du kan välja att konfigurera händelsesessionen så att den startar automatiskt när databasmotorinstansen startas. Se nyckelordet STARTUP STATE = ON i CREATE EVENT SESSION.

SSMS UI erbjuder en motsvarande kryssruta, Starta händelsesessionen vid serverstart, på sidan Allmänt för ny session>.

Testa en händelsesession

Testa händelsesessionen med följande steg:

  1. Högerklicka på händelsesessionsnoden i Object Explorer och välj sedan Starta session.
  2. När du är ansluten till samma server (eller samma databas i Azure SQL Database) där du skapade händelsesessionen kör du följande SELECT...HAVING instruktion ett par gånger. Överväg att ändra värdet i HAVING-satsen vid varje körning och växla mellan 2 och 3. På så sätt kan du se skillnaderna i resultatet.
  3. Högerklicka på sessionsnoden och välj Stoppa session.
  4. Läs nästa underavsnitt om hur du väljer och visar resultatet.
SELECT c.name,
    COUNT(*) AS [Count-Per-Column-Repeated-Name]
FROM sys.syscolumns AS c
INNER JOIN sys.sysobjects AS o
    ON o.id = c.id
WHERE o.type = 'V'
    AND c.name LIKE '%event%'
GROUP BY c.name
HAVING Count(*) >= 3 --2     -- Try both values during session.
ORDER BY c.name;

För fullständighet, här är exempelutdata från föregående SELECT...HAVING.

/* Approximate output, 6 rows, all HAVING Count >= 3:
name                   Count-Per-Column-Repeated-Name
---------------------  ------------------------------
event_group_type       4
event_group_type_desc  4
event_session_address  5
event_session_id       5
is_trigger_event       4
trace_event_id         3
*/

Visa händelsesessionsdata som XML

I ett frågefönster i SSMS kör du följande SELECT instruktion för att se händelsedata som samlas in av sessionen. Varje rad representerar en händelsehändelse. Ändrar CAST(... AS xml) datatypen för kolumnen från nvarchar till xml. På så sätt kan du välja kolumnvärdet för att öppna det i ett nytt fönster för enklare läsning.

Anmärkning

Målet event_file infogar alltid en numerisk del i xel filnamnet. Innan du kan köra följande fråga måste du kopiera det faktiska fullständiga namnet på filen som innehåller den xel här numeriska delen och klistra in den i -instruktionen SELECT . I följande exempel är _0_131085363367310000den numeriska delen .

SELECT object_name,
    file_name,
    file_offset,
    event_data,
    'CLICK_NEXT_CELL_TO_BROWSE_XML RESULTS!' AS [CLICK_NEXT_CELL_TO_BROWSE_XML_RESULTS],
    CAST(event_data AS XML) AS [event_data_XML]
-- TODO: In the SSMS results grid, click this XML cell
FROM sys.fn_xe_file_target_read_file(
    'C:\Temp\YourSession_Target_0_131085363367310000.xel', NULL, NULL, NULL
);

Den här frågan innehåller två sätt att visa det fullständiga resultatet av en viss händelserad:

  • SELECT Kör i SSMS och välj sedan en cell i event_data_XML kolumnen.

  • Kopiera XML-strängen från en cell i event_data kolumnen. Klistra in i valfri textredigerare som Anteckningar och spara filen med tillägget xml. Öppna sedan filen i en webbläsare eller ett redigeringsprogram som kan visa XML-data.

Händelsedata i XML

Härnäst ser vi en del av resultaten, som är i XML-format. Följande XML redigeras för korthet. <data name="row_count"> visar värdet 6, som matchar våra sex resultatrader som visades tidigare. Och vi kan se hela SELECT uttrycket.

<event name="sql_statement_completed" package="sqlserver" timestamp="2016-05-24T04:06:08.997Z">
  <data name="duration">
    <value>111021</value>
  </data>
  <data name="cpu_time">
    <value>109000</value>
  </data>
  <data name="physical_reads">
    <value>0</value>
  </data>
  <data name="last_row_count">
    <value>6</value>
  </data>
  <data name="offset">
    <value>0</value>
  </data>
  <data name="offset_end">
    <value>584</value>
  </data>
  <data name="statement">
    <value>SELECT c.name,
            COUNT(*) AS [Count-Per-Column-Repeated-Name]
        FROM sys.syscolumns AS c
        INNER JOIN sys.sysobjects AS o
            ON o.id = c.id
        WHERE o.type = 'V'
            AND c.name LIKE '%event%'
        GROUP BY c.name
        HAVING Count(*) >= 3 --2     -- Try both values during session.
    ORDER BY c.name;</value>
      </data>
</event>

Visa händelsesessionsdata i SSMS

Det finns flera avancerade funktioner i SSMS-användargränssnittet som du kan använda för att visa data som samlas in av en händelsesession. Mer information finns i Visa händelsedata i SQL Server Management Studio.

Du börjar med snabbmenyalternativ med etiketten Visa måldata och Titta på livedata.

Visa måldata

I SSMS-objektutforskaren kan du högerklicka på målnoden som finns under din händelsesessionsnod, till exempel package0.event_counter. I snabbmenyn väljer du Visa måldata. SSMS visar data.

Visningen uppdateras inte när nya händelser inträffar i en session. Men du kan välja Visa måldata igen.

Titta på livedata

I SSMS-objektutforskaren kan du högerklicka på händelsesessionsnoden. I snabbmenyn väljer du Titta på livedata. SSMS visar inkommande data när de fortsätter att tas emot i realtid.

Termer och begrepp i Extended Events

I följande tabell visas de termer som används för Utökade händelser och beskriver deras betydelser.

Begrepp Description
event session En konstruktion centrerad kring en eller flera händelser, plus stödobjekt som åtgärder är mål. Instruktionen CREATE EVENT SESSION skapar varje händelsesession. Du kan ALTER starta och stoppa en händelsesession när du vill.

En händelsesession kallas ibland bara en session, när kontexten klargör att det innebär händelsesession.
Ytterligare detaljer om händelsesessioner beskrivs i: Extended Events-sessioner.
event En specifik förekomst i systemet som övervakas av en aktiv händelsesession.

Händelsen representerar till exempel sql_statement_completed det ögonblick då en viss T-SQL-instruktion slutförs. Händelsen kan rapportera dess varaktighet och andra data.
target Ett objekt som tar emot utdata från en insamlad händelse. Målenheten visar data till dig.

Exempel är det event_file mål som användes tidigare i den här snabbstarten och det ring_buffer mål som behåller de senaste händelserna i minnet.
Alla typer av mål kan användas för alla händelsesessioner. Mer information finns i Mål för utökade händelser.
action Ett fält som är känt för händelsen. Data från fältet skickas till målet. Åtgärdsfältet är nära relaterat till predikatfiltret.
predicate, eller filtrera Ett datatest i ett händelsefält används så att endast en intressant delmängd av händelsehändelser skickas till målet.

Ett filter kan till exempel bara innehålla de sql_statement_completed händelsehändelser där T-SQL-instruktionen innehöll strängen HAVING.
package En namnkvalificerare kopplad till varje objekt i en uppsättning objekt som kretsar kring en kärna av händelser.

Ett paket kan till exempel ha händelser om T-SQL-text. En händelse kan handla om all T-SQL i en batch. Under tiden handlar en annan smalare händelse om enskilda T-SQL-instruktioner. Dessutom, för vilken T-SQL-instruktion som helst, finns det started events och completed events.
Fält som är lämpliga för händelserna finns också i paketet med händelserna. De flesta mål finns i package0 och används med händelser från många andra paket.

Utökade händelsescenarier och användningsinformation

Det finns många scenarier för att använda Utökade händelser för att övervaka och felsöka databasmotorn och fråga arbetsbelastningar. Följande artiklar innehåller exempel med låsrelaterade scenarier:

Så här identifierar du händelser som är tillgängliga i paket

Följande fråga returnerar en rad för varje tillgänglig händelse vars namn innehåller tre teckensträngen sql. Du kan redigera LIKE satsen för att söka efter olika händelsenamn. Resultatuppsättningen identifierar även paketet som innehåller händelsen.

SELECT -- Find an event you want.
    p.name AS [Package-Name],
    o.object_type,
    o.name AS [Object-Name],
    o.description AS [Object-Descr],
    p.guid AS [Package-Guid]
FROM sys.dm_xe_packages AS p
INNER JOIN sys.dm_xe_objects AS o
    ON p.guid = o.package_guid
WHERE o.object_type = 'event' --'action'  --'target'
    AND p.name LIKE '%'
    AND o.name LIKE '%sql%'
ORDER BY p.name,
    o.object_type,
    o.name;

I följande resultatexempel visas den returnerade raden, som här pivoteras till formatet column name = value. Data kommer från händelsen sql_statement_completed som användes i föregående exempelsteg. Beskrivningen av objektet (en händelse i det här exemplet) fungerar som en dokumentationssträng.

Package-Name = sqlserver
object_type  = event
Object-Name  = sql_statement_completed
Object-Descr = Occurs when a Transact-SQL statement has completed.
Package-Guid = 655FD93F-3364-40D5-B2BA-330F7FFB6491

Hitta händelser med hjälp av SSMS-användargränssnittet

Ett annat alternativ för att hitta händelser efter namn är att använda dialogrutan Händelsebibliotek för ny session >> som visas i en föregående skärmbild. Du kan skriva ett partiellt händelsenamn och hitta alla matchande händelsenamn.

SQL Trace-händelseklasser

En beskrivning av hur du använder Extended Events med SQL Trace-händelseklasser och kolumner finns på: Visa motsvarande händelser för SQL Trace Event-klasser.

Händelsespårning för Windows (ETW)

Beskrivningar av hur du använder Extended Events with Event Tracing for Windows (ETW) finns på:

Systemhändelsesessioner

I SQL Server och Azure SQL Managed Instance skapas flera systemhändelsesessioner som standard och konfigureras för att starta när databasmotorn startas. Precis som de flesta händelsesessioner förbrukar de en liten mängd resurser och påverkar inte arbetsbelastningens prestanda väsentligt. Microsoft rekommenderar att dessa sessioner förblir aktiverade och körs. Hälsosessionerna, särskilt den system_health sessionen, är ofta användbara för övervakning och felsökning.

Du kan se dessa händelsesessioner i SSMS Object Explorer under Hantera > utökade händelsesessioner>. I SQL Server är till exempel dessa systemhändelsesessioner:

  • AlwaysOn_health
  • system_health
  • telemetry_events

PowerShell-provider

Du kan hantera utökade händelser med hjälp av SQL Server PowerShell-providern. Mer information finns i Använda PowerShell-providern för utökade händelser.

Systemvyer

Systemvyerna för Extended Events är:

  • Katalogvyer: för information om händelsesessioner som definieras av CREATE EVENT SESSION.
  • Dynamiska hanteringsvyer (DMV:er): för information om aktiva (startade) händelsesessioner.

SELECT-funktioner och JOIN-funktioner från systemvyerna för Extended Events i SQL Server innehåller information om:

  • Så här sammanfogar du vyerna
  • Flera användbara frågor baserade på dessa vyer
  • Korrelationen mellan:
    • Visa kolumner
    • CREATE EVENT SESSION-satser
    • SSMS-användargränssnittet

Bilaga: Frågor för att hitta behörighetsinnehavare för utökad händelse

De behörigheter som nämns i den här artikeln är:

  • ALTER ANY EVENT SESSION
  • VIEW SERVER STATE
  • CONTROL SERVER

Följande SELECT...UNION ALL instruktion returnerar rader som visar vem som har de behörigheter som krävs för att skapa händelsesessioner och köra frågor mot systemkatalogvyerna för Utökade händelser.

-- Ascertain who has the permissions listed in the ON clause.
-- 'CONTROL SERVER' permission includes all lower permissions like
-- 'ALTER ANY EVENT SESSION' and 'VIEW SERVER STATE'.
SELECT 'Owner-is-Principal' AS [Type-That-Owns-Permission],
    NULL AS [Role-Name],
    prin.name AS [Owner-Name],
    PERM.permission_name COLLATE Latin1_General_CI_AS_KS_WS AS [Permission-Name]
FROM sys.server_permissions AS PERM
INNER JOIN sys.server_principals AS prin
    ON prin.principal_id = PERM.grantee_principal_id
WHERE PERM.permission_name IN (
    'CREATE ANY EVENT SESSION',
    'ALTER ANY EVENT SESSION',
    'VIEW SERVER PERFORMANCE STATE',
    'VIEW SERVER STATE',
    'CONTROL SERVER'
)
UNION ALL
-- Plus check for members of the 'sysadmin' fixed server role,
-- because 'sysadmin' includes the 'CONTROL SERVER' permission.
SELECT 'Owner-is-Role',
    prin.name, -- [Role-Name]
    CAST((IsNull(pri2.name, N'No members')) AS NVARCHAR(128)),
    NULL
FROM sys.server_role_members AS rolm
RIGHT JOIN sys.server_principals AS prin
    ON prin.principal_id = rolm.role_principal_id
LEFT JOIN sys.server_principals AS pri2
    ON rolm.member_principal_id = pri2.principal_id
WHERE prin.name = 'sysadmin';

HAS_PERMS_BY_NAME funktion

Följande SELECT uttalande rapporterar dina behörigheter. Den förlitar sig på den inbyggda funktionen HAS_PERMS_BY_NAME.

Om du har behörighet att tillfälligt personifiera andra inloggningar kan du dessutom avkommentera EXECUTE AS och REVERT instruktioner för att se om andra inloggningar har behörigheten ALTER ANY EVENT SESSION .

--EXECUTE AS LOGIN = 'LoginNameHere';
SELECT HAS_PERMS_BY_NAME(NULL, NULL, 'ALTER ANY EVENT SESSION');
--REVERT;