Eu uso eventos estendidos para identificar consultas lentas, definidas como consultas que levam mais de 2 segundos para serem concluídas, assim:
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
);
No entanto, notei nos perfis do SQL Server que um aplicativo PHP/Laravel não está enviando instruções diretamente, mas usando RPC:Completed: elas parecem instruções preparadas, recebendo o argumento em tempo de execução. Como faço para expandir minhas SlowQueries para incluir instruções executadas via RPC:Completed? Tenho 100% de certeza de que as consultas lentas estão acontecendo, mas não relatadas pelo meu evento.
Está lá
Eventos estendidos têm a classe rpc concluída:
SELECT * FROM sys.dm_xe_objects AS dxo WHERE dxo.name = 'rpc_completed';
Se você precisar mostrar os parâmetros usados, talvez seja necessário tentar um destes eventos:
A
sql_text
coluna não irá ajudá-lo, porém, você vai querer usar astatement
coluna que eu acredito, dependendo de como as instruções são executadas.Como uma nota lateral, você pode querer ter cuidado se estiver usando
sp_prepare
.Veja meu post aqui: