azure - Azure 说我的查询消耗了太多时间/资源,但我在代码中找不到
问题描述
Azure Query Performance Insight 显示消耗了我的大部分资源 (DTU) 的查询。它始终运行大约。每小时 80K 次。据我所知,这似乎是一个错误或有什么问题,没有什么应该经常发生。Azure 为我提供了 SQL,但我找不到生成它的 C# EF 代码。有许多站点使用此数据库。鉴于有大量代码,有一些延迟加载,以及一般的 EF“抽象”,我无法准确找到此查询发生的位置。还有其他地方可以缩小代码/控制器/操作的范围吗?
解决方案
确保您的各种应用程序在查询字符串中使用不同的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 日志记录,然后查找查询文本并将其追溯到生成查询的方法。