Sql-Server

被阻止查詢的資源成本

  • January 2, 2015

我目前正在審查一個 SSRS 伺服器經常遇到阻塞和死鎖的案例。

這些報告不是業務關鍵的,它們經常被殺死以減輕阻塞。

但是,同一台 SQL Server 上有一些關鍵數據庫(它與大型共享點場共享一個 sql 伺服器),這些數據庫的性能一直在下降。

我前任的計劃如下:

  1. 將價值 4TB 的數據庫從 A 遷移到 B
  2. 將報告伺服器(最初是 A)從 B 遷移到 C
  3. 將報告伺服器(最初是 C)從 C 遷移到 B

理由是我們將擁有更好的硬體 (B),能夠擺脫舊伺服器 (A),並從關鍵數據庫伺服器(現在是 B)中刪除報告伺服器(最終位於 C)。

但是,我並不完全相信這會對性能產生很大影響(除了較新的硬體)。

我已經在一周的大部分時間裡一直在監視這些塊,並且一直是 WriteLockSession 阻塞了 ReadChunkSegment。據我從文件(Google)中可以看出,這非常好。

我如何確定/如果阻塞的程序導致不同數據庫的速度變慢?

如果我能證明性能問題與共享硬體無關(報告和其他數據庫),我想設置共享數據集。由於大多數報告以及所有長期執行的報告都在查詢相同的小數據子集。

被阻止的請求不起作用。這是一個例子:

創建阻塞查詢

use AdventureWorks2012;
go

begin tran;
   update HumanResources.Department
   set Name = 'testing 1 2 3'
   where DepartmentID = 7;
--rollback tran;

執行將被上述會話阻止的查詢

use AdventureWorks2012;
go

select *
from HumanResources.Department;

現在看看這個被阻止的請求可能正在做的任何“工作”(查詢sys.dm_exec_requests這個被阻止的會話,然後等待一段時間並再次查詢以進行比較/對比):

select
   start_time,
   status,
   total_elapsed_time_sec = 
       total_elapsed_time / 1000,
   cpu_time,
   reads,
   logical_reads,
   writes
from sys.dm_exec_requests
where session_id = 52;  -- my blocked session's spid

waitfor delay '00:00:10';

select
   start_time,
   status,
   total_elapsed_time_sec = 
       total_elapsed_time / 1000,
   cpu_time,
   reads,
   logical_reads,
   writes
from sys.dm_exec_requests
where session_id = 52;  -- my blocked session's spid

在此處輸入圖像描述

你在這裡看到的是一個沒有工作的請求,因為它不在running狀態中。當它是suspended那麼它不在處理器上做任何工作。

引用自:https://dba.stackexchange.com/questions/87431