Sdílet prostřednictvím


Cílové objekty rozšířených událostí

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLDatabáze SQL v Microsoft Fabric

Tento článek vysvětluje, kdy a jak používat cílové objekty pro rozšířené události. Pro každý cíl popisuje článek:

  • Jeho schopnosti ve shromažďování a reportování dat událostí.
  • Příklady relací událostí, které používají cíl

Následující tabulka popisuje dostupnost jednotlivých cílových typů na různých platformách SQL.

Typ cíle SQL Server Azure SQL Database a databáze SQL ve službě Fabric Azure SQL Managed Instance
soubor událostí Ano Ano Ano
kruhový buffer Ano Ano Ano
event_stream Ano Ano Ano
histogram Ano Ano Ano
počítač událostí Ano Ano Ano
párové_srovnání Ano Ne Ne
etw_classic_sync_target Ano Ne Ne

Pokud není uvedeno jinak, cíle zpracovávají data, která přijímají asynchronně.

Pokud chcete tento článek používat nejvíce, měli byste:

cílový soubor událostí

Cíl event_file zapíše výstup relace událostí z vyrovnávací paměti do souboru disku nebo do objektu blob ve službě Azure Storage.

  • V klauzuli filename zadáte ADD TARGET parametr. Přípona souboru musí být xel.

  • Název souboru, který zvolíte, používá systém jako předponu, ke které se připojí číselná hodnota založená na datu a času, za kterou následuje xel přípona.

  • Volitelně můžete zadat MAX_FILE_SIZE parametr. Definuje maximální velikost v megabajtech (MB), na kterou může soubor růst před vytvořením nového souboru.

  • Volitelně můžete zadat MAX_ROLLOVER_FILES možnost zvolit maximální počet souborů, které se mají zachovat v systému souborů kromě aktuálního souboru. Výchozí hodnota je UNLIMITED. Když MAX_ROLLOVER_FILES se vyhodnotí, pokud počet souborů překročí MAX_ROLLOVER_FILES nastavení, starší soubory se odstraní.

Důležité

V závislosti na událostech přidaných do relace můžou soubory vytvořené event_file cílem obsahovat citlivá data. Pečlivě zkontrolujte systém souborů a oprávnění ke sdílení v adresáři a jednotlivých .xel souborech, včetně zděděného přístupu, abyste se vyhnuli zbytečnému přístupu ke čtení. Dodržujte zásadu nejnižších oprávnění. Pokud chcete snížit riziko neúmyslného shromažďování citlivých dat, vyhněte se dlouhotrvajícím relacím událostí, pokud by mohly shromažďovat citlivá data.

Poznámka:

Azure SQL Database a Azure SQL Managed Instance podporují pouze objekty blob ve službě Azure Storage jako hodnotu parametru filename . Příklad event_file kódu pro Azure SQL Database, SQL Database ve Fabric nebo Azure SQL Managed Instance najdete v tématu Vytvoření relace událostí se souborem event_file jako cílem v Azure Storage.

V místním systému souborů vytvořte událostní sezení s cílem event_file.

Průvodce vytvořením relace událostí s využitím event_file a místního úložiště souborů prostřednictvím SSMS nebo T-SQL viz Rychlý start: Rozšířené události.

Vytvořte relaci události s cílovým event_file ve službě Azure Storage

Podrobný popis vytvoření účtu úložiště ve službě Azure Storage najdete v tématu Vytvoření účtu úložiště. Účet úložiště můžete vytvořit pomocí webu Azure Portal, PowerShellu, Azure SQL, šablony ARM nebo šablony Bicep. Použijte účet, který:

  • Standard general-purpose v2 Je to účet.
  • Používá Hotúroveň přístupu blob.
  • Pokud používáte SQL Server na virtuálním počítači Azure (virtuální počítač Azure), měl by být účet úložiště ve stejné oblasti Azure jako váš virtuální počítač Azure.
  • Nemá hierarchický obor názvů povolený.

Dále vytvořte kontejner v tomto účtu úložiště pomocí webu Azure Portal. Kontejner můžete vytvořit také pomocí PowerShellu nebo pomocí Azure CLI.

Poznamenejte si názvy účtu úložiště a kontejneru , který jste vytvořili. Použijete je v následujících krocích.

Ke čtení a zápisu dat událostí vyžaduje databázový stroj specifický přístup. Tento přístup udělíte odlišně v závislosti na zvoleném typu ověřování: spravovaná identita nebo ověřování na základě tajných kódů pomocí tokenu sdíleného přístupového podpisu (SAS).

K ověření ve službě Azure Storage vyžaduje databázový stroj přihlašovací údaje s oborem serveru nebo přihlašovací údaje s oborem databáze, které mu říkají, jaký druh ověřování se má použít, a poskytuje tajný klíč pro ověřování na základě tajných kódů. Vytvoření těchto přihlašovacích údajů vyžaduje CONTROL oprávnění k databázi.

Pro SQL Server a azure SQL Managed Instance se toto oprávnění vyžaduje v master databázi. Ve výchozím nastavení jsou oprávnění uložena členy db_owner databázové role v mastera členy sysadmin role serveru v instanci. Pro službu Azure SQL Database a SQL databázi v systému Fabric je toto oprávnění přiděleno vlastníkem databáze (dbo), členy role databáze db_owner a správcem logického serveru.

Po vytvoření přihlašovacích údajů zbývající kroky k vytvoření relace události nevyžadují CONTROL oprávnění. Viz Oprávnění pro konkrétní potřebná oprávnění.

Udělení přístupu pomocí spravované identity

Pokud používáte spravovanou identitu s ověřováním Microsoft Entra, přiřaďte roli RBAC Přispěvatel dat blob úložiště pro kontejner ke spravované identitě, kterou používá databázový systém. Další informace najdete v následujících tématech založených na platformě SQL:

Jakmile je přiřazení role RBAC nastaveno, proveďte následující kroky:

  1. Vytvořte přihlašovací údaje pomocí T-SQL.

    Před spuštěním následující dávky T-SQL proveďte následující změnu:

    • Ve všech třech výskytech https://<storage-account-name>.blob.core.windows.net/<container-name>nahraďte <storage-account-name> názvem vašeho účtu úložiště a nahraďte <container-name> názvem kontejneru. Ujistěte se, že na konci adresy URL není koncové lomítko.

    Vytvořte přihlašovací údaje v oboru serveru: (platí pro SQL Server, Azure SQL Managed Instance)

    Pomocí klientského nástroje, jako je SSMS, otevřete nové okno dotazu, připojte se k master databázi v instanci, ve které chcete vytvořit relaci události, a vložte následující dávku T-SQL.

    /* 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';
    

    Vytvoření přihlašovacích údajů v rozsahu databáze: (platí pro Azure SQL Database, Azure SQL Managed Instance, SQL database ve Fabric).

    Pomocí klientského nástroje, jako je SSMS, otevřete nové okno dotazu, připojte se k uživatelské databázi, ve které vytvoříte relaci události, a vložte následující dávku T-SQL. Ujistěte se, že jste připojení k uživatelské databázi, a ne k master databázi.

    /* 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';
    
  2. Pak podle pokynů vytvořte relaci událostí v SSMS s event_file cílem ve službě Azure Storage.

Udělení přístupu pomocí tokenu sdíleného přístupového podpisu (SAS)

Pokud používáte ověřování založené na tajných klíčích, vytvoříte pro kontejner token sdíleného přístupového podpisu (SAS ). Pokud chcete použít tento typ ověřování, musí být pro účet úložiště povolená možnost Povolit přístup k klíči účtu úložiště. Další informace najdete v tématu Zabránění autorizaci sdíleného klíče pro účet Azure Storage.

  1. Na webu Azure Portal přejděte do účtu úložiště a kontejneru, který jste vytvořili. Vyberte kontejner a přejděte na Nastavení > sdílených přístupových tokenů.

    Token SAS musí splňovat následující požadavky:

    • Oprávnění nastavená na Read, Write, Delete, List.
    • Čas zahájení a doba vypršení platnosti musí zahrnovat dobu životnosti relace události. Token SAS, který vytvoříte, funguje pouze v tomto časovém intervalu.
    • V případě služeb Azure SQL Database, Azure SQL Managed Instance a databáze SQL v prostředí Fabric nesmí mít token SAS žádná omezení IP adres.

    Vyberte tlačítko Generovat token SAS a adresu URL . Token SAS je v poli tokenu SAS blobu. Můžete ho zkopírovat, abyste ho mohli použít v dalším kroku.

    Důležité

    Token SAS poskytuje přístup pro čtení a zápis k tomuto kontejneru. Zacházejte s ním stejně jako s heslem nebo s jakýmkoli jiným tajným kódem.

    Snímek obrazovky Se sdílenými přístupovými tokeny pro kontejner Azure Storage s vygenerovaným tokenem SAS pro ukázkový kontejner

  2. Vytvořte přihlašovací údaje pro uložení tokenu SAS pomocí T-SQL.

    Před spuštěním následující dávky T-SQL proveďte tyto změny:

    • Pokud vytváříte pověření na úrovni serveru a použijete prohlášení CREATE MASTER KEY, nahraďte <password> silným heslem, které chrání hlavní klíč. Další informace naleznete v tématu CREATE MASTER KEY.

    • Ve všech třech výskytech https://<storage-account-name>.blob.core.windows.net/<container-name>nahraďte <storage-account-name> názvem vašeho účtu úložiště a nahraďte <container-name> názvem kontejneru.

    • SECRET V klauzuli nahraďte <sas-token> tokenem SAS, který jste zkopírovali v předchozím kroku.

    Vytvořte přihlašovací údaje v oboru serveru: (platí pro SQL Server, Azure SQL Managed Instance)

    Pomocí klientského nástroje, jako je SSMS, otevřete nové okno dotazu, připojte ho k master databázi v instanci, ve které vytvoříte relaci události, a vložte následující dávku T-SQL.

    /* 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>';
    

    Vytvoření přihlašovacích údajů v rozsahu databáze: (platí pro Azure SQL Database, Azure SQL Managed Instance, SQL database ve Fabric).

    Pomocí klientského nástroje, jako je SSMS, otevřete nové okno dotazu, připojte se k databázi, ve které vytvoříte relaci události, a vložte následující dávku T-SQL. Ujistěte se, že jste připojení k uživatelské databázi, a ne k master databázi.

    /* 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>';
    
  3. Potom podle kroků v další části vytvořte relaci událostí v SSMS s cílovým event_file ve službě Azure Storage.

Vytvoření relace v SSMS s cílovým objektem event_file ve službě Azure Storage

Po vytvoření přihlašovacích údajů, které poskytují přístup ke kontejneru úložiště, můžete vytvořit relaci událostí. Na rozdíl od vytváření přihlašovacích údajů, vytvoření relace událostí nevyžaduje CONTROL oprávnění. Po vytvoření pověření můžete vytvořit relace událostí, i pokud máte omezenější oprávnění. Viz Oprávnění pro konkrétní potřebná oprávnění.

Chcete-li vytvořit novou relaci události v SSMS:

  1. Pro SQL Server a Azure SQL Managed Instance rozbalte uzel Rozšířené události ve složce Správa . V případě Azure SQL Database a SQL databáze ve Fabric rozbalte uzel Rozšířené události pod databází.

  2. Klikněte pravým tlačítkem myši na složku Relace a vyberte Možnost Nová relace....

  3. Na stránce Obecné zadejte název relace, což je example-session pro následující vzorový kód.

  4. Na stránce Události vyberte jednu nebo více událostí, které chcete přidat do relace. Můžete například vybrat sql_batch_starting událost.

  5. Na stránce Úložiště dat vyberte event_file jako cílový typ. Vložte adresu URL kontejneru úložiště do pole Adresa URL úložiště . Na konec této adresy URL zadejte lomítko (/) a poté název souboru (blob). Například: https://<storage-account-name>.blob.core.windows.net/<container-name>/example-session.xel.

  6. Teď, když je relace nakonfigurovaná, můžete volitelně vybrat tlačítko Skript a vytvořit skript T-SQL relace a uložit ho pro pozdější použití.

  7. Vyberte OK a vytvořte relaci.

  8. V Průzkumník objektů rozbalte složku Relace a zobrazte relaci události, kterou jste vytvořili. Ve výchozím nastavení se relace při vytváření nespusťe. Relaci spustíte tak, že kliknete pravým tlačítkem myši na název relace a vyberete Spustit relaci. Později ji můžete zastavit výběrem možnosti Zastavit relaci po spuštění relace.

Při provádění dávek T-SQL session zapisuje události sql_batch_starting do blobu example-session.xel v úložišti kontejneru.

Poznámka:

Pro službu SQL Managed Instance místo vložení adresy URL kontejneru úložiště na stránce Úložiště dat použijte tlačítko Skript k vytvoření skriptu T-SQL relace. Zadejte adresu URL kontejneru jako hodnotu argumentu filename a spusťte skript pro vytvoření relace.

Vytvořte relaci událostí s cílem typu event_file ve službě Azure Storage v T-SQL.

Tady je příklad CREATE EVENT SESSION klauzule s ADD TARGET klauzulí, která přidává cíl založený na event_file službě Azure Storage.

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

Pokud chcete tento příklad použít ve službě Azure SQL Database nebo v databázi SQL v prostředí Fabric, nahraďte ON SERVERON DATABASE.

Odstraňování potíží s relacemi událostí s cílovou destinací event_file ve službě Azure Storage

Následující seznam obsahuje chyby, se kterými se můžete setkat při spuštění rozšířené relace událostí, která používá Azure Storage, s možnými vysvětleními chyby.

  • Operační systém vrátil chybu 5: Přístup byl odepřen.
    • Pokud používáte ověřování spravované identity:
    • Pokud používáte ověřování pomocí tokenu SAS:
      • Je povolená brána firewall účtu úložiště. To se nepodporuje u relací událostí, které používají ověřování SAS tokenu.
      • Token SAS nemá dostatečná oprávnění nebo vypršela jeho platnost. Další informace najdete v tématu Udělení přístupu pomocí tokenu SAS.
      • Pokud používáte hraniční síť s vynuceným režimem zabezpečení sítě, pravidla přístupu, která umožňují neomezenou odchozí komunikaci z databáze a neomezenou příchozí komunikaci s účtem úložiště nejsou na místě.
  • Operační systém vrátil chybu 86: Zadané síťové heslo není správné.
    • Neexistují žádné přihlašovací údaje s oborem databáze (pro Azure SQL Database) ani přihlašovací údaje s oborem serveru (pro spravovanou instanci Azure SQL nebo SQL Server) s názvem odpovídajícím adrese URL kontejneru objektů blob. Další informace najdete v příkladech udělení přístupu pomocí spravované identity nebo udělení přístupu pomocí tokenu SAS.
    • Název přihlašovacích údajů končí lomítkem (/). Název přihlašovacích údajů by měl končit názvem kontejneru, který neobsahuje koncové lomítko.
  • Operační systém vrátil chybu 3: Systém nemůže najít zadanou cestu.
    • Kontejner zadaný v adrese URL kontejneru objektů blob neexistuje.
  • Operační systém vrátil chybu 13: Data jsou neplatná.
    • V kontejneru objektů blob je zásada neměnnosti . Neměnné úložiště není pro relace událostí podporované.
    • Úložiště má hierarchický obor názvů povolený. Pro relace událostí se nepodporují účty úložiště s povoleným hierarchickým oborem názvů.

sys.fn_xe_file_target_read_file()

Cíl event_file ukládá data, která přijímá, v binárním formátu, který není čitelný člověkem. Funkce sys.fn_xe_file_target_read_file umožňuje znázorňovat obsah xel souboru jako relační sadu řádků. Další informace, včetně příkladů použití, najdete v sys.fn_xe_file_target_read_file.

Cíl kruhového bufferu

Cíl ring_buffer je užitečný pro rychlé spuštění relace událostí a shromažďování dat událostí pouze v paměti. Pokud události používají dostupnou paměť v prstencové vyrovnávací paměti, starší události se zahodí. Když relaci událostí zastavíte, veškerý výstup relace do ring_buffer cíle se také zahodí.

Data z ring_buffer cíle využíváte tak, že je převedete na XML, jak je znázorněno v následujícím příkladu. Během tohoto převodu se vynechá všechna data, která se nevejdou do dokumentu XML o velikosti 4 MB. Proto i když v vyrovnávací paměti okruhu zachytíte více událostí pomocí větších MAX_MEMORY hodnot (nebo když tento parametr ponecháte na výchozí hodnotě), možná nebudete moct všechny tyto události využívat kvůli limitu 4 MB velikosti dokumentu XML vzhledem k režii značek XML a řetězců Unicode.

Víte, že obsah kruhové vyrovnávací paměti je vynechán během převodu na XML, pokud je atribut truncated v dokumentu XML nastaven na hodnotu 1, například:

<RingBufferTarget truncated="1" processingTime="0" totalEventsProcessed="284" eventCount="284" droppedCount="0" memoryUsed="64139">

Návod

Při přidávání ring_buffer cíle nastavte jeho MAX_MEMORY parametr na 1 024 kB nebo méně. Použití větších hodnot může zbytečně zvýšit spotřebu paměti.

Ve výchozím nastavení není MAX_MEMORY pro ring_buffer cíl omezeno v SQL Serveru ani v Azure SQL Database a Azure SQL Managed Instance, a je omezeno na 32 MB ve službě Azure SQL Database, Azure SQL Managed Instance a SQL database v platformě Fabric.

Vytvořte relaci události s cílem ring_buffer

Tady je příklad vytvoření relace událostí s ring_buffer cílem shromáždit lock_acquired události a omezit celkový počet událostí v vyrovnávací paměti okruhu na 100. V tomto příkladu se parametr MAX_MEMORY zobrazí dvakrát: jednou, pro nastavení ring_buffer cílové paměti na 1 024 kB, a jednou pro nastavení paměti vyrovnávací relace událostí na 2 MB.

Pokud chcete tento příklad použít ve službě Azure SQL Database nebo v databázi SQL v prostředí Fabric, nahraďte ON SERVERON 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
);

Chcete-li zahájit relaci události, proveďte následující příkaz:

ALTER EVENT SESSION ring_buffer_lock_acquired
ON SERVER
STATE = START;

Pokud chcete zobrazit shromážděná data událostí v okruhové vyrovnávací paměti v SSMS, rozbalte uzel relace a vyberte package0.ping_buffer cílový objekt. Data se zobrazí v XML.

Pokud chcete zobrazit data událostí z ring_buffer cíle v relační sadě řádků, zatímco je relace aktivní, použijte výrazy XQuery k převodu XML na relační data. Například:

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

cíl event_stream

Cíl event_stream lze použít pouze v programech .NET napsaných v jazycích, jako je C#. Vývojáři mohou získat přístup k toku událostí prostřednictvím tříd rozhraní .NET Framework v oboru názvů Microsoft.SqlServer.XEvents.Linq. Tento cíl se implicitně nachází v jakékoli relaci událostí. Nejde ho přidat pomocí T-SQL.

Další informace najdete v tématu sys.fn_MSxe_read_event_stream.

Pokud při čtení z 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. cíle narazíte na chybu 25726 event_stream, znamená to, že datový proud událostí se zaplnil daty rychleji, než je mohl klient spotřebovat. To způsobí, že se databázový stroj odpojí od datového proudu událostí, aby nedošlo k ovlivnění výkonu databázového stroje.

cíl histogramu

Cíl histogram spočítá počet výskytů událostí pro jedinečné hodnoty v poli nebo akci. Pro každou jedinečnou hodnotu se použije samostatný kbelík počítání. Cíl histogram zpracovává data, která přijímá synchronně.

Parametr SOURCE_TYPE řídí chování histogram cíle:

  • SOURCE_TYPE = 0: Shromažďujte data pro pole událostí.
  • SOURCE_TYPE = 1: shromážděte data pro akci. Toto je výchozí hodnota.

Výchozí hodnota parametru SLOTS je 256. Pokud přiřadíte jinou hodnotu, hodnota se zaokrouhlí nahoru na další mocninu 2. Například SLOTS = 59 by bylo zaokrouhleno nahoru na 64. Maximální počet slotů histogramu pro histogram cíl je 16 384.

Při použití histogram jako cíle se někdy můžou zobrazit neočekávané výsledky. Některé události se nemusí zobrazovat v očekávaných slotech, zatímco jiné sloty můžou zobrazovat vyšší než očekávaný počet událostí. K tomu může dojít v případě, že při přiřazování událostí do slotů dojde ke kolizi hash. Přestože se to stává zřídka, pokud dojde ke kolizi hash, událost, která by měla být započítána do jednoho slotu, se započítá do jiného. Z tohoto důvodu je důležité být opatrný a nevyvozovat, že k události nedošlo jen proto, že počet v určité položce ukazuje nulu.

Jako příklad zvažte následující scénář:

  • Nastavíte relaci rozšířených událostí, která používá histogram jako cíl a třídí události podle object_id, pro shromažďování statistik o provádění uložených procedur.
  • Spustíte uloženou proceduru A. Pak spustíte uloženou proceduru B.

Pokud hashovací funkce vrací stejnou hodnotu pro object_id obou uložených procedur, histogram ukazuje, že A je spuštěn dvakrát, zatímco B se nezobrazuje.

Pokud chcete tento problém zmírnit, pokud je počet jedinečných hodnot relativně malý, nastavte počet slotů histogramu vyšší než čtverec očekávaných jedinečných hodnot. Pokud je například cíl histogram nastaven na pole události SOURCE, a v databázi je 20 tabulek, pak 20*20 = 400. Další mocnina 2 větší než 400 je 512, což je doporučený počet slotů v tomto příkladu.

Každý histogram cíl přijímá data z jednoho zdroje (pole události nebo akce) a obsahuje pouze jeden histogram. Pro každou relaci událostí není možné přidat více než jeden cíl stejného typu. Není také možné mít pro každý histogram cíl více než jeden typ zdroje. Proto se vyžaduje nová relace událostí ke sledování různých akcí nebo polí událostí v samostatném histogram cíli.

Vytvořte relaci událostí s histogramovým cílem

Tady je příklad vytvoření relace události s histogram cílem.

Pokud chcete tento příklad použít ve službě Azure SQL Database nebo v databázi SQL v prostředí Fabric, nahraďte ON SERVERON 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 ...) V klauzuli je cílový parametr SOURCE_TYPE nastaven na 1, což znamená, že histogram cíl sleduje akci.

Klauzule ADD EVENT ... (ACTION ...) přidá akci sqlos.system_thread_id do události. Parametr SOURCE je nastavený tak, aby sqlos.system_thread_id používal ID systémového vlákna shromážděné touto akcí jako zdroj dat pro histogram cíl. Cíl histogram v tomto příkladu spočítá počet lock_acquired událostí pro každé systémové vlákno, které získává zámky, zatímco relace je aktivní.

Chcete-li zahájit relaci události, proveďte následující příkaz:

ALTER EVENT SESSION histogram_lock_acquired
ON SERVER
STATE = START;

Pokud chcete zobrazit shromážděná data histogramu v SSMS, rozbalte uzel relace a vyberte package0.histogram cíl. Data se zobrazí v mřížce se dvěma sloupci. Každý řádek představuje kbelík jedinečných hodnot a počet výskytů.

Takto můžou vypadat data zachycená cílem v tomto příkladu histogram . Hodnoty ve sloupci value jsou hodnoty system_thread_id. Například celkem 236 zámků získalo systémové vlákno 6540.

value   count
-----   -----
 6540     236
 9308      91
 9668      74
10144      49
 5244      44
 2396      28

Tady je příklad čtení dat z histogram cíle pomocí 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;

cíl event_counter

Cíl event_counter počítá, kolikrát dojde k každé zadané události.

Cíl event_counter nemá žádné parametry a zpracovává data, která přijímá synchronně.

Vytvořte relaci události s cílovým objektem event_counter

Tady je příklad vytvoření relace události s event_counter cílem. Sezení spočítá první čtyři checkpoint_begin události a pak přestane počítat, protože jeho predikát omezuje počet událostí odeslaných do cílů na čtyři. Událost pro tento příklad můžete vygenerovat checkpoint_begin spuštěním CHECKPOINT příkazu.

Pokud chcete tento příklad použít ve službě Azure SQL Database nebo v databázi SQL v prostředí Fabric, nahraďte ON SERVERON 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
);

Chcete-li zahájit relaci události, proveďte následující příkaz:

ALTER EVENT SESSION event_counter_checkpoint_begin
ON SERVER
STATE = START;

Pokud chcete zobrazit shromážděná data v nástroji SSMS, rozbalte uzel session a vyberte package0.event_counter target. Data se zobrazí v mřížce se třemi sloupci. Každý řádek představuje událost s počtem výskytů.

Takto můžou data zachycená event_counter cílem v tomto příkladu vypadat po čtyřech kontrolních bodech.

package_name   event_name         count
------------   ----------------   -----
sqlserver      checkpoint_begin   4

cíl párování

Cíl pair_matching umožňuje detekovat počáteční události, ke kterým dochází bez odpovídající koncové události. Můžete například najít lock_acquired událost bez odpovídající lock_released události, což může znamenat, že dlouhotrvající transakce drží zámky v činnosti.

Rozšířené události automaticky neshodují začátek a konec událostí. Místo toho definujete odpovídající logiku pair_matching ve specifikaci cíle v CREATE EVENT SESSION příkazu. Když se porovná počáteční a koncová událost, cíl zahodí dvojici, ale ponechá nespárované počáteční události.

Vytvořte relaci události s cílem párové přiřazení

V tomto příkladu vytvoříme ukázkovou tabulku s názvem T1, vložíme tři řádky a získáme object_id hodnotu pro tuto tabulku. Pro zjednodušení vytvoříme tabulku v databázi v tomto příkladu tempdb . Pokud používáte jinou databázi, upravte název databáze v následujícím ukázkovém kódu T-SQL.

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

Následující relace událostí shromažďuje dvě události lock_acquired a lock_released. Má také dva cíle. Jedním z nich je event_counter cíl, který poskytuje počet výskytů pro každou událost. Druhým je pair_matching určení, které definuje logiku pro spárování počáteční lock_acquired události a koncové lock_released události.

Posloupnost polí oddělených čárkami, která jsou přiřazena BEGIN_MATCHING_COLUMNS a END_MATCHING_COLUMNS, musí být stejná. Mezi poli uvedenými v hodnotě oddělené čárkami nejsou povoleny žádné tabulátory ani nové řádky, i když jsou povoleny mezery.

V definici relace událostí používáme predikát události ke shromažďování pouze těch událostí v databázi tempdb, kde object_id v události odpovídá ID objektu tabulky T1. Upravte predikát v WHERE klauzuli tak, aby používal ID objektu tabulky.

Pokud chcete tento příklad použít ve službě Azure SQL Database nebo v databázi SQL v prostředí Fabric, nahraďte ON SERVERON 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
);

Chcete-li zahájit relaci události, proveďte následující příkaz:

ALTER EVENT SESSION pair_matching_lock_acquired_released
ON SERVER
STATE = START;

Spusťte transakci, která aktualizuje T1 tabulku, ale nepotvrďte ji ani nevracejte zpět. Tím se zajistí, že jsou zámky získány, ale nejsou uvolněny.

BEGIN TRANSACTION;
UPDATE T1
    SET id = id + 1;

Prozkoumejte výstup z každého cíle pair_matching_lock_acquired_released relace událostí v SSMS.

Cíl event_counter má následující výstup, který ukazuje, že jeden zámek zůstane nevyvolaný. Tento cíl ale nezobrazuje žádné podrobnosti o tomto zámku.

package_name   event_name      count
------------   ----------      -----
sqlserver      lock_acquired   4
sqlserver      lock_released   3

Cíl pair_matching má následující výstup, zkrácený kvůli stručnosti. Jak navrhuje event_counter výstup, skutečně vidíme jeden řádek pro neoslovenou lock_acquired událost, s dalšími podrobnostmi o události.

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

Vrácení transakce zpět

ROLLBACK;

Pokud přidáte akci do události shromážděné pair_matching cílem, shromažďují se také data akce. Například můžete zahrnout text T-SQL poskytnutý akcí sqlserver.sql_text společně s událostí. V tomto příkladu by zachytil dotaz, který získal zámek.

cíl etw_classic_sync_target

Rozšířené události na SQL Serveru můžou spolupracovat s trasováním událostí pro Windows (ETW) za účelem monitorování systémové aktivity. Další informace najdete tady:

Tento cíl ETW zpracovává data, která přijímá synchronně.