首页 > 解决方案 > Azure 说我的查询消耗了太多时间/资源,但我在代码中找不到

问题描述

Azure Query Performance Insight 显示消耗了我的大部分资源 (DTU) 的查询。它始终运行大约。每小时 80K 次。据我所知,这似乎是一个错误或有什么问题,没有什么应该经常发生。Azure 为我提供了 SQL,但我找不到生成它的 C# EF 代码。有许多站点使用此数据库。鉴于有大量代码,有一些延迟加载,以及一般的 EF“抽象”,我无法准确找到此查询发生的位置。还有其他地方可以缩小代码/控制器/操作的范围吗?

标签: azureazure-sql-database

解决方案


确保您的各种应用程序在查询字符串中使用不同的ApplicationName值。然后您可以识别哪些会话来自哪些应用程序。

您可以program_name在 sys.dm_exec_sessions中看到 ApplicationName

select session_id, program_name 
from sys.dm_exec_sessions 

您可以使用它来加入 sys.dm_exec_requests,例如

 select s.session_id, 
 s.host_name, 
 s.program_name,
 r.status,
 r.wait_type,
 r.wait_time,
 r.last_wait_type,
 r.total_elapsed_time,
 r.logical_reads,
 r.reads,
 r.writes,
 SUBSTRING(st.text, (r.statement_start_offset/2)+1, 
   ((CASE r.statement_end_offset 
    WHEN -1 THEN DATALENGTH(st.text)
    ELSE r.statement_end_offset END 
   - r.statement_start_offset)/2) + 1) AS statement_text,
 qp.query_plan
 from sys.dm_exec_requests r
 join sys.dm_exec_sessions s
  on r.session_id = s.session_id 
 outer apply sys.dm_exec_query_plan(r.plan_handle) qp
 outer apply sys.dm_exec_sql_text(r.sql_handle) st
 where r.plan_handle is not null
   and r.session_id <> @@spid
 order by logical_reads desc

client_app_name在 XEvents 会话中

CREATE EVENT SESSION [queries] ON DATABASE 
ADD EVENT sqlserver.rpc_completed(
    ACTION(sqlserver.client_app_name,sqlserver.sql_text,sqlserver.username)),
ADD EVENT sqlserver.sql_batch_completed(
    ACTION(sqlserver.client_app_name,sqlserver.sql_text,sqlserver.username))
ADD TARGET package0.ring_buffer
GO

如果您使用的是 EF Core,则可以添加查询标签以传递来自客户端代码的相关名称,以评论生成的 SQL 查询。

但基本方法是在应用程序中打开EF 日志记录,然后查找查询文本并将其追溯到生成查询的方法。


推荐阅读