Jaka jest maksymalna liczba dozwolonych działań powiązanych dla zdarzenia rozszerzonego?

14

Jeśli dodasz „zbyt wiele” akcji do zdarzenia w sesji zdarzenia, pojawi się ten błąd:

Msg 25639, poziom 16, stan 23, wiersz 1 Zdarzenie „[nazwa zdarzenia]” przekracza liczbę dozwolonych działań powiązanych.

Ile akcji jest dozwolonych? Czy to zależy od wydarzenia?

Odpowiedź, oparta na eksperymentach, wydaje się być na 27 dla sqlserver.rpc_completed. Ale nie znalazłem tego numeru w żadnej dokumentacji Microsoft . I wydaje się, że zależy to od wydarzenia, ponieważ udało mi się zdobyć 30 za sqlserver.sql_batch_completed.

Przykładowy kod, który nie działa:

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

Przykładowy kod, który się powiedzie (to samo z wyjątkiem ostatniego elementu):

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

(Próbowałem kilku różnych akcji i wydaje się, że nie ma to związku z tym, które akcje są uwzględnione - ale może opiera się na całkowitej liczbie znaków w nazwach akcji?)

Pełna lista działań, nad którymi pracowałem:

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

@@ WERSJA Wyjście:

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
źródło

Odpowiedzi:

9

Ile akcji jest dozwolonych? Czy to zależy od wydarzenia?

Zrobiłem trochę badań i tak, istnieje ograniczenie liczby działań i zdarzeń, które można dodać do rozszerzonej definicji zdarzenia. Nie jest to „twarda” wartość, ale oparta na wielu różnych danych wejściowych, dlatego jedna definicja, która nie działa, może działać po usunięciu pojedynczego zdarzenia lub pojedynczej akcji w jednym zdarzeniu.

I wydaje się, że zależy to od wydarzenia, ponieważ udało mi się zdobyć 30 za sqlserver.sql_batch_completed.

Natknąłeś się już na niezliczoną liczbę możliwych konfiguracji, więc wiesz, że nie jest to całkowicie oparte na liczbie działań. Nie jest również specyficzne dla każdego zdarzenia, ale jest kombinacją wartości.

Co możesz zrobić?

Pierwszą rzeczą jest to, że dane o zmiennej długości są największym problemem, z którym się zmierzysz. Skąd wiesz, co jest zmienną długością, a co nie? Jeśli spojrzysz w katalogu XE sys.dm_xe_objectskonkretnie na niektóre działania, zobaczysz, że są tam kolumny type_namei type_sizekolumny, które mogą być przydatne, aby sprawdzić, czy dodajesz kilka punktów danych o zmiennej wielkości (rozmiar 0 na zrzucie ekranu poniżej).

wprowadź opis zdjęcia tutaj

Teraz pewnie myślisz - ok, to świetnie, ale nie znam magicznej granicy, więc to naprawdę nie jest pomocne. Cóż, jest i nie jest. Jeśli spojrzysz na to z liczbowego punktu widzenia, to tak, to nie jest bardzo pomocne ... ale to okropny sposób na to spojrzeć. Należy na to spojrzeć: „Czy zbieram tylko te dane, których potrzebuję?” iw większości przypadków nigdy nie napotkasz problemu z tym błędem.

Jeśli weźmiemy definicję zawartą w pytaniu, która nie działa, niektóre z zebranych informacji wydają się być tak naprawdę niepotrzebne. Czy naprawdę potrzebujesz stosu połączeń, bieżącego identyfikatora wątku, czasu cyklu procesora, adresu pracownika i adresu harmonogramu? Callstack jest zmienny, reszta jest stała, więc po prostu eliminując callstack, możesz w razie potrzeby zmieścić więcej kolumn. Nie mówię, że potrzebujesz więcej, ale możesz.

Sensem jest ograniczenie definicji być tak małe jak to potrzebne. Gromadzenie wszystkiego spowoduje albo błędy (jak tutaj), spowolnienie systemu, zbyt wiele danych do analizy, a nawet zatrzymanie systemu. To, że możesz, nie oznacza, że ​​powinieneś. Nic nie wskazuje, że limity te zmieniają się między wersjami głównymi lub mniejszymi, więc utrzymanie prawdziwej minimalnej potrzeby jest najlepszym zapobieganiem. Proszę nie zaznaczać tylko każdego pola (gui) ani dodawać każdej możliwej akcji.

Sean Gallardy
źródło
Wystąpiły podobne problemy podczas dodawania zbyt wielu zdarzeń do jednej sesji podczas testowania opracowanego przeze mnie narzędzia QueryableXEventData . Dobrym wskazaniem jest określenie tylko tych zdarzeń, działań i pól, które są rzeczywiście potrzebne.
Dan Guzman