Яка максимальна кількість допустимих обмежених дій для розширеної події?


14

Якщо ви додасте "занадто багато" дій до події в сеансі події, ви отримаєте цю помилку:

Msg 25639, рівень 16, стан 23, рядок 1 Подія, "[назва події]", перевищує кількість допустимих обмежених дій.

Скільки дій дозволено? Чи змінюється це залежно від події?

Відповідь, заснована на експерименті, виявляється 27 за sqlserver.rpc_completed. Але я не знайшов цього номера в жодній документації Microsoft . І це, здається, змінюється залежно від події, оскільки мені вдалося отримати 30 за sqlserver.sql_batch_completed.

Приклад коду, який не вдається:

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

Приклад коду, який вдається (той самий, за винятком останнього елемента):

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

(Я спробував декілька різних дій, і, схоже, це не стосується того, які дії включені-- але, можливо, він заснований на загальній кількості імен дій?)

Повний перелік дій, з якими я працював:

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 Вихід:

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)

Відповіді:


9

Скільки дій дозволено? Чи змінюється це залежно від події?

Я провів деякі дослідження, і так, існує обмеження кількості дій та подій, які можна додати до розширеного визначення події. Це не "важке" значення, але засноване на безлічі різних входів, тому одне визначення, яке не працює, може працювати лише з видаленням однієї події або однією дією в одній події.

І це, здається, змінюється залежно від події, оскільки мені вдалося отримати 30 за sqlserver.sql_batch_completed.

Ви вже натрапили на безліч можливих конфігурацій, тож знаєте, що це не повністю засноване на кількості дій. Це також не конкретно для кожної події, а поєднання значень.

Що ти можеш зробити?

Перший пункт - це те, що дані змінної довжини є найбільшою проблемою, з якою ви стикаєтесь. Як ви знаєте, що змінна довжина, а що ні? Якщо подивитися в каталозі ХЕ sys.dm_xe_objectsконкретно на деякі дії, ви побачите там type_nameі type_sizeстовпці , які можуть бути корисні , щоб побачити , якщо ви додаєте купу змінних розмірів точок даних (розмір 0 в скріншоті нижче).

введіть тут опис зображення

Тепер ви, напевно, думаєте - гаразд це чудово, але я не знаю магічної межі, тому це насправді не корисно. Ну, це так, і це не так. Якщо ви спеціально дивитесь на це з точки зору чисел, то так, це не дуже корисно ... однак це жахливий спосіб дивитися на це. Це слід розглядати як "Я збираю лише ті потрібні мені дані?" і в більшості випадків ви ніколи не зіткнетеся з проблемою з цією помилкою.

Якщо ми беремо визначення у питанні, яке не працює, частина зібраної інформації здається, що вона насправді не потрібна. Вам дійсно потрібен стек виклику, поточний ідентифікатор потоку, час циклу процесора, адреса працівника та адреса планувальника? Callstack мінливий, решта - виправлені, тому просто усуваючи стовп виклику, ви могли б поміститись у більше стовпців, якщо потрібно. Я не кажу, що вам більше не потрібно, але ви могли.

Вся справа в тому, щоб обмеження визначення було настільки ж маленьким, наскільки це потрібно. Якщо зібрати все, це призведе до помилок (як у вас тут), сповільнення системи, занадто багато даних для аналізу, або навіть зупинки системи. Просто тому, що ти не можеш означати, що ти повинен. Ніщо не говорить про те, що ці обмеження не змінюватимуться або не змінюватимуться між основними або незначними версіями, тому дотримання справжньої мінімальної потреби є найкращою профілактикою. Будь ласка, не проставляйте прапорець у кожному полі (gui) або додайте всі можливі дії.


Я зіткнувся з подібними проблемами, додаючи занадто багато подій до одного сеансу під час тестування інструменту QueryableXEventData, який я розробляв. Вказання лише тих подій, дій та полів, які насправді потрібні, є корисною порадою.
Дан Гузман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.