首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用准备好的语句捕获慢速查询

问用准备好的语句捕获慢速查询
EN

Database Administration用户
提问于 2019-07-05 12:54:28
回答 1查看 185关注 0票数 2

我使用扩展事件来标识慢速查询,定义为需要超过2秒才能完成的查询,如下所示:

代码语言:javascript
复制
CREATE EVENT SESSION SlowQueries ON SERVER 
ADD EVENT sqlserver.sql_statement_completed
    (
    ACTION
        (
        sqlserver.client_hostname,
        sqlserver.sql_text,
        sqlserver.database_id,
        sqlserver.tsql_stack,
        sqlserver.username
        )
    WHERE 
        (
        duration > 2000000
        )
    ) 
ADD TARGET package0.asynchronous_file_target
    (
    SET filename='D:\SlowQueries.xel'
    )
WITH 
    (
    MAX_MEMORY=256 KB,
    EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
    MAX_DISPATCH_LATENCY=30 SECONDS,
    MAX_EVENT_SIZE=0 KB,
    MEMORY_PARTITION_MODE=NONE,
    TRACK_CAUSALITY=OFF,
    STARTUP_STATE=ON
    );

但是,我从Server概要文件中注意到,PHP/Laravel应用程序不是直接发送语句,而是使用RPC:Completed:它们看起来像准备好的语句,在运行时接收参数。如何扩展我的SlowQueries以包括通过RPC:Completed执行的语句?我100%确信正在发生缓慢的查询,但我的事件没有报告。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2019-07-05 14:57:07

,在那里,

扩展事件具有已完成的rpc类:

SELECT * FROM sys.dm_xe_objects AS dxo WHERE dxo.name = 'rpc_completed';

如果需要显示所使用的参数,则可能需要尝试下列事件之一:

代码语言:javascript
复制
CREATE EVENT SESSION what_do_i_get
    ON SERVER
    ADD EVENT sqlserver.module_end
    ( SET collect_statement = ( 1 )
WHERE ( sqlserver.session_id = ( 55 ))),
    ADD EVENT sqlserver.rpc_completed
    ( WHERE ( sqlserver.session_id = ( 55 ))),
    ADD EVENT sqlserver.sp_statement_completed
    ( WHERE ( sqlserver.session_id = ( 55 ))),
    ADD EVENT sqlserver.sql_batch_completed
    ( WHERE ( sqlserver.session_id = ( 55 ))),
    ADD EVENT sqlserver.sql_statement_completed
    ( WHERE ( sqlserver.session_id = ( 55 )))
    ADD TARGET package0.event_file
    ( SET filename = N'what_do_i_get' )
    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 = OFF );
GO

不过,sql_text列无助于您,您需要使用我相信的statement列,这取决于语句的执行方式。

另外,如果您使用的是sp_prepare,您可能需要小心。

请看我在这里的帖子:

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

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

复制
相关文章

相似问题

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