首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >失败的合并语句:如何使用XEvents进行监视,并为准备好的语句专门获取参数值?

问失败的合并语句:如何使用XEvents进行监视,并为准备好的语句专门获取参数值?
EN

Database Administration用户
提问于 2019-12-13 08:54:04
回答 1查看 113关注 0票数 1

我的问题

我正在运行Server 2017,希望使用合并语句调查一个错误,如下所示

代码语言:javascript
复制
MERGE INTO table
USING 
    (SELECT ? AS Search_Col) AS SRC
    ON table.blobTask_id = SRC.Search_Col
WHEN MATCHED THEN
    UPDATE SET
    x= ?,
    y= ?,
    z= ? 
WHEN NOT MATCHED THEN
    INSERT (blobTask_id ,x, y, z, ) 
    VALUES (SRC.Search_Col, ?, ?, ?)

错误是

违反唯一密钥约束‘IX_U_CCC_GDV_CONTENTCCC__blobTask任务_id’。无法在对象“表”中插入重复键。声明已被终止。

我知道合并语句附带了serveral 格查斯。然而,我可以超越典型的问题(没有触发器,在表上的数据修改上没有并发性)。

奇怪的是,这个错误只是偶尔出现一次,并且再次执行该语句是没有错误的。

我的诊断方法

我为问题语句的query_hash设置了扩展事件会话筛选。耶利米·佩施卡( Jeremiah )有一个很棒的博客帖子,我就是这样做的。

目前,我的XEvent会话如下所示:

代码语言:javascript
复制
CREATE EVENT SESSION [query hash] ON SERVER 
ADD EVENT sqlserver.prepare_sql(
    ACTION(package0.collect_system_time,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name)
    WHERE ([sqlserver].[query_hash]=(6577967268103212561.))),
ADD EVENT sqlserver.sp_statement_completed(SET collect_statement=(1)
    ACTION(package0.collect_system_time,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name,sqlserver.sql_text)
    WHERE ([sqlserver].[query_hash]=(6577967268103212561.))),
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(package0.collect_system_time,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name)
    WHERE ([sqlserver].[query_hash]=(6577967268103212561.)))
ADD TARGET package0.event_file(SET filename=N'X:\DB_Data\query_hash.xel',max_file_size=(5),max_rollover_files=(5),metadatafile=N'X:\DB_Data\query_hash.xem')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=5 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO

我的问题

问题是,在这个会话中,我只获得如下所示的录音:

不知何故,只有sp_statement_completed事件出现。为了调试这个问题,获取SQL的参数是至关重要的。

特定问题:如何修改XEvent会话以显示param值?

我本来希望从prepare_sql事件中得到这些信息,但是由于我的过滤器,它没有出现在session....perhaps中?

通用请求帮助:如果您知道其他有效解决问题和缓解问题的方法,请也让我知道.

。

我们非常感谢你的帮助。

提前谢谢你

马丁

EN

回答 1

Database Administration用户

发布于 2019-12-13 12:23:51

谢谢你丹·古兹曼。rpc_completed对我来说是个失踪事件。不幸的是,没有简单的筛选可能是查询哈希,因为没有一个与sp_executesql过程调用相关联的。因此,我选择了对sqltext本身进行筛选(可能是一个代价高昂的操作,但它可以工作)。

这是我最后一次XEvent会话,以防有人利用它:

代码语言:javascript
复制
DROP EVENT SESSION [query hash] ON SERVER;
GO
CREATE EVENT SESSION [query hash] ON SERVER 
ADD EVENT sqlserver.sp_statement_completed(SET collect_statement=(1)
    ACTION(package0.collect_system_time,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name,sqlserver.sql_text,sqlserver.session_id)
    WHERE ([sqlserver].[query_hash]=(6577967268103212561.))),
ADD EVENT sqlserver.rpc_completed(
    ACTION(package0.collect_system_time,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name, sqlserver.query_hash)
    --WHERE ([sqlserver].[query_hash]=(6577967268103212561.))
    WHERE sqlserver.sql_text LIKE '%ERGE INTO table%'
    ),
ADD EVENT sqlserver.error_reported(
    ACTION(package0.collect_system_time,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name,sqlserver.sql_text,sqlserver.session_id)
    WHERE (([error_number]=2627))
    )
ADD TARGET package0.ring_buffer(SET max_events_limit=(100000),max_memory=(512000))
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=5 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO

现在,我等待下一个错误发生,并将张贴的结果和解决方案后,我有一个。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/255563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档