Was ist die maximale Anzahl zulässiger gebundener Aktionen für ein erweitertes Ereignis?

14

Wenn Sie einem Ereignis in einer Ereignissitzung "zu viele" Aktionen hinzufügen, erhalten Sie folgende Fehlermeldung:

Meldung 25639, Ebene 16, Status 23, Zeile 1 Das Ereignis "[Ereignisname]" überschreitet die Anzahl der zulässigen gebundenen Aktionen.

Wie viele Aktionen sind erlaubt? Variiert es je nach Ereignis?

Die experimentelle Antwort scheint 27 für zu sein sqlserver.rpc_completed. Aber ich habe diese Nummer in keiner Microsoft-Dokumentation gefunden . Und es scheint von Ereignis zu Ereignis zu variieren, da ich 30 für bekommen konnte sqlserver.sql_batch_completed.

Beispielcode, der fehlschlägt:

CREATE EVENT SESSION [Test] ON SERVER 
ADD EVENT sqlserver.rpc_completed(
    ACTION(
        package0.callstack,
        package0.collect_cpu_cycle_time,
        package0.collect_current_thread_id,
        package0.collect_system_time,
        package0.event_sequence,
        package0.last_error,
        package0.process_id,
        sqlos.cpu_id,
        sqlos.numa_node_id,
        sqlos.scheduler_address,
        sqlos.scheduler_id,
        sqlos.system_thread_id,
        sqlos.task_address,
        sqlos.task_elapsed_quantum,
        sqlos.task_resource_group_id,
        sqlos.task_resource_pool_id,
        sqlos.task_time,
        sqlos.worker_address,
        sqlserver.client_app_name,
        sqlserver.client_connection_id,
        sqlserver.client_hostname,
        sqlserver.client_pid,
        sqlserver.context_info,
        sqlserver.database_id,
        sqlserver.database_name,
        sqlserver.is_system,
        sqlserver.nt_username,
        sqlserver.plan_handle))
GO
DROP EVENT SESSION [Test] ON SERVER
GO

Beispielcode, der erfolgreich ist (der gleiche mit Ausnahme des letzten Elements):

CREATE EVENT SESSION [Test] ON SERVER 
ADD EVENT sqlserver.rpc_completed(
    ACTION(
        package0.callstack,
        package0.collect_cpu_cycle_time,
        package0.collect_current_thread_id,
        package0.collect_system_time,
        package0.event_sequence,
        package0.last_error,
        package0.process_id,
        sqlos.cpu_id,
        sqlos.numa_node_id,
        sqlos.scheduler_address,
        sqlos.scheduler_id,
        sqlos.system_thread_id,
        sqlos.task_address,
        sqlos.task_elapsed_quantum,
        sqlos.task_resource_group_id,
        sqlos.task_resource_pool_id,
        sqlos.task_time,
        sqlos.worker_address,
        sqlserver.client_app_name,
        sqlserver.client_connection_id,
        sqlserver.client_hostname,
        sqlserver.client_pid,
        sqlserver.context_info,
        sqlserver.database_id,
        sqlserver.database_name,
        sqlserver.is_system,
        sqlserver.nt_username))
GO
DROP EVENT SESSION [Test] ON SERVER
GO

(Ich habe ein paar verschiedene Aktionen ausprobiert und es scheint sich nicht darauf zu beziehen, welche Aktionen enthalten sind - aber basiert es vielleicht auf der Gesamtanzahl der Zeichen der Aktionsnamen?)

Vollständige Liste der Aktionen, mit denen ich gearbeitet habe:

package0.callstack,
package0.collect_cpu_cycle_time,
package0.collect_current_thread_id,
package0.collect_system_time,
package0.event_sequence,
package0.last_error,
package0.process_id,
sqlos.cpu_id,
sqlos.numa_node_id,
sqlos.scheduler_address,
sqlos.scheduler_id,
sqlos.system_thread_id,
sqlos.task_address,
sqlos.task_elapsed_quantum,
sqlos.task_resource_group_id,
sqlos.task_resource_pool_id,
sqlos.task_time,
sqlos.worker_address,
sqlserver.client_app_name,
sqlserver.client_connection_id,
sqlserver.client_hostname,
sqlserver.client_pid,
sqlserver.context_info,
sqlserver.database_id,
sqlserver.database_name,
sqlserver.is_system,
sqlserver.nt_username,
sqlserver.plan_handle,
sqlserver.query_hash,
sqlserver.query_hash_signed,
sqlserver.query_plan_hash,
sqlserver.query_plan_hash_signed,
sqlserver.request_id,
sqlserver.server_instance_name,
sqlserver.server_principal_name,
sqlserver.server_principal_sid,
sqlserver.session_id,
sqlserver.session_nt_username,
sqlserver.session_resource_group_id,
sqlserver.session_resource_pool_id,
sqlserver.session_server_principal_name

@@ VERSION Ausgabe:

Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) 
    Oct 28 2016 18:17:30 
    Copyright (c) Microsoft Corporation
    Developer Edition (64-bit) on Windows Server 2012 R2 Standard 6.3 <X64> (Build 9600: ) (Hypervisor)
Riley Major
quelle

Antworten:

9

Wie viele Aktionen sind erlaubt? Variiert es je nach Ereignis?

Ich habe einige Nachforschungen angestellt und ja, die Anzahl der Aktionen und Ereignisse, die zu einer erweiterten Ereignisdefinition hinzugefügt werden können, ist begrenzt. Es ist kein "harter" Wert, sondern basiert auf vielen verschiedenen Eingaben, sodass eine Definition, die nicht funktioniert, nur mit dem Entfernen eines einzelnen Ereignisses oder einer einzelnen Aktion in einem einzelnen Ereignis funktionieren kann.

Und es scheint von Ereignis zu Ereignis zu variieren, da ich 30 für bekommen konnte sqlserver.sql_batch_completed.

Sie sind bereits auf die unzähligen möglichen Konfigurationen gestoßen, sodass Sie wissen, dass dies nicht ausschließlich auf der Anzahl der Aktionen basiert. Es ist auch nicht für jedes Ereignis spezifisch, sondern eine Kombination der Werte.

Was kannst du tun?

Der erste Punkt ist, dass Daten mit variabler Länge das größte Problem sind, mit dem Sie konfrontiert werden. Woher wissen Sie, was variable Länge ist und was nicht? Wenn Sie in dem XE Katalog suchen sys.dm_xe_objectsauf einigen Aktionen speziell, werden Sie sehen, es gibt type_nameund type_sizeSpalten , die nützlich sein können , um zu sehen , wenn Sie eine Reihe von variabler Größe Datenpunkten (Größe 0 in der Abbildung unten) hinzufügen.

Bildbeschreibung hier eingeben

Jetzt denkst du wahrscheinlich - ok, das ist großartig, aber ich kenne das magische Limit nicht, also ist es wirklich nicht hilfreich. Nun, es ist und ist es nicht. Wenn Sie es aus einer Zahlenperspektive betrachten, dann ist es ja nicht sehr hilfreich ... aber dies ist eine schreckliche Sichtweise. Es sollte so aussehen: "Sammle ich nur die Daten, die ich brauche?" und in den meisten Fällen werden Sie mit diesem Fehler nie auf ein Problem stoßen.

Wenn wir die Definition in der Frage nehmen, die nicht funktioniert, scheinen einige der gesammelten Informationen wirklich nicht benötigt zu werden. Benötigen Sie wirklich Callstack, aktuelle Thread-ID, CPU-Zykluszeit, Worker-Adresse und Scheduler-Adresse? Callstack ist variabel, der Rest ist fest, so dass Sie den Callstack einfach weglassen können, wenn Sie mehr Spalten benötigen. Ich sage nicht, dass Sie mehr brauchen , aber Sie könnten.

Der springende Punkt ist zu begrenzen , die Definition so klein zu sein , je nach Bedarf. Das Sammeln aller Daten führt entweder zu Fehlern (wie hier), zu Langsamkeit des Systems, zu viel Daten für die Analyse oder sogar zum Anhalten des Systems. Nur weil Sie können, heißt das nicht, dass Sie sollten. Es gibt nichts, was besagt, dass sich diese Grenzwerte zwischen Haupt- und Nebenversionen ändern oder nicht. Daher ist es die beste Vorbeugung , den tatsächlichen Mindestbedarf zu halten . Bitte nicht einfach jedes Kästchen (gui) ankreuzen oder jede mögliche Aktion hinzufügen.

Sean sagt Entfernen Sie Sara Chipps
quelle
Beim Testen eines von mir entwickelten QueryableXEventData- Tools sind ähnliche Probleme aufgetreten , als zu viele Ereignisse zu einer einzelnen Sitzung hinzugefügt wurden . Es empfiehlt sich, nur die Ereignisse, Aktionen und Felder anzugeben, die tatsächlich benötigt werden.
Dan Guzman