我正在撰寫的資料庫工具通過運行并行查詢來調查阻塞的查詢,sys.dm_exec_requests如果主查詢被延遲以找出延遲的原因。
如果調查連接具有VIEW SERVER STATE權限,則可以正常作業。但是,如果不是,則sys.dm_exec_requests僅包含運行它的連接的條目——這對于一次只能運行一個查詢的連接來說有點毫無意義。
進入 MARS,我第一次想到這個神秘的功能可能對某些東西有用。
啟用 MARS 后,我可以在與我們正在調查的延遲查詢相同的連接上運行調查查詢。
但是,一個簡單的測驗表明,如果第一個 MARS 查詢被阻止,顯然第二個也是,即使第二個沒有理由。
我在 LinqPad 中運行此測驗代碼(使用 Dappper 以獲得更緊湊的代碼示例,但我在不使用 Dapper 的應用程式中得到了相同的效果):
var csb = new SqlConnectionStringBuilder();
csb.TrustServerCertificate = true;
csb.DataSource = @".\";
csb.InitialCatalog = "...";
csb.IntegratedSecurity = true;
using var c0 = new SqlConnection(csb.ConnectionString);
csb.MultipleActiveResultSets = true;
using var c1 = new SqlConnection(csb.ConnectionString);
using var c2 = new SqlConnection(csb.ConnectionString);
// Begin the blocking transaction on connection #0
await c0.QueryAsync(@"
begin transaction
select * from mytable with (tablockx, holdlock)
");
// This query on connection #1 is blocked by connection #0
var blockedTask = c1.QuerySingleAsync<int>("select count(*) from mytable");
// Strangely, this second query is blocked as well
var requests = await c1.QueryAsync(@"
select session_id, cpu_time, reads, logical_reads
from sys.dm_exec_requests r
");
// We don't get here unless you swap `c1` for `c2` in the last query, making
// it run on it's own connection, thus requiring VIEW SERVER STATE to be useful
requests.Dump();
await blockedTask;
您只需要一個帶有任何隨機表的資料庫來應用它。
uj5u.com熱心網友回復:
MARS允許在同一連接上交錯執行多個請求,而不是并發執行。
在阻塞SELECT查詢的情況下,同一連接上的其他查詢在選擇查詢完成或通過回傳結果產生之前無法執行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/528462.html
上一篇:兩個值的T-SQL隨機輸出
