Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná 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:
- Seznamte se se základy rozšířených událostí, jak je popsáno v rychlém startu: Rozšířené události.
- Použijte nejnovější verzi aplikace SQL Server Management Studio (SSMS).
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
filenamezadáteADD TARGETparametr. Přípona souboru musí býtxel.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
xelpřípona.Volitelně můžete zadat
MAX_FILE_SIZEparametr. 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_FILESmožnost zvolit maximální počet souborů, které se mají zachovat v systému souborů kromě aktuálního souboru. Výchozí hodnota jeUNLIMITED. KdyžMAX_ROLLOVER_FILESse vyhodnotí, pokud počet souborů překročíMAX_ROLLOVER_FILESnastavení, 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 v2Je 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:
- Spravovaná identita logického serveru Azure SQL Database.
- Spravovaná identita spravované instance Azure SQL.
- Spravovaná identita virtuálního počítače Azure hostujícího instanci SQL Serveru. Další informace najdete v tématu Jak spravované identity pro prostředky Azure fungují s virtuálními počítači Azure.
- Spravovaná identita instance SQL Serveru s podporou Arc.
Jakmile je přiřazení role RBAC nastaveno, proveďte následující kroky:
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
masterdatabá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
masterdatabá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';- Ve všech třech výskytech
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.
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.
-
Oprávnění nastavená na
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.SECRETV 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
masterdatabá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
masterdatabá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>';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:
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í.
Klikněte pravým tlačítkem myši na složku Relace a vyberte Možnost Nová relace....
Na stránce Obecné zadejte název relace, což je
example-sessionpro následující vzorový kód.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_startingudálost.Na stránce Úložiště dat vyberte
event_filejako 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.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í.
Vyberte OK a vytvořte relaci.
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:
- Spravovaná identita používaná databázovým strojem nemá požadované přiřazení role RBAC. Další informace najdete v tématu Udělení přístupu pomocí spravované identity.
- Je povolena brána firewall účtu úložiště a je povolena také výjimka, která umožňuje důvěryhodným službám Azure přístup k účtu úložiště, ale instance prostředku pro logický server nebyla přidána do seznamu instancí prostředků, kterým je udělen přístup. Další informace najdete v tématu Udělení přístupu z instancí prostředků Azure.
- Pokud používáte perimetr zabezpečení sítě s vynuceným režimem, databáze a účet úložiště nejsou ve stejném perimetru.
- 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ě.
- Pokud používáte ověřování spravované identity:
-
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á
histogramjako cíl a třídí události podleobject_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 proceduruB.
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ě.
Související obsah
- přehled rozšířených událostí
- Rychlý start: Rozšířené události
- Rozšířené události v Azure SQL