Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
              Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-databas i Förhandsversion av Microsoft Fabric
Den här artikeln förklarar när och hur du använder målen för Extended Events. För varje mål beskrivs följande i artikeln:
- Dess förmåga att samla in och rapportera händelsedata
- Exempel på händelsesessioner med målet
I följande tabell beskrivs tillgängligheten för varje måltyp på olika SQL-plattformar.
| Måltyp | SQL Server | Azure SQL-databas och SQL-databas i Fabric | Hanterad instans i Azure SQL | 
|---|---|---|---|
| händelse_fil | Ja | Ja | Ja | 
| ring_buffer | Ja | Ja | Ja | 
| event_stream | Ja | Ja | Ja | 
| histogram | Ja | Ja | Ja | 
| event_counter | Ja | Ja | Ja | 
| pair_matching | Ja | Nej | Nej | 
| etw_classic_sync_target | Ja | Nej | Nej | 
Om inget annat anges bearbetar målen de data som de tar emot asynkront.
Om du vill använda den här artikeln på bästa sätt bör du:
- Bekanta dig med grunderna i Extended Events enligt beskrivningen i Snabbstart: Utökade händelser.
- Använd en ny version av SQL Server Management Studio (SSMS).
event_file målfil
Målet event_file skriver utdata från händelsesessionen från minnesbuffertar till en diskfil eller till en blob i Azure Storage.
- Du anger parametern - filenamei- ADD TARGET-satsen. Filnamnstillägget måste vara- xel.
- Det filnamn du väljer används av systemet som ett prefix som ett datum-tidsbaserat numeriskt värde läggs till i, följt av - xeltillägget.
- Du kan också ange parametern - MAX_FILE_SIZE. Den definierar den maximala storleken i megabyte (MB) som filen kan växa till innan en ny fil skapas.
- Du kan också ange alternativet - MAX_ROLLOVER_FILESför att välja det maximala antalet filer som ska behållas i filsystemet utöver den aktuella filen. Standardvärdet är- UNLIMITED. När- MAX_ROLLOVER_FILESutvärderas tas de äldre filerna bort om antalet filer överskrider- MAX_ROLLOVER_FILESinställningen.
Viktigt!
Beroende på vilka händelser som läggs till i en session kan filerna som skapas av event_file målet innehålla känsliga data. Granska filsystemet noggrant och dela behörigheter för katalogen och enskilda .xel filer, inklusive ärvd åtkomst, för att undvika onödig läsåtkomst. Följ principen om lägsta behörighet. Undvik långvariga händelsesessioner om de kan samla in känsliga data för att minska risken för oavsiktlig insamling av känsliga data.
Anmärkning
Azure SQL Database och Azure SQL Managed Instance stöder endast blobar i Azure Storage som värdet för parametern filename . Ett event_file kodexempel för Azure SQL Database, SQL Database i Fabric eller Azure SQL Managed Instance finns i Skapa en händelsesession med ett event_file mål i Azure Storage.
Skapa en händelsesession med händelsefil som mål i det lokala filsystemet
En genomgång för att skapa en händelsesession med hjälp av en event_file med lokal fillagring, med SSMS eller T-SQL, finns i Snabbstart: Utökade händelser.
Skapa en händelsesession med målet event_file i Azure Storage
En detaljerad beskrivning av hur du skapar ett lagringskonto i Azure Storage finns i Skapa ett lagringskonto. Du kan skapa ett lagringskonto med hjälp av Azure-portalen, PowerShell, Azure SQL, en ARM-mall eller en Bicep-mall. Använd ett konto som:
- Är ett Standard general-purpose v2konto.
- Använder Hotblobåtkomstlagret.
- Om du använder SQL Server i Azure Virtual Machine (Virtuell Azure-dator) bör lagringskontot finnas i samma Azure-region som din virtuella Azure-dator.
- Det hierarkiska namnområdet är inte aktiverat.
Skapa sedan en container i det här lagringskontot med hjälp av Azure-portalen. Du kan också skapa en container med PowerShell eller använda Azure CLI.
Observera namnen på lagringskontot och containern som du skapade. Du använder dem i följande steg.
För att läsa och skriva händelsedata kräver databasmotorn specifik åtkomst. Du beviljar den här åtkomsten på olika sätt beroende på val av autentiseringstyp: hanterad identitet eller hemlig autentisering med en SAS-token (signatur för delad åtkomst).
För att autentisera till Azure Storage kräver databasmotorn en serveromfattande autentiseringsuppgift eller databasomfattande autentiseringsuppgifter, som anger vilken typ av autentisering som ska användas och tillhandahåller en hemlighet för hemlig autentisering. För att skapa den här autentiseringsuppgiften krävs databasbehörigheten CONTROL .
För SQL Server och Azure SQL Managed Instance krävs den här behörigheten master i databasen. Som standard innehas behörigheten av medlemmarna i databasrollen db_owner i och av medlemmarna i masterserverrollen sysadmin på instansen. För Azure SQL Database och SQL Database i Fabric innehas den här behörigheten av databasägaren (dbo), av medlemmarna i databasrollen db_owner och av administratören för den logiska servern.
När en autentiseringsuppgift har skapats kräver de återstående stegen för att skapa en händelsesession inte behörigheten CONTROL . Se Behörigheter för de specifika behörigheter som behövs.
Bevilja åtkomst med hjälp av hanterad identitet
Om du använder hanterad identitet med Microsoft Entra-autentisering tilldelar du RBAC-rollen Storage Blob Data Contributor för containern till den hanterade identitet som används av databasmotorn. Mer information finns i följande baserat på SQL-plattformen:
- Den hanterade identiteten för Azure SQL Database-logiska servern.
- Den hanterade identiteten för den hanterade Azure SQL-instansen.
- Den hanterade identiteten för den virtuella Azure-dator som är värd för din SQL Server-instans. Mer information finns i Så här fungerar hanterade identiteter för Azure-resurser med virtuella Azure-datorer.
- Den hanterade identiteten för den Arc-aktiverade SQL Server-instansen.
När RBAC-rolltilldelningen är på plats använder du följande steg:
- Skapa en autentiseringsuppgift med T-SQL. - Innan du kör följande T-SQL-batch gör du följande ändring: - I alla tre förekomsterna av https://<storage-account-name>.blob.core.windows.net/<container-name>ersätter du<storage-account-name>med namnet på ditt lagringskonto och ersätter<container-name>med namnet på containern. Kontrollera att det inte finns något avslutande snedstreck i slutet av URL:en.
 - Skapa en autentiseringsuppgift med serveromfattning: (Gäller för SQL Server, Azure SQL Managed Instance) - Med hjälp av ett klientverktyg som SSMS öppnar du ett nytt frågefönster, ansluter till - masterdatabasen på den instans där du vill skapa händelsesessionen och klistrar in följande T-SQL-batch.- /* The name of the credential must match the URL of the blob container. */ IF EXISTS (SELECT 1 FROM sys.credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* When using managed identity, the credential does not contain a secret */ CREATE CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'MANAGED IDENTITY';- Skapa ett databasomfattande autentisering: (Gäller för Azure SQL Database, Azure SQL Managed Instance, SQL-databas i Fabric) - Med hjälp av ett klientverktyg som SSMS öppnar du ett nytt frågefönster, ansluter till användardatabasen där du skapar händelsesessionen och klistrar in följande T-SQL-batch. Kontrollera att du är ansluten till din användardatabas och inte till - masterdatabasen.- /* The name of the credential must match the URL of the blob container. */ IF EXISTS (SELECT 1 FROM sys.database_credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* When using managed identity, the credential does not contain a secret */ CREATE DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'MANAGED IDENTITY';
- I alla tre förekomsterna av 
- Följ sedan stegen för att skapa en händelsesession i SSMS med event_file mål i Azure Storage. 
Bevilja åtkomst med en SAS-token (signatur för delad åtkomst)
Om du använder hemlig autentisering skapar du en SAS-token (signatur för delad åtkomst) för containern. Om du vill använda den här autentiseringstypen måste alternativet Tillåt åtkomst till lagringskontonyckel vara aktiverat för lagringskontot. Mer information finns i Förhindra auktorisering av delad nyckel för ett Azure Storage-konto.
- I Azure-portalen navigerar du till lagringskontot och containern som du skapade. Välj containern och gå till Inställningar > Delade åtkomsttoken. - SAS-token måste uppfylla följande krav: - 
              Behörigheter inställda på Read,Write,Delete,List.
- Starttiden och förfallotiden måste omfatta händelsesessionens livslängd. DEN SAS-token som du skapar fungerar bara inom det här tidsintervallet.
- För Azure SQL Database, Azure SQL Managed Instance och SQL Database i Fabric får SAS-token inte ha några IP-adressbegränsningar.
 - Välj knappen Generera SAS-token och URL . SAS-token finns i rutan Blob SAS-token . Du kan kopiera den för att använda i nästa steg. - Viktigt! - SAS-token ger läs- och skrivåtkomst till den här containern. Behandla det som du skulle behandla ett lösenord eller någon annan hemlighet. 
- 
              Behörigheter inställda på 
- Skapa en autentiseringsuppgift för att lagra SAS-token med T-SQL. - Innan du kör följande T-SQL-batch gör du följande ändringar: - Om du skapar en autentiseringsuppgift med serveromfattning och använder instruktionen - CREATE MASTER KEY, ersätt- <password>med ett starkt lösenord som skyddar huvudnyckeln. Mer information finns i CREATE MASTER KEY.
- I alla tre förekomsterna av - https://<storage-account-name>.blob.core.windows.net/<container-name>ersätter du- <storage-account-name>med namnet på ditt lagringskonto och ersätter- <container-name>med namnet på containern.
- I - - SECRETsatsen ersätter du- <sas-token>med den SAS-token som du kopierade i föregående steg.
 - Skapa en autentiseringsuppgift med serveromfattning: (Gäller för SQL Server, Azure SQL Managed Instance) - Med hjälp av ett klientverktyg som SSMS öppnar du ett nytt frågefönster, ansluter det till - masterdatabasen på den instans där du skapar händelsesessionen och klistrar in följande T-SQL-batch.- /* Create a master key to protect the secret of the credential */ IF NOT EXISTS (SELECT 1 FROM sys.symmetric_keys WHERE name = '##MS_DatabaseMasterKey##') CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>' /* The name of the credential must match the URL of the blob container. */; IF EXISTS (SELECT 1 FROM sys.credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* The secret is the SAS token for the container. */ CREATE CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<sas-token>';- Skapa en databasomfattande inloggningsuppgift: (Gäller för Azure SQL Database, Azure SQL Managed Instance, SQL-databas i Microsoft Fabric) - Med hjälp av ett klientverktyg som SSMS öppnar du ett nytt frågefönster, ansluter till databasen där du skapar händelsesessionen och klistrar in följande T-SQL-batch. Kontrollera att du är ansluten till din användardatabas och inte till - masterdatabasen.- /* The name of the credential must match the URL of the blob container. */ IF EXISTS (SELECT 1 FROM sys.database_credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* The secret is the SAS token for the container. */ CREATE DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<sas-token>';
- Följ sedan stegen i nästa avsnitt för att skapa en händelsesession i SSMS med event_file mål i Azure Storage. 
Skapa en händelsesession i SSMS med event_file mål i Azure Storage
När autentiseringsuppgifterna som ger åtkomst till lagringscontainern har skapats kan du skapa händelsesessionen. Till skillnad från att skapa autentiseringsuppgifterna kräver inte skapandet av en händelsesession behörigheten CONTROL . När autentiseringsuppgifterna har skapats kan du skapa händelsesessioner även om du har mer begränsade behörigheter. Se Behörigheter för de specifika behörigheter som behövs.
Så här skapar du en ny händelsesession i SSMS:
- För SQL Server och Azure SQL Managed Instance expanderar du noden Utökade händelser under mappen Hantering . För Azure SQL Database och SQL Database i Fabric expanderar du noden Utökade händelser under databasen. 
- Högerklicka på mappen Sessioner och välj Ny session.... 
- På sidan Allmänt anger du ett namn för sessionen, som är - example-sessionför följande kodexempel.
- På sidan Händelser väljer du en eller flera händelser som ska läggas till i sessionen. Du kan till exempel välja händelsen - sql_batch_starting.
- På sidan Datalagring väljer du - event_filesom måltyp. Klistra in URL:en för lagringscontainern i rutan Lagrings-URL . Skriv ett snedstreck (- /) i slutet av den här URL:en följt av filnamnet (blob). Till exempel- https://<storage-account-name>.blob.core.windows.net/<container-name>/example-session.xel.
- Nu när sessionen har konfigurerats kan du välja knappen Skript för att skapa ett T-SQL-skript för sessionen för att spara den till senare. 
- Välj OK för att skapa sessionen. 
- I Object Explorer expanderar du mappen Sessioner för att se den händelsesession som du skapade. Som standard startas inte sessionen när den skapas. Starta sessionen genom att högerklicka på sessionsnamnet och välja Starta session. Du kan stoppa det senare genom att välja Stoppa session när sessionen körs. 
När T-SQL-batchar körs skriver sql_batch_starting sessionen händelserna till bloben example-session.xel i lagringscontainern.
Anmärkning
För SQL Managed Instance använder du knappen Skript för att skapa ett T-SQL-skript för sessionen i stället för att klistra in lagringscontainerns URL på sidan Datalagring. Ange container-URL:en som värde för filename argumentet och kör skriptet för att skapa sessionen.
Skapa en händelsesession med event_file som mål i Azure Storage med T-SQL
Här är ett exempel på CREATE EVENT SESSION med en ADD TARGET -sats som lägger till ett Azure Storage-baserat event_file mål.
CREATE EVENT SESSION [example-session]
ON SERVER
ADD EVENT sqlserver.sql_batch_starting
ADD TARGET package0.event_file
(
    SET filename = N'https://<storage-account-name>.blob.core.windows.net/<container-name>/example-session.xel'
)
GO
Om du vill använda det här exemplet i Azure SQL Database eller SQL Database i Fabric ersätter du ON SERVER med ON DATABASE.
Felsöka händelsesessioner med "event_file" target i Azure Storage
Följande lista innehåller fel som du kan stöta på när du startar en utökad händelsesession som använder Azure Storage, med möjliga förklaringar till felet.
- 
              Operativsystemet returnerade fel 5: "Åtkomst nekas."
- Om du använder hanterad identitetsautentisering: - Den hanterade identitet som används av databasmotorn har inte den RBAC-rolltilldelning som krävs. Mer information finns i Bevilja åtkomst med hjälp av hanterad identitet.
- 
              Brandväggen för lagringskontot är aktiverad och ett undantag för att tillåta betrodda Azure-tjänster att komma åt lagringskontot är också aktiverat, men en Microsoft.Sql/serversresursinstans för den logiska servern har inte lagts till i listan över resursinstanser som beviljas åtkomst. Mer information finns i Bevilja åtkomst från Azure-resursinstanser.
- Om du använder en nätverkssäkerhetsperimeter med framtvingat läge finns inte databasen och lagringskontot i samma perimeter.
 
- Om du använder SAS-tokenautentisering: - Brandväggen för lagringskontot är aktiverad. Detta stöds inte för händelsesessioner som använder SAS-tokenautentisering.
- SAS-token har inte tillräcklig behörighet eller har upphört att gälla. Mer information finns i Bevilja åtkomst med hjälp av en SAS-token.
- Om du använder en nätverkssäkerhetsperimeter med framtvingat läge är åtkomstregler som tillåter obegränsad utgående kommunikation från databasen och obegränsad inkommande kommunikation till lagringskontot inte på plats.
 
 
- Om du använder hanterad identitetsautentisering: 
- 
              Operativsystemet returnerade fel 86: "Det angivna nätverkslösenordet är inte korrekt."
- Det finns inga databasomfattande autentiseringsuppgifter (för Azure SQL Database) eller autentiseringsuppgifter med serveromfattning (för Azure SQL Managed Instance eller SQL Server) med namnet som matchar blobcontainerns URL. Mer information finns i exemplen för att bevilja åtkomst med hjälp av hanterad identitet eller Bevilja åtkomst med hjälp av en SAS-token.
- Namnet på autentiseringsuppgifterna slutar med ett snedstreck (/). Namnet på autentiseringsuppgifterna ska sluta med containernamnet som inte innehåller det avslutande snedstrecket.
 
- 
              Operativsystemet returnerade fel 3: "Det går inte att hitta den angivna sökvägen."
- Containern som anges i blobcontainerns URL finns inte.
 
- 
              Operativsystemet returnerade fel 13: "Data är ogiltiga."
- Det finns en oföränderlig princip för blobcontainern. Oföränderlig lagring stöds inte för händelsesessioner.
- Lagringskontot har det hierarkiska namnområdet aktiverat. Lagringskonton med hierarkiskt namnområde aktiverat stöds inte för händelsesessioner.
 
funktionen sys.fn_xe_file_target_read_file()
Målet event_file lagrar de data som det tar emot i ett binärt format som inte kan läsas av människor. Med sys.fn_xe_file_target_read_file funktionen kan du representera innehållet i en xel fil som en relationsraduppsättning. Mer information, inklusive användningsexempel, finns i sys.fn_xe_file_target_read_file.
ring_buffer mål
Målet ring_buffer är användbart när du snabbt startar en händelsesession och endast samlar in händelsedata i minnet. När det tillgängliga minnet i ringbufferten används av händelser ignoreras de äldre händelserna. När du stoppar händelsesessionen ignoreras även alla sessionsutdata till ring_buffer målet.
Du använder data från ett ring_buffer mål genom att konvertera dem till XML, som du ser i följande exempel. Under den här konverteringen utelämnas alla data som inte passar in i ett 4 MB XML-dokument. Även om du samlar in fler händelser i ringbufferten med hjälp av större MAX_MEMORY värden (eller om du lämnar den här parametern som standardvärde) kanske du inte kan använda alla av dem på grund av gränsen på 4 MB för XML-dokumentstorleken, med tanke på omkostnaderna för XML-markering och Unicode-strängar.
Du vet att innehållet i ringbufferten utelämnas under konverteringen till XML om attributet truncated i XML-dokumentet är inställt på 1, till exempel.
<RingBufferTarget truncated="1" processingTime="0" totalEventsProcessed="284" eventCount="284" droppedCount="0" memoryUsed="64139">
Tips/Råd
När du lägger till ett ring_buffer mål anger du parametern MAX_MEMORY till 1 024 KB eller mindre. Om du använder större värden kan minnesförbrukningen öka i onödan.
Som standardinställning är MAX_MEMORY för ett ring_buffer mål inte begränsat i SQL Server och är begränsat till 32 MB i Azure SQL Database, Azure SQL Managed Instance och SQL-databas i Fabric.
Skapa en händelsesession med ett ringbuffer-target
Här är ett exempel på hur du skapar en händelsesession med ett ring_buffer mål för att samla in lock_acquired händelserna, vilket begränsar det totala antalet händelser i ringbufferten till 100. I det här exemplet visas parametern MAX_MEMORY två gånger: en gång för att ange ring_buffer målminnet till 1 024 KB och en gång för att ställa in händelsesessionens buffertminne till 2 MB.
Om du vill använda det här exemplet i Azure SQL Database eller SQL Database i Fabric ersätter du ON SERVER med ON DATABASE.
CREATE EVENT SESSION ring_buffer_lock_acquired
ON SERVER
ADD EVENT sqlserver.lock_acquired
ADD TARGET package0.ring_buffer
(
SET MAX_EVENTS_LIMIT = 100,
    MAX_MEMORY = 1024
)
WITH
(
    MAX_MEMORY = 2 MB,
    MAX_DISPATCH_LATENCY = 3 SECONDS
);
Starta händelsesessionen genom att köra följande instruktion:
ALTER EVENT SESSION ring_buffer_lock_acquired
ON SERVER
STATE = START;
Om du vill visa insamlade händelsedata i ringbufferten i SSMS expanderar du sessionsnoden och väljer målet package0.ping_buffer . Data visas i XML.
Om du vill se händelsedata från ett ring_buffer mål i en relationsraduppsättning medan sessionen är aktiv använder du XQuery-uttryck för att konvertera XML till relationsdata. Till exempel:
;WITH
/* An XML document representing memory buffer contents */
RingBuffer AS
(
    SELECT CAST (xst.target_data AS XML) AS TargetData
    FROM sys.dm_xe_session_targets AS xst
         INNER JOIN sys.dm_xe_sessions AS xs
             ON xst.event_session_address = xs.address
    WHERE xs.name = N'ring_buffer_lock_acquired'
),
/* A row for each event in the buffer, represented as an XML fragment */
EventNode AS
(
    SELECT CAST (NodeData.query('.') AS XML) AS EventInfo
    FROM RingBuffer AS rb
    CROSS APPLY rb.TargetData.nodes('/RingBufferTarget/event') AS n(NodeData)
)
/* A relational rowset formed by using the XQuery value method */
SELECT EventInfo.value('(event/@timestamp)[1]','datetimeoffset') AS timestamp,
       EventInfo.value('(event/@name)[1]','sysname') AS event_name,
       EventInfo.value('(event/data/value)[1]','nvarchar(max)') AS sql_batch_text
FROM EventNode
ORDER BY timestamp DESC;
event_stream destinationsadress
Målet event_stream kan bara användas i .NET-program som skrivits på språk som C#. Utvecklare kan komma åt en händelseström via .NET Framework-klasser i Microsoft.SqlServer.XEvents.Linq namnområdet. Det här målet finns implicit i alla händelsesessioner. Det går inte att lägga till med T-SQL.
Mer information finns i sys.fn_MSxe_read_event_stream.
Om du får fel 25726 The event data stream was disconnected because there were too many outstanding events. To avoid this error either remove events or actions from your session or add a more restrictive predicate filter to your session. när du läser från målet event_stream innebär det att händelseströmmen fylldes med data snabbare än klienten kunde bearbeta data. Detta gör att databasmotorn kopplas från händelseströmmen för att undvika att påverka databasmotorns prestanda.
histogrammåltavla
Målet histogram räknar antalet händelsehändelser för distinkta värden i ett fält eller en åtgärd. För varje distinkt värde används en separat antals bucket. Målet histogram bearbetar datan den tar emot synkront.
Parametern SOURCE_TYPE styr målets histogram beteende:
- 
              SOURCE_TYPE = 0: samla in data för ett händelsefält.
- 
              SOURCE_TYPE = 1: samla in data för en åtgärd. Det här är standardinställningen.
Standardvärdet för parametern SLOTS är 256. Om du tilldelar ett annat värde avrundas värdet upp till nästa effekt på 2. Till exempel SLOTS = 59 avrundas upp till 64. Det maximala antalet histogramfack för ett histogram mål är 16 384.
När du använder histogram som mål kan du ibland se oväntade resultat. Vissa händelser kanske inte visas på de förväntade platserna, medan andra platser kan visa ett högre antal händelser än förväntat. Detta kan inträffa om en hash-kollision inträffar när händelser tilldelas till platser. Även om detta är ovanligt, inträffar en hashkollision och en händelse som borde räknas i en slot räknas i en annan. Därför bör man vara noga med att anta att en händelse inte inträffade bara för att antalet i ett visst fack visas som noll.
Tänk till exempel på följande scenario:
- Du konfigurerar en session för utökade händelser med histogramsom mål och kategoriserar händelser efterobject_idför att samla in statistik över lagrade procedurers körning.
- Du kör den lagrade proceduren A. Sedan kör du den lagrade procedurenB.
Om hash-funktionen returnerar samma värde för båda lagrade object_id procedurerna, kommer histogrammet att visa A som körts två gånger medan B inte visas alls.
För att undvika det här problemet när antalet distinkta värden är relativt litet anger du antalet histogramplatser som är högre än kvadraten med förväntade distinkta värden. Om histogram-målet exempelvis har sitt SOURCE satt till table_name-händelsefält och det finns 20 tabeller i databasen, då blir det 20*20 = 400. Nästa tvåpotens större än 400 är 512, vilket är det rekommenderade antalet slottar i det här exemplet.
Varje histogram mål tar emot data från en enda källa (ett händelsefält eller en åtgärd) och innehåller bara ett histogram. Det går inte att lägga till fler än ett mål av samma typ per händelsesession. Det går inte heller att ha fler än en källtyp per histogram mål. Därför krävs en ny händelsesession för att spåra olika åtgärder eller händelsefält i ett separat histogram mål.
Skapa en händelsesession med ett histogrammål
Här är ett exempel på hur du skapar en händelsesession med ett histogram mål.
Om du vill använda det här exemplet i Azure SQL Database eller SQL Database i Fabric ersätter du ON SERVER med ON DATABASE.
CREATE EVENT SESSION histogram_lock_acquired
ON SERVER
ADD EVENT sqlserver.lock_acquired
(
    ACTION (sqlos.system_thread_id)
)
ADD TARGET package0.histogram
(
    SET FILTERING_EVENT_NAME = N'sqlserver.lock_acquired',
        SLOTS = 16,
        SOURCE = N'sqlos.system_thread_id',
        SOURCE_TYPE = 1
);
              ADD TARGET ... (SET ...) I -satsen är målparametern SOURCE_TYPE inställd på 1, vilket innebär att histogram målet spårar en åtgärd.
              ADD EVENT ... (ACTION ...)-satsen lägger till sqlos.system_thread_id-åtgärden till händelsen. Parametern SOURCE är inställd på att sqlos.system_thread_id använda systemtråds-ID:t som samlas in av den här åtgärden som datakälla för histogram målet. Målet histogram i det här exemplet räknar antalet lock_acquired händelser för varje systemtråd som hämtar lås medan sessionen är aktiv.
Starta händelsesessionen genom att köra följande instruktion:
ALTER EVENT SESSION histogram_lock_acquired
ON SERVER
STATE = START;
Om du vill visa insamlade histogramdata i SSMS expanderar du sessionsnoden och väljer målet package0.histogram . Data visas i ett rutnät med två kolumner. Varje rad representerar en bucket med distinkta värden och ett antal förekomster.
Så här kan data som samlas in av histogram målet i det här exemplet se ut. Värdena i value kolumnen är system_thread_id värden. Till exempel förvärvades totalt 236 lås av systemtråden 6540.
value   count
-----   -----
 6540     236
 9308      91
 9668      74
10144      49
 5244      44
 2396      28
Här är ett exempel på hur du läser data från ett histogram mål med T-SQL:
WITH histogram_target
AS (SELECT TRY_CAST (st.target_data AS XML) AS target_data
    FROM sys.dm_xe_sessions AS s
         INNER JOIN sys.dm_xe_session_targets AS st
             ON s.address = st.event_session_address
    WHERE s.name = 'event-session-name-placeholder'),
 histogram
AS (SELECT hb.slot.value('(@count)[1]', 'bigint') AS slot_count,
           hb.slot.value('(value/text())[1]', 'nvarchar(max)') AS slot_value
    FROM histogram_target AS ht
CROSS APPLY ht.target_data.nodes('/HistogramTarget/Slot') AS hb(slot))
SELECT slot_value,
       slot_count
FROM histogram;
händelseräknare mål
Målet event_counter räknar hur många gånger varje angiven händelse inträffar.
Målet event_counter har inga parametrar och bearbetar de data som det tar emot synkront.
Skapa en händelsesession med ett event_counter målobjekt
Här är ett exempel på hur du skapar en händelsesession med ett event_counter mål. Sessionen räknar de första fyra checkpoint_begin händelserna och slutar sedan räkna eftersom dess predikat begränsar antalet händelser som skickas till mål till fyra. Du kan generera händelsen checkpoint_begin för det här exemplet genom att köra kommandot CHECKPOINT.
Om du vill använda det här exemplet i Azure SQL Database eller SQL Database i Fabric ersätter du ON SERVER med ON DATABASE.
CREATE EVENT SESSION event_counter_checkpoint_begin
ON SERVER
ADD EVENT sqlserver.checkpoint_begin
(
    WHERE package0.counter <= 4
)
ADD TARGET package0.event_counter
WITH
(
    MAX_MEMORY = 4096 KB,
    MAX_DISPATCH_LATENCY = 3 SECONDS
);
Starta händelsesessionen genom att köra följande instruktion:
ALTER EVENT SESSION event_counter_checkpoint_begin
ON SERVER
STATE = START;
Om du vill visa insamlade data i SSMS expanderar du sessionsnoden och väljer målet package0.event_counter . Data visas i ett rutnät med tre kolumner. Varje rad representerar en händelse med antalet förekomster.
Så här kan de data som samlas in av event_counter-målobjektet i det här exemplet se ut efter fyra kontrollpunkter.
package_name   event_name         count
------------   ----------------   -----
sqlserver      checkpoint_begin   4
parmatchning mål
Med pair_matching målet kan du identifiera starthändelser som inträffar utan motsvarande sluthändelse. Du kan till exempel hitta en lock_acquired-händelse utan en matchande lock_released-händelse, vilket kan tyda på att en långlivad transaktion håller lås.
Utökade händelser matchar inte automatiskt start- och sluthändelserna. I stället definierar du matchningslogik i målspecifikationen pair_matching i CREATE EVENT SESSION-satsen. När en start- och sluthändelse matchas tar systemet bort paret, men behåller starthändelser som inte har matchats.
Skapa en händelsesession med ett pair_matching-target
I det här exemplet skapar vi en exempeltabell med namnet T1, infogar tre rader och hämtar värdet för den object_id här tabellen. För enkelhetens skull skapar vi tabellen i tempdb databasen i det här exemplet. Om du använder en annan databas justerar du databasnamnet i T-SQL-exempelkoden som följer.
CREATE TABLE T1 (id INT PRIMARY KEY);
INSERT INTO T1 (id)
VALUES (1), (2), (3);
SELECT OBJECT_ID('T1') AS object_id;
-- object_id = 1029578706
Följande händelsesession samlar in två händelser lock_acquired och lock_released. Den har också två mål. Ett är målet event_counter som ger antalet förekomster för varje händelse. Det andra är målet pair_matching som definierar logiken för att matcha starthändelsen lock_acquired och sluthändelsen lock_released i par.
Sekvensen med kommaavgränsade fält som tilldelats BEGIN_MATCHING_COLUMNS och END_MATCHING_COLUMNS måste vara densamma. Inga flikar eller nya rader tillåts mellan fälten som anges i det kommaavgränsade värdet, även om blanksteg tillåts.
I händelsesessionsdefinitionen använder vi ett händelsepredikat för att endast samla in de händelser i tempdb databasen där object_id händelsen i matchar objekt-ID för tabellen T1. Justera predikatet WHERE i -satsen för att använda objekt-ID:t för tabellen.
Om du vill använda det här exemplet i Azure SQL Database eller SQL Database i Fabric ersätter du ON SERVER med ON DATABASE.
CREATE EVENT SESSION pair_matching_lock_acquired_released
ON SERVER
ADD EVENT sqlserver.lock_acquired
(
    SET COLLECT_DATABASE_NAME = 1,
        COLLECT_RESOURCE_DESCRIPTION = 1
    ACTION (sqlserver.transaction_id)
    WHERE (database_name = 'tempdb'
           AND object_id = 1029578706)
),
ADD EVENT sqlserver.lock_released
(
    SET COLLECT_DATABASE_NAME = 1,
        COLLECT_RESOURCE_DESCRIPTION = 1
    ACTION (sqlserver.transaction_id)
    WHERE (database_name = 'tempdb'
           AND object_id = 1029578706)
)
ADD TARGET package0.event_counter,
ADD TARGET package0.pair_matching
(
    SET BEGIN_EVENT = N'sqlserver.lock_acquired',
        BEGIN_MATCHING_COLUMNS = N'resource_0, resource_1, resource_2, transaction_id, database_id',
        END_EVENT = N'sqlserver.lock_released',
        END_MATCHING_COLUMNS = N'resource_0, resource_1, resource_2, transaction_id, database_id',
        RESPOND_TO_MEMORY_PRESSURE = 1
)
WITH
(
    MAX_MEMORY = 8192 KB,
    MAX_DISPATCH_LATENCY = 15 SECONDS
);
Starta händelsesessionen genom att köra följande instruktion:
ALTER EVENT SESSION pair_matching_lock_acquired_released
ON SERVER
STATE = START;
Starta en transaktion som uppdaterar T1 tabellen, men avsluta eller rulla inte tillbaka den. Detta säkerställer att lås erhålls men inte frigörs.
BEGIN TRANSACTION;
UPDATE T1
    SET id = id + 1;
Granska utdata från varje mål för händelsesessionen pair_matching_lock_acquired_released i SSMS.
Målet event_counter har följande resultat, vilket visar att ett lås fortfarande inte är frisläppt. Det här objektet visar inga detaljer om detta lås.
package_name   event_name      count
------------   ----------      -----
sqlserver      lock_acquired   4
sqlserver      lock_released   3
Målet pair_matching har följande utdata, trunkerade för korthet. Som föreslås av event_counter utdata, ser vi faktiskt den enda raden för den oparade lock_acquired händelsen, med mer information om händelsen.
package_name  event_name    timestamp                     associated_object_id  database_id  database_name
------------  ------------  ---------                     -------------         -----------  -------------
sqlserver    lock_acquired   2025-10-01 20:06:07.1890000  1029578706            2            tempdb
Återställ transaktionen.
ROLLBACK;
Om du lägger till en åtgärd i en händelse som samlas in av pair_matching målet samlas även åtgärdsdata in. Du kan till exempel inkludera T-SQL-texten som tillhandahålls av sqlserver.sql_text åtgärden med händelsen. I det här exemplet skulle den samla in frågan som hämtade låset.
etw_classic_sync_target måltavla
I SQL Server kan utökade händelser samverka med händelsespårning för Windows (ETW) för att övervaka systemaktivitet. Mer information finns i:
Det här ETW-målet bearbetar de data som tas emot synkront.
