找出由我的C#代码调用的SQL正在运行什么进程

时间:2019-11-21 23:52:03

标签: c# .net sql-server asp.net-mvc nopcommerce

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

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

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

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

现在我需要弄清当前无法执行的3件事:

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利用率。

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

2 个答案:

答案 0 :(得分:1)

尝试一些诊断方法:

  1. 尝试在select语句中添加top 100子句,以查看通信层或数据映射器是否存在问题。
  2. 存储过程将返回多少数据?如果该过程返回的行数超过一百万,则可能不是在查询您要查询的数据。
  3. 您是否尝试过同时和异步运行它?

答案 1 :(得分:0)

您面临的问题,高内存消耗和缓慢与返回一个非常大的记录集是一致的,这似乎是您在做什么。如果您在句子中设置断点,则会显示需要多长时间。如果在Management Studio中花2分钟才能完成,那么在EF中,花费的时间要长很多倍。

如果这是一种不时运行的批处理任务,并且一次仅运行一个副本,那么有关它是否异步的问题就无关紧要了。如果它使您更清楚,则可以安全地使其同步。异步并不意味着它必须更快或需要更少的内存,它只是为IIS释放了一个线程。

尝试VS与SqlServer Profiler并排。它可以帮助您实时查看其运行情况。

我最好的猜测是您将需要重构任务。

祝你好运。