Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 弄清楚我的c代码调用的SQL上运行的是哪个进程_C#_.net_Sql Server_Asp.net Mvc_Nopcommerce - Fatal编程技术网

C# 弄清楚我的c代码调用的SQL上运行的是哪个进程

C# 弄清楚我的c代码调用的SQL上运行的是哪个进程,c#,.net,sql-server,asp.net-mvc,nopcommerce,C#,.net,Sql Server,Asp.net Mvc,Nopcommerce,我正在开发一个.NETNOP商务应用程序,在这个应用程序中,我的数据库中有大约500多万个结果,我需要查询所有这些数据以进行提取。但是,当我的GC不断增长时,来自SQL的数据从未返回到我的代码中—它超过1gb—但是当我在提供相应参数后在SQL中运行相同的存储过程时,所需时间不到2分钟。我需要弄清楚为什么我的代码调用花费了这么多时间 NopCommerce使用实体框架库调用数据库存储过程,但这不是异步的,因此我只是尝试使用以下函数以异步方式调用存储过程: 等待dbcontext.Database.

我正在开发一个.NETNOP商务应用程序,在这个应用程序中,我的数据库中有大约500多万个结果,我需要查询所有这些数据以进行提取。但是,当我的GC不断增长时,来自SQL的数据从未返回到我的代码中—它超过1gb—但是当我在提供相应参数后在SQL中运行相同的存储过程时,所需时间不到2分钟。我需要弄清楚为什么我的代码调用花费了这么多时间

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

等待dbcontext.Database.SqlQuerycommandText、parameters.ToListSync

从我在另一家公司的研究来看;在将任务发送回任务库时,将此调用转换为异步调用

现在我需要找出3件我目前无法做到的事情:

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

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

我尝试了以下查询:

选择前50名 sumqs.total_worker_time作为总cpu_time, sumqs.execution作为总执行计数, 将*计为\u语句的\u个数, qs.plan\u手柄 从…起 sys.dm_exec_query_stats qs 按qs.plan\U句柄分组 按sumqs.total_worker_time desc订购

我也试过这个:

选择 r、 会话号 ,st.TEXT作为批处理文本 ,SUBSTRINGst.TEXT,语句\u start\u offset/2+1, 案例 当r.statement\u end\u offset=-1时 然后是LENCONVERTNVARCHARmax,st.TEXT*2 ELSE r.语句\u结束\u偏移量 终止 -r.语句\u开始\u偏移量 /2+1作为语句文本 ,qp.query_计划为“XML计划” ,r* 从sys.dm_exec_请求r 交叉应用sys.dm_exec_sql_textr.sql_句柄作为st 交叉应用sys.dm\u exec\u query\u planr.plan\u处理为qp 按cpu的顺序\u时间描述

此外,当我使用sp_who或sp_who2时,我的数据库进程的状态保持为“可运行”状态,如下图所示,CPU和DISKIO:

3我需要知道,如果我的DB调用已成功完成,但将它们映射到相关列表需要花费大量时间,该怎么办

我非常感谢有人给我指出正确的方向,也许可以帮助我进行查询,帮助我查看正确的结果,或者帮助我查看正在运行的后台线程及其状态,或者帮助我以更好的方式了解更多有关查看GC或线程和CPU利用率的信息


我们将非常感谢您的帮助。感谢您尝试以下诊断方法:

尝试向select语句添加top 100子句,以查看通信层或数据映射器中是否存在问题。 存储过程返回了多少数据?如果该过程返回的行数超过一百万行,则可能不是在查询所指的数据。 您是否尝试过同步和异步运行它?
您所面临的问题,高内存消耗和缓慢与返回一个非常大的记录集是一致的,这似乎就是您正在做的。如果你在你展示的句子上设置一个断点,你就会看到它需要多长时间。如果在ManagementStudio中需要2分钟才能完成,那么在EF中肯定要多花很多倍的时间

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

尝试将SQLServerProfiler与VS并排使用。它可能会帮助您实时了解它在做什么

我的最佳猜测是您需要重构任务


祝你好运。

你在残酷的查询中有点误用了SqlServer。您有两个选项,因为这已经在服务器上正常运行,只需将结果写入SP中的一个诱惑,然后从c查询平面诱惑。选项2:不要做像子字符串或Case-When这样疯狂的事情,只需获取表并在C代码中执行所有连接或至少子字符串。感谢分享您的想法,我只是想做一些实验,让你知道我的进展。我发现这是使用.ToListAsync的问题,因为使用这个代码的方法是一个异步方法,但回到了 调用堆栈,它是使用Task.Result从aysnc方法调用的,所以它导致了死锁,现在我不能为这个特殊的事情做异步的。我可能不得不更改调用堆栈中的所有方法,这是一项巨大的工作