簡體   English   中英

弄清楚我的 c# 代碼正在調用的 SQL 上正在運行什么進程

[英]Figuring out what process is running on my SQL that is being called by my c# code

我正在開發一個 .NET nop 商務應用程序,我在數據庫中有大約 500 萬多個結果,我需要查詢所有這些數據以進行提取。 但是來自 SQL 的數據永遠不會返回到我的代碼中,而我的 GC 不斷增長(超過 1gb)但是當我在提供相應參數后在 SQL 中運行相同的存儲過程時,只需不到 2 分鍾。 我需要以某種方式弄清楚為什么從我的代碼中調用需要這么多時間。

NopCommerce 使用實體框架庫來調用數據庫存儲過程,但這不是異步的,所以我只是嘗試使用此 function 以異步方式調用存儲過程:

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

根據我對另一篇 SO 帖子ToListAsync(); 當任務被發送回任務庫時,將此調用轉換為異步。

現在我需要弄清楚目前我無法做的三件事:

1)我需要弄清楚該線程是否在后台運行? 我認為這是因為 GC 不斷增長,但我不確定,下面是我如何在 Visual Studio 中使用診斷工具進行嘗試的圖片:

在此處輸入圖像描述

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:

在此處輸入圖像描述

3) 我需要知道,如果我的數據庫調用已成功完成但將它們映射到相關列表需要很多時間怎么辦?

我非常感謝有人指出我正確的方向,也許可以幫助我查詢可以幫助我查看正確的結果,或者幫助我查看正在運行的后台線程及其狀態,或者幫助我了解有關查看的更多信息GC 或線程和 CPU 利用率以更好的方式。

任何幫助將不勝感激。 謝謝

可以嘗試一些診斷方法:

  1. 嘗試在 select 語句中添加top 100子句,以查看通信層或數據映射器是否存在問題。
  2. 存儲過程返回了多少數據? 如果該過程返回的行數超過一百萬行,則您可能沒有查詢您想要的數據。
  3. 您是否嘗試過同步和異步運行它?

您面臨的問題、高 memory 消耗和緩慢與返回一個非常大的記錄集是一致的,這似乎是您正在做的事情。 如果你在你展示的句子上設置一個斷點,你會看到它需要多長時間。 如果在 management studio 中需要 2 分鍾完成,在 EF 中將花費很多倍,保證。

如果這是某種只不時運行並且一次只運行一個副本的批處理任務,那么關於它是否異步的問題是無關緊要的。 如果它讓您更清楚,您可以安全地使其同步。 異步並不意味着它必須更快或需要更少的 memory,它只是為 IIS 釋放了一個線程。

嘗試一下 SqlServer Profiler 與 VS 並排。 它可能會幫助您實時查看它在做什么。

我最好的猜測是您將需要重構任務。

祝你好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM