弄清楚正在由C#代码调用的SQL上正在运行什么进程

问题描述 投票:0回答:1

我正在开发.NET nop商务应用程序,其中数据库中有大约500万以上的结果,我需要查询所有这些数据以进行提取。但是,当我的GC持续增长(超过1gb)时,SQL中的数据永远不会返回到我的代码中,但是当我在提供各自的参数后在SQL中运行相同的存储过程时,花费了不到2分钟的时间。我需要以某种方式弄清楚为什么从我的代码中进行调用要花费这么多时间。

NopCommerce使用实体框架库来调用数据库存储过程,但这不是异步的,所以我只是尝试使用此函数以异步方式调用存储过程:

await dbcontext.Database.SqlQuery<TEntity>(commandText, parameters).ToListAsync();

根据我从另一篇SO文章ToListAsync();进行的研究,当将任务发送回任务库时,此调用将变为异步。

现在我需要弄清当前我无法做的三件事:

1)我需要弄清楚该线程是否在后台运行?我认为这是因为GC一直在增长,但是我不确定,下面是我如何在Visual Studio中使用诊断工具尝试过的照片:

enter image description here

2)我需要确保SQL进程是否为我的代码中的数据库调用提供了足够的时间,我尝试了以下查询,但是它们没有为我显示的针对由发起的特定数据导出运行的进程的任何值我的代码

我尝试了此查询:

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_whosp_who2时,数据库进程的状态仍保持“可运行”形式,例如CPU和DISKIO:

enter image description here

3)我需要知道,如果我的数据库调用已成功完成,但是将它们映射到相关列表会花费很多时间呢?

我非常感谢有人为我指出正确的方向,也许可以通过查询来帮助我查看正确的结果,或者可以帮助我查看正在运行的后台线程及其状态,或者可以帮助我学习更多有关以更好的方式查看GC或线程和CPU利用率。

任何帮助将不胜感激。谢谢

c# .net sql-server asp.net-mvc nopcommerce
1个回答
0
投票

尝试一些诊断方法:

  1. [尝试将top 100子句添加到select语句,以查看通信层或数据映射器是否存在问题。
  2. 存储过程返回多少数据?如果该过程返回的行数超过一百万,则您可能没有在查询您想要的数据。
  3. 您是否尝试过同时和异步运行它?
© www.soinside.com 2019 - 2024. All rights reserved.