Genişletilmiş bir etkinlik için izin verilen maksimum bağlı işlem sayısı nedir?


14

Bir olay oturumundaki bir etkinliğe "çok fazla" eylem eklerseniz, bu hatayı alırsınız:

Msg 25639, Seviye 16, Durum 23, Satır 1 "[olay adı]" olayı, izin verilen bağlı eylem sayısını aşıyor.

Kaç eyleme izin verilir? Olaya göre değişiyor mu?

Denemeye dayanan cevap, 27 için görünüyor sqlserver.rpc_completed. Ancak bu sayıyı Microsoft belgelerinde bulamadım . Ve 30 için alabildiğim için olaya göre değişiyor gibi görünüyor sqlserver.sql_batch_completed.

Başarısız olan örnek kod:

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

Başarılı olan örnek kod (son öğe hariç hariç):

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

(Birkaç farklı işlemi denedim ve hangi eylemlerin dahil olduğu ile ilgili görünmüyor - ama belki de eylem adlarının toplam karakter sayısına dayanıyor?)

Birlikte çalıştığım eylemlerin tam listesi:

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 Çıktı:

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)

Yanıtlar:


9

Kaç eyleme izin verilir? Olaya göre değişiyor mu?

Biraz araştırma yaptım ve evet, genişletilmiş olay tanımına eklenebilecek eylem ve olay sayısında bir sınır var. Bu "zor" bir değer değildir, ancak birçok farklı girdiye dayanır, bu nedenle çalışmayan bir tanım yalnızca tek bir olayın veya tek bir olayın tek bir eyleminin kaldırılmasıyla işe yarayabilir.

Ve olaylara göre değişiyor gibi görünüyor, çünkü 30 sqlserver.sql_batch_completed.

Zaten mümkün olan sayısız konfigürasyona rastladınız, bu yüzden tamamen eylem sayısına dayanmadığını biliyorsunuz. Ayrıca her olaya özgü değil, değerlerin birleşimidir.

Ne yapabilirsin?

İlk öğe, değişken uzunluktaki verilerin karşılaşacağınız en büyük sorun olmasıdır. Değişken uzunluğun ne olduğunu ve ne olmadığını nasıl bilebilirsiniz? XE kataloğuna sys.dm_xe_objectsözellikle bazı eylemlerde bakarsanız, bir grup değişken boyutlu veri noktası ekleyip eklemediğinizi görmek için yararlı olabilecek sütunlar type_nameve type_sizesütunlar göreceksiniz (aşağıdaki ekran görüntüsünde 0 boyutu).

resim açıklamasını buraya girin

Şimdi, muhtemelen düşünüyorsunuz - tamam bu harika ama büyülü sınırı bilmiyorum, bu yüzden gerçekten yararlı değil. Şey, öyle ve değil. Özellikle bir sayı açısından bakarsanız, evet çok yararlı değil ... ancak bu ona bakmak için korkunç bir yoldur. "Yalnızca ihtiyacım olan verileri topluyor muyum?" ve çoğu durumda bu hatayla hiçbir zaman karşılaşmazsınız.

Sorunun işe yaramadığı tanımı alırsak, toplanan bazı bilgiler gerçekten gerekli görünmüyormuş gibi görünür. Gerçekten çağrı bekletme, geçerli iş parçacığı kimliği, işlemci döngü süresi, işçi adresi ve zamanlayıcı adresine ihtiyacınız var mı? Callstack değişkendir, geri kalanı sabittir, bu nedenle gerekirse daha fazla sütuna sığabileceğiniz çağrı kaydını ortadan kaldırırsınız. Artık ihtiyacın olduğunu söylemiyorum ama yapabilirsin.

Bütün mesele, tanımı gerektiği kadar küçük olarak sınırlamaktır . Her şeyi toplamak ya hatalara (burada olduğu gibi), sistem yavaşlığına, analiz için çok fazla veriye, hatta sistemin durdurulmasına neden olacaktır. Sadece yapabileceğin için yapman gerektiği anlamına gelmez. Bu sınırların büyük veya küçük sürümler arasında değişeceğini veya değişmeyeceğini belirten hiçbir şey yoktur, bu nedenle gerçek asgari ihtiyacı korumak en iyi önlemdir. Lütfen her kutuyu (GUI) işaretlemeyin veya mümkün olan her işlemi eklemeyin.


Geliştirdiğim QueryableXEventData aracını test ederken tek bir oturuma çok fazla olay eklerken benzer sorunlarla karşılaştım . Sadece gerçekten ihtiyaç duyulan olayları, eylemleri ve alanları belirtmek iyi bir tavsiye.
Dan Guzman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.