Berapa jumlah maksimum dari tindakan terikat yang diizinkan untuk acara yang diperpanjang?

14

Jika Anda menambahkan tindakan "terlalu banyak" ke suatu acara di sesi acara, Anda akan menerima kesalahan ini:

Msg 25639, Level 16, Negara 23, Baris 1 Acara, "[nama acara]", melebihi jumlah tindakan terikat yang diizinkan.

Berapa banyak tindakan yang diizinkan? Apakah ini berbeda menurut peristiwa?

Jawabannya, berdasarkan eksperimen, nampaknya 27 untuk sqlserver.rpc_completed. Tetapi saya belum menemukan nomor itu di dokumentasi Microsoft apa pun . Dan tampaknya bervariasi berdasarkan acara, karena saya bisa mendapatkan 30 untuk sqlserver.sql_batch_completed.

Contoh kode yang gagal:

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

Kode contoh yang berhasil (sama kecuali mengecualikan item terakhir):

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

(Saya mencoba beberapa tindakan berbeda dan sepertinya tidak berhubungan dengan tindakan mana yang dimasukkan - tapi mungkin itu didasarkan pada jumlah karakter total nama tindakan?)

Daftar lengkap tindakan yang saya kerjakan:

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

@@ Keluaran 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)
Riley Major
sumber

Jawaban:

9

Berapa banyak tindakan yang diizinkan? Apakah ini berbeda menurut peristiwa?

Saya melakukan riset dan ya, ada batasan jumlah tindakan dan peristiwa yang dapat ditambahkan ke definisi acara yang diperluas. Ini bukan nilai "keras" tetapi didasarkan pada banyak input yang berbeda, sehingga satu definisi yang tidak berfungsi bisa bekerja hanya dengan menghapus satu peristiwa atau satu tindakan dalam satu peristiwa.

Dan tampaknya bervariasi berdasarkan acara, karena saya bisa mendapatkan 30 untuk sqlserver.sql_batch_completed.

Anda telah menemukan banyak sekali konfigurasi yang mungkin, jadi Anda tahu itu tidak sepenuhnya didasarkan pada jumlah tindakan. Ini juga tidak spesifik untuk setiap acara, tetapi kombinasi dari nilai-nilai.

Apa yang bisa kau lakukan?

Item pertama adalah bahwa data panjang variabel adalah masalah terbesar yang akan Anda hadapi. Bagaimana Anda tahu panjang variabel dan apa yang tidak? Jika Anda melihat di katalog XE sys.dm_xe_objectssecara khusus pada beberapa tindakan, Anda akan melihat ada type_namedan type_sizekolom yang dapat berguna untuk melihat apakah Anda menambahkan sekelompok titik data berukuran variabel (ukuran 0 pada tangkapan layar di bawah).

masukkan deskripsi gambar di sini

Sekarang, Anda mungkin berpikir - ok itu bagus tapi saya tidak tahu batas magis sehingga itu benar-benar tidak membantu. Ya, memang dan tidak. Jika Anda secara khusus melihatnya dari sudut pandang angka maka ya itu tidak terlalu membantu ... namun ini adalah cara yang mengerikan untuk melihatnya. Itu harus dilihat sebagai, "Apakah saya hanya mengumpulkan data yang saya butuhkan?" dan dalam kebanyakan kasus Anda tidak akan pernah mengalami masalah dengan kesalahan ini.

Jika kita mengambil definisi dalam pertanyaan yang tidak berhasil, beberapa informasi yang dikumpulkan tampaknya tidak diperlukan. Apakah Anda benar-benar membutuhkan callstack, id utas saat ini, waktu siklus cpu, alamat pekerja, dan alamat penjadwal? Callstack adalah variabel, sisanya sudah diperbaiki, jadi hilangkan saja callstack yang bisa Anda masukkan dalam lebih banyak kolom jika diperlukan. Saya tidak mengatakan Anda perlu lagi tetapi Anda bisa.

Intinya adalah membatasi definisi menjadi sekecil yang diperlukan. Mengumpulkan semuanya akan menghasilkan kesalahan (seperti yang Anda alami di sini), kelambatan sistem, terlalu banyak data untuk dianalisis, atau bahkan sistem terhenti. Hanya karena Anda tidak dapat berarti Anda harus melakukannya. Tidak ada yang menyatakan bahwa batasan-batasan ini akan atau tidak akan berubah antara versi besar atau kecil, jadi menjaga kebutuhan minimum yang sebenarnya adalah pencegahan terbaik . Tolong jangan hanya mencentang setiap kotak (gui) atau menambahkan setiap tindakan yang mungkin.

Sean Gallardy
sumber
Saya mengalami masalah serupa ketika menambahkan terlalu banyak acara ke satu sesi ketika menguji alat QueryableXEventData yang saya kembangkan. Menentukan hanya peristiwa, tindakan, dan bidang yang benar-benar dibutuhkan adalah saran yang bagus.
Dan Guzman