it-swarm.com.de

Was ist das richtige Tool, um große .xel-Dateien (SQL Server Extended Events-Protokolle) zu verarbeiten?

Mein Ziel ist es, alle Abfragen auf einer Instanz zu prüfen, wer sie ausführt und von wo, wie viele Lesevorgänge, um sie auf einer anderen Instanz zu konsolidieren/zu migrieren.

Der beste Weg ist, über Extended Events in .xel-Dateien über 2 Wochen diese zu kopieren und auf meinem gut spezifizierten Desktop zu analysieren. Richten Sie das Capture mit der minimalen Anzahl von Details (Feldern) ein, damit es nicht wirklich kleiner wird - ca. 12 GB in 12 Dateien. Verwendete "Erweiterte Ereignisdateien zusammenführen" in SSMS, um die .xel-Dateien zu laden und wie in https://docs.Microsoft.com/en-us/sql/relational-databases/extended-events/advanced-) beschrieben zu verarbeiten Anzeigen von Zieldaten von erweiterten Ereignissen in SQL Server? view = SQL Server 2017

Ist das wirklich der beste Weg, es zu tun? Gibt es ein besseres Tool zum Laden der Dateien? Es ist wirklich langsam mit SSMS 17.7 - Beispiel: Mit bisher nur 4 Filtern (bevor es zu Gruppierungen und Aggregaten kam) dauerte es über 12 Stunden, bis es fertig war 50% der Protokolle.

7
Razvan Zoitanu

Für große XE-Trace-Dateien verwende ich benutzerdefinierte Tools mit QueryableXEventData . Ich habe festgestellt, dass dies viel schneller ist als das XML-Parsen in T-SQL.

Im Folgenden finden Sie eine grundlegende PowerShell, die ausgewählte Felder und Aktionen aus einer rpc_completed - Ereignisablaufverfolgung in eine Tabelle in 10-KB-Stapeln importiert. Sie müssen einen Befehl Add-Type Für die Assemblys Microsoft.SqlServer.XE.Core.dll Und Microsoft.SqlServer.XEvent.Linq.dll Einfügen, der sich in Ihrem SQL Server-Installationsordner befindet. Der genaue Speicherort hängt von der SQL-Version ab und gewählter Installationsort.

$SharedPath = "C:\Program Files\Microsoft SQL Server\140\Shared";
$SqlInstanceName = "";

$xeCore = [System.IO.Path]::Combine($SharedPath, "Microsoft.SqlServer.XE.Core.dll");
$xeLinq = [System.IO.Path]::Combine($SharedPath, "Microsoft.SqlServer.XEvent.Linq.dll");
Add-Type -Path $xeLinq;

if( [System.IO.File]::Exists($xeCore) )
{
    Add-Type -Path $xeCore;
}

Beachten Sie, dass die Klasse PublishedEvent separate Sammlungen für Felder und Aktionen enthält, sodass Sie Werte aus der entsprechenden Verbindung extrahieren müssen.

# create target table
$connectionString = "Data Source=.;Initial Catalog=tempdb;Integrated Security=SSPI"
$connection = New-Object System.Data.SqlClient.SqlConnection($connectionString)
$command = New-Object System.Data.SqlClient.SqlCommand(@"
CREATE TABLE dbo.rpc_completed(
      event_name sysname
    , timestamp datetimeoffset
    , statement nvarchar(MAX)
    , username nvarchar(256)
);
"@, $connection)
$connection.Open()
[void]$command.ExecuteNonQuery()
$connection.Close()

# data table for SqlBulkCopy
$dt = New-Object System.Data.DataTable
[void]$dt.Columns.Add("event_name", [System.Type]::GetType("System.String"))
$dt.Columns["event_name"].MaxLength = 256
[void]$dt.Columns.Add("timestamp", [System.Type]::GetType("System.DateTimeOffset"))
[void]$dt.Columns.Add("statement", [System.Type]::GetType("System.String"))
[void]$dt.Columns.Add("username", [System.Type]::GetType("System.String"))
$dt.Columns["username"].MaxLength = 128
$dt.Columns["statement"].MaxLength = -1

$events = new-object Microsoft.SqlServer.XEvent.Linq.QueryableXEventData("D:\TraceFiles\Log\rpc_completed*.xel")

# import XE events from file(s)
$bcp = New-Object System.Data.SqlClient.SqlBulkCopy($connectionString)
$bcp.DestinationTableName = "dbo.rpc_completed"
$eventCount = 0
foreach($event in $events) {
    $eventCount += 1
    $row = $dt.NewRow()
    $dt.Rows.Add($row)
    $row["event_name"] = $event.Name
    $row["timestamp"] = $event.Timestamp
    $row["statement"] = $event.Fields["statement"].Value
    # username is a collected action
    $row["username"] = $event.Actions["username"].Value
    if($eventCount % 10000 -eq 0) {
        $bcp.WriteToServer($dt)
        $dt.Rows.Clear()
    }
}
$bcp.WriteToServer($dt) # write last batch
Write-Host "$eventCount records imported"
8
Dan Guzman

Der schnellste Weg, XEvents zu lesen und zu analysieren, ist derzeit die Verwendung der neuen XELite-Bibliothek von Microsoft. Sie finden es hier: XELite in NuGet.org Wenn Sie PowerShell sind, können Sie das aktualisierte SQLServer-Modul verwenden, das auf der XELite-Bibliothek basiert. Sie finden es in der Galerie: SQLServer .

1
Tomer - MSFT