Siy*_*ual 8 sql-server profiler extended-events sql-server-2017
我正在 SQL Server 2017 中运行扩展事件会话,该会话仅记录module_end
特定数据库的事件。出现此痕迹的原因有两个:
在查看一些结果时,我注意到列表中的一些过程执行了数千万次,但从来没有一次大于row_count
0。还有很多其他记录的事件row_count
似乎填充正确,因此我最初认为那些从未返回结果的应用程序被引用它们的应用程序错误调用了。然而,事实并非如此。
为了更好地查看调用过程所使用的参数,我启动了一个 Profiler 会话,仅监视这些过程调用。我正在检查的特定过程被非常频繁地调用,并且我很快就收到了大量示例调用,并关闭了探查器。从中注意到以下几点:
row_count
正确记录1
为而不是0
。以下是我正在使用的扩展事件的定义:
Create Event Session [Test Event] On Server
Add Event sqlserver.module_end
(
Action (sqlserver.database_name, sqlserver.session_id)
Where
(
sqlserver.database_name = N'TestDatabase'
And object_type = 'P'
)
)
Add Target package0.ring_buffer (Set max_events_limit = 10000, max_memory = 51200)
With
(
Max_Memory = 4096KB,
Event_Retention_Mode = Allow_Single_Event_Loss,
Max_Dispatch_Latency = 30 Seconds,
Max_Event_Size = 0KB,
Memory_Partition_Mode = None,
Track_Causality = On,
Startup_State = On
)
Go
Run Code Online (Sandbox Code Playgroud)
以及一些用于测试的示例代码:
Use TestDatabase
Go
Create Table TestTable
(
ID Int Not Null Identity (1, 1) Primary Key Clustered,
Name Varchar (20)
)
Go
Insert TestTable (Name)
Values ('Alpha'), ('Bravo'), ('Charlie'), ('Delta'), ('Echo'), ('Foxtrot'), ('Golf')
Go
Create Procedure GetTestNameByID (@ID Int)
As Begin
Set NoCount On
Select Name
From TestTable
Where ID = @ID
End
Go
Execute GetTestNameByID @ID = 2
Execute GetTestNameByID @ID = 10
Execute GetTestNameByID @ID = Null
Go
Drop Procedure GetTestNameByID
Drop Table TestTable
Go
Run Code Online (Sandbox Code Playgroud)
注意:我注意到奇怪行为的真实过程在逻辑上等同于上面的测试过程。
运行这三个Execute
语句中的每一个都会在扩展事件中产生以下结果:
在本例中,row_counts
扩展事件中的记录是正确的。然而,在实际环境中,这些都被记录为0
,尽管它们实际上是返回结果。
这是我的问题:
row_count
?0
到扩展事件?row_count
数据?我想再次强调,扩展事件会话没有发生任何更改,并且在其他存储过程的完全相同的跟踪文件中似乎有正确的结果。
我测试过的其他场景:
OPENROWSET
从不同服务器上的会话TRANSACTION
然后强制ROLLBACK
.TRANSACTION
.SET NOCOUNT ON
SELECT
或声明SET
SELECT
陈述。OUTPUT
在程序中MERGE
或UPDATE
语句。SERVICE BROKER
为 时未记录查询。is_system
True
当提供有效参数时,所有上述情况都无法产生row_count
of 。0
@ID
我试图了解它是如何发生的,反过来,也试图找出补救方法。
我知道的一种情况是通过 Service Broker Activation 调用该过程。
我能够重现(请注意,我在您的过程中添加了一条额外的语句,以便它返回更多行 - 从值 (1) (2) (3) 中选择)。
请注意,执行激活过程时最后一列is_system为 True。默认情况下不跟踪此列;您必须通过全局字段(操作)添加它