弄清楚我的 SQL 上的 运行 是我的 C# 代码正在调用的进程
Figuring out what process is running on my SQL that is being called by my c# code
我正在开发一个 .NET nop 商务应用程序,我在数据库中有大约 500 万多个结果,我需要查询所有这些数据以进行提取。但是当我的 GC 不断增长(超过 1GB)时,来自 SQL 的数据永远不会返回到我的代码中,但是当我 运行 在提供相应参数后 SQL 中的相同存储过程时, 不到 2 分钟。我需要以某种方式弄清楚为什么从我的代码调用需要这么多时间。
NopCommerce 使用 entity framework 库来调用数据库存储过程,但这不是异步的,所以我只是尝试使用此函数以异步方式调用存储过程:
await dbcontext.Database.SqlQuery<TEntity>(commandText, parameters).ToListAsync();
根据我对另一个 SO 的研究 post ToListAsync();
当任务被发送回任务库时将此调用变为异步。
现在我需要弄清楚目前我无法做到的 3 件事:
1) 我需要弄清楚那个线程是否在后台 运行ning?我认为这是因为 GC 不断增长,但我不确定,下面是我如何尝试使用 Visual Studio:
中的诊断工具的图片
2) 我需要确保 SQL 进程是否为我的代码中的数据库调用提供了足够的时间,我尝试了以下查询,但它们没有显示任何价值由我的代码
启动的特定数据导出过程运行ning
我试过这个查询:
select top 50
sum(qs.total_worker_time) as total_cpu_time,
sum(qs.execution_count) as total_execution_count,
count(*) as number_of_statements,
qs.plan_handle
from
sys.dm_exec_query_stats qs
group by qs.plan_handle
order by sum(qs.total_worker_time) desc
也试过这个:
SELECT
r.session_id
,st.TEXT AS batch_text
,SUBSTRING(st.TEXT, statement_start_offset / 2 + 1, (
(
CASE
WHEN r.statement_end_offset = - 1
THEN (LEN(CONVERT(NVARCHAR(max), st.TEXT)) * 2)
ELSE r.statement_end_offset
END
) - r.statement_start_offset
) / 2 + 1) AS statement_text
,qp.query_plan AS 'XML Plan'
,r.*
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st
CROSS APPLY sys.dm_exec_query_plan(r.plan_handle) AS qp
ORDER BY cpu_time DESC
同样,当我使用 sp_who
或 sp_who2
时,我的数据库进程的状态保持在这样的 'runnable' 形式,还有那些 CPU 和 DISKIO:
3) 我需要知道,如果我的数据库调用已成功完成但将它们映射到相关列表会花费大量时间怎么办?
我非常感谢有人为我指出正确的方向,也许可以帮助我进行查询以帮助我查看正确的结果,或者帮助我查看 运行ning 后台线程及其状态或者可以帮助我了解更多关于查看 GC 或线程以及 CPU 以更好的方式利用的信息。
任何帮助将不胜感激。谢谢
尝试一些诊断方法:
- 尝试在 select 语句中添加一个
top 100
子句,以查看通信层或数据映射器是否存在问题。
- 存储过程返回了多少数据?如果该过程返回超过一百万行,则您查询的数据可能不是您想要的。
- 你试过运行同步和异步吗?
我正在开发一个 .NET nop 商务应用程序,我在数据库中有大约 500 万多个结果,我需要查询所有这些数据以进行提取。但是当我的 GC 不断增长(超过 1GB)时,来自 SQL 的数据永远不会返回到我的代码中,但是当我 运行 在提供相应参数后 SQL 中的相同存储过程时, 不到 2 分钟。我需要以某种方式弄清楚为什么从我的代码调用需要这么多时间。
NopCommerce 使用 entity framework 库来调用数据库存储过程,但这不是异步的,所以我只是尝试使用此函数以异步方式调用存储过程:
await dbcontext.Database.SqlQuery<TEntity>(commandText, parameters).ToListAsync();
根据我对另一个 SO 的研究 post ToListAsync();
当任务被发送回任务库时将此调用变为异步。
现在我需要弄清楚目前我无法做到的 3 件事:
1) 我需要弄清楚那个线程是否在后台 运行ning?我认为这是因为 GC 不断增长,但我不确定,下面是我如何尝试使用 Visual Studio:
中的诊断工具的图片2) 我需要确保 SQL 进程是否为我的代码中的数据库调用提供了足够的时间,我尝试了以下查询,但它们没有显示任何价值由我的代码
启动的特定数据导出过程运行ning我试过这个查询:
select top 50
sum(qs.total_worker_time) as total_cpu_time,
sum(qs.execution_count) as total_execution_count,
count(*) as number_of_statements,
qs.plan_handle
from
sys.dm_exec_query_stats qs
group by qs.plan_handle
order by sum(qs.total_worker_time) desc
也试过这个:
SELECT
r.session_id
,st.TEXT AS batch_text
,SUBSTRING(st.TEXT, statement_start_offset / 2 + 1, (
(
CASE
WHEN r.statement_end_offset = - 1
THEN (LEN(CONVERT(NVARCHAR(max), st.TEXT)) * 2)
ELSE r.statement_end_offset
END
) - r.statement_start_offset
) / 2 + 1) AS statement_text
,qp.query_plan AS 'XML Plan'
,r.*
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS st
CROSS APPLY sys.dm_exec_query_plan(r.plan_handle) AS qp
ORDER BY cpu_time DESC
同样,当我使用 sp_who
或 sp_who2
时,我的数据库进程的状态保持在这样的 'runnable' 形式,还有那些 CPU 和 DISKIO:
3) 我需要知道,如果我的数据库调用已成功完成但将它们映射到相关列表会花费大量时间怎么办?
我非常感谢有人为我指出正确的方向,也许可以帮助我进行查询以帮助我查看正确的结果,或者帮助我查看 运行ning 后台线程及其状态或者可以帮助我了解更多关于查看 GC 或线程以及 CPU 以更好的方式利用的信息。
任何帮助将不胜感激。谢谢
尝试一些诊断方法:
- 尝试在 select 语句中添加一个
top 100
子句,以查看通信层或数据映射器是否存在问题。 - 存储过程返回了多少数据?如果该过程返回超过一百万行,则您查询的数据可能不是您想要的。
- 你试过运行同步和异步吗?