欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

SQL Server統(tǒng)計(jì)信息更新會(huì)被阻塞或引起會(huì)話阻塞嗎?

freeflydom
2025年2月12日 11:19 本文熱度 742

在SQL Server數(shù)據(jù)庫(kù)中,統(tǒng)計(jì)信息更新(UPDATE STATISTICS)會(huì)被其它會(huì)話阻塞嗎?統(tǒng)計(jì)信息更新(UPDATE STATISTICS)會(huì)引起其它會(huì)話阻塞嗎?在回答這兩個(gè)問(wèn)題前,我們必須搞清楚,統(tǒng)計(jì)信息更新這個(gè)操作期間會(huì)申請(qǐng)/持有那些鎖。如果弄清楚了這些,那么我們就能很容易回答這兩個(gè)問(wèn)題了。如果要弄清楚統(tǒng)計(jì)信息更新會(huì)申請(qǐng)/持有那些鎖,我們可以用SQL腳本或SQL Server Profiler工具來(lái)查詢/定位相關(guān)的鎖信息

SQL腳本方式

SELECT * FROM  sys.dm_tran_locks
WHERE request_session_id=xxx;  --xxx用具體的會(huì)話ID替換
SELECT resource_type ,
       resource_subtype ,
       resource_description ,
       resource_associated_entity_id ,
       request_mode ,
       request_type ,
       request_status ,
       request_session_id  
FROM sys.dm_tran_locks
WHERE request_session_id = xxx;

用SQL腳本的話,不太容易捕捉到統(tǒng)計(jì)信息更新(UPDATE STATISTICS)整個(gè)過(guò)程中申請(qǐng)的所有相關(guān)鎖信息,而且小表的統(tǒng)計(jì)信息更新速度非常快(時(shí)間短到你來(lái)不及去查詢相關(guān)鎖信息,有些鎖就已經(jīng)申請(qǐng)成功,并釋放了,可能統(tǒng)計(jì)信息更新都已經(jīng)完成了),如果要實(shí)驗(yàn)的話,可能需要構(gòu)造一個(gè)很大的表。這種方式還是有一些缺陷與不足。

SQL Server Profiler跟蹤方式

使用SQL Server Profiler工具追蹤更新統(tǒng)計(jì)信息期間會(huì)申請(qǐng)/持有哪一些鎖。這種方式比較容易捕捉到整個(gè)過(guò)程中所有相關(guān)的鎖申請(qǐng)與鎖釋放的詳細(xì)信息,而且用SQL Server Profiler跟蹤鎖的申請(qǐng)與釋放也非常方便。個(gè)人推薦使用這種方式。

下面我們打開(kāi)一個(gè)會(huì)話窗口,找出會(huì)話ID(當(dāng)前測(cè)試環(huán)境會(huì)話ID為53),然后使用SQL Server Profiler跟蹤會(huì)話ID=53的鎖的申請(qǐng)與釋放(Lock:Acquired, Lock:Released),此處SQL Server Profiler的相關(guān)操作細(xì)節(jié)略過(guò)。然后在會(huì)話窗口執(zhí)行下面語(yǔ)句

UPDATE STATISTICS  TEST WITH FULLSCAN,ALL;

如下部分截圖所示,我們可以看到在統(tǒng)計(jì)信息更新期間,數(shù)據(jù)庫(kù)會(huì)在相關(guān)對(duì)象上請(qǐng)求架構(gòu)穩(wěn)定鎖(Sch-S)、架構(gòu)修改鎖(Sch-M)、共享鎖(S),排它鎖(X),意向排他鎖(IX),更新鎖(U)等,整個(gè)過(guò)程會(huì)有較多的鎖申請(qǐng)與鎖釋放。

從上面實(shí)驗(yàn)可以看出,在 SQL Server 中,更新統(tǒng)計(jì)信息可能會(huì)申請(qǐng)持有很多類(lèi)型的鎖,那么我來(lái)一項(xiàng)項(xiàng)分析,在分析之前,我們來(lái)看一下鎖的兼容矩陣,如果對(duì)這方面知識(shí)有點(diǎn)模糊不清的,正好可以重溫一下這方面的知識(shí)點(diǎn):

注意:除了架構(gòu)修改鎖 (Sch-M)之外,架構(gòu)穩(wěn)定鎖 (Sch-S) 與所有鎖定模式都兼容。而Sch-M 鎖與所有鎖定模式都不兼容。

1. 共享鎖(S)

從實(shí)驗(yàn)數(shù)據(jù)來(lái)看,共享鎖都發(fā)生在統(tǒng)計(jì)信息元數(shù)據(jù)對(duì)象上。這些元數(shù)據(jù)對(duì)象,如下截圖所示,分別為sysschobjs和sysobjvalues,當(dāng)然還有OBJECT_ID=0 OBJECTID2=xxxx的數(shù)據(jù)頁(yè)或數(shù)據(jù)行。

SELECT t.object_id AS ObjectID,
       OBJECT_NAME(t.object_id) AS ObjectName,
       SUM(u.total_pages) * 8 AS Total_Reserved_kb,
       SUM(u.used_pages) * 8 AS Used_Space_kb,
       u.type_desc AS TypeDesc,
       MAX(p.rows) AS RowsCount
FROM sys.allocation_units AS u
JOIN sys.partitions AS p ON u.container_id = p.hobt_id
JOIN sys.objects AS t ON p.object_id = t.object_id
where u.allocation_unit_id=281474980642816 
GROUP BY t.object_id,
         OBJECT_NAME(t.object_id),
         u.type_desc
ORDER BY Used_Space_kb DESC,
         ObjectName;

注意:查詢條件中用實(shí)際具體的OBJECTID2的值替換。

從鎖的兼容性來(lái)分析的話,這時(shí)發(fā)生阻塞與被阻塞的可能性是存在的,統(tǒng)計(jì)信息更新期間,在申請(qǐng)共享鎖時(shí),某些操作在元數(shù)據(jù)對(duì)象上持有意向排他共享鎖(SIX)、意向排它鎖(IX)、排它鎖(X),例如并發(fā)的會(huì)話跟新統(tǒng)計(jì)數(shù)據(jù)等操作,實(shí)際場(chǎng)景中,統(tǒng)計(jì)信息更新很少在發(fā)生申請(qǐng)共享鎖時(shí)阻塞其它會(huì)話與被其它會(huì)話阻塞。

2. 架構(gòu)穩(wěn)定性鎖(Sch-S)

當(dāng)UPDATE STATISTICS時(shí),SQL Server 會(huì)獲取架構(gòu)穩(wěn)定鎖(Sch-S)。這里不僅僅是統(tǒng)計(jì)信息更新涉及的相關(guān)對(duì)象還包括統(tǒng)計(jì)信息元數(shù)據(jù)對(duì)象,都會(huì)獲取Sch-S鎖,而對(duì)于架構(gòu)穩(wěn)定鎖(Sch-S)有下面一些規(guī)則:

  • 允許其他會(huì)話繼續(xù)讀取或修改數(shù)據(jù)(如 SELECT、INSERT、UPDATE)。
  • 僅阻塞需要修改表結(jié)構(gòu)的操作(如 ALTER TABLE、CREATE INDEX),因?yàn)檫@些操作需要架構(gòu)修改鎖(Sch-M),與架構(gòu)穩(wěn)定鎖(Sch-S)不兼容。

此時(shí),除非有并發(fā)的會(huì)話對(duì)表結(jié)構(gòu)進(jìn)行修改(DDL)或者并發(fā)會(huì)話在進(jìn)行統(tǒng)計(jì)信息更新操作,此時(shí)剛好持有 Sch-M 鎖,那么就可能會(huì)被阻塞。 我們會(huì)結(jié)合架構(gòu)修改鎖(Sch-M)構(gòu)造測(cè)試案例。

3. 架構(gòu)修改鎖(Sch-M)

當(dāng)更新統(tǒng)計(jì)信息時(shí),SQL Server 會(huì)嘗試獲取統(tǒng)計(jì)信息元數(shù)據(jù)對(duì)象上的架構(gòu)修改鎖(Sch-M)。這種鎖用于確保在更新統(tǒng)計(jì)信息的過(guò)程中,其他會(huì)話不會(huì)對(duì)統(tǒng)計(jì)信息進(jìn)行修改。如果其他會(huì)話已經(jīng)持有與 Sch-M 不兼容的鎖(如架構(gòu)穩(wěn)定性鎖 Sch-S),則更新統(tǒng)計(jì)信息的操作可能會(huì)被阻塞。

這些元數(shù)據(jù)對(duì)象,如下截圖所示,分別為sysschobjs和sysobjvalues等對(duì)象。

那么我們簡(jiǎn)單構(gòu)造一下統(tǒng)計(jì)信息更新被阻塞的案例,如下所示

--會(huì)話58中執(zhí)行下面語(yǔ)句,模擬事務(wù)正在修改表結(jié)構(gòu)(DDL),此時(shí)事務(wù)未提交/事務(wù)正在執(zhí)行階段

begin tran
alter table test add kk varchar(30);
--rollback;

--會(huì)話53中執(zhí)行下面語(yǔ)句更新統(tǒng)計(jì)信息

UPDATE STATISTICS  TEST WITH FULLSCAN,ALL;

在會(huì)話窗口監(jiān)控阻塞情況,如下所示,對(duì)表進(jìn)行DDL操作時(shí),會(huì)阻塞統(tǒng)計(jì)信息的更新,此時(shí)更新統(tǒng)計(jì)信息的會(huì)話的等待類(lèi)型為L(zhǎng)CK_M_SCH_S,意味著會(huì)話53正在等待獲取架構(gòu)穩(wěn)定鎖(Sch-S), 其實(shí)反過(guò)來(lái),更新統(tǒng)計(jì)信息也會(huì)阻塞一些會(huì)話對(duì)相關(guān)表進(jìn)行DDL操作。此時(shí)對(duì)相關(guān)表進(jìn)行DDL操作時(shí)。個(gè)人也構(gòu)造了另外一個(gè)大表測(cè)試案例進(jìn)行了驗(yàn)證。有興趣也可以驗(yàn)證一下。此處略過(guò)。

4. 意向排它鎖(IX)與排它鎖(X)與更新鎖(U)

在更新統(tǒng)計(jì)信息時(shí),SQL Server 還可能會(huì)對(duì)相關(guān)表(例如,sysobjvalues)中的數(shù)據(jù)行或頁(yè)獲取行鎖(X、U 等)或頁(yè)鎖(IX、IU 等)。這些鎖用于確保在采樣數(shù)據(jù)時(shí),數(shù)據(jù)不會(huì)被其他事務(wù)修改。如果有并發(fā)的DDL或統(tǒng)計(jì)信息跟新的話,也有可能導(dǎo)致阻塞與被阻塞。但是實(shí)際生產(chǎn)環(huán)境中,這種可能性非常小。另外,在表TEST進(jìn)行統(tǒng)計(jì)信息更新時(shí),也會(huì)在TEST上有一個(gè)短暫的排它鎖(X),它的子類(lèi)型(Resource subtype)為UPDSTATS,根據(jù)官方文檔,只要子類(lèi)型不同(不同的子類(lèi)型彼此之間不會(huì)沖突),它是不會(huì)阻塞表上的DML操作的,除非另外一個(gè)會(huì)話也在更新統(tǒng)計(jì)信息。這種概率微乎其微。

此處附上官方文檔的內(nèi)容:

Represents a subtype of resource_type. Acquiring a subtype lock without holding a non-subtyped lock of the parent type is technically valid. Different subtypes do not conflict with each other or with the non-subtyped parent type. Not all resource types have subtypes.

結(jié)論總結(jié)

統(tǒng)計(jì)信息更新可能被其它會(huì)話阻塞,統(tǒng)計(jì)信息更新也有可能阻塞其它會(huì)話。當(dāng)統(tǒng)計(jì)信息更新時(shí),會(huì)獲取統(tǒng)計(jì)信息元數(shù)據(jù)對(duì)象上的架構(gòu)修改鎖(Sch-M)。如果其他會(huì)話已經(jīng)鎖定了同一對(duì)象,或者需要在統(tǒng)計(jì)信息元數(shù)據(jù)對(duì)象上獲取架構(gòu)穩(wěn)定性鎖(Sch-S)來(lái)編譯查詢的會(huì)話,可能會(huì)被阻塞。但是這種場(chǎng)景比較少;另外不要同時(shí)做DDL(修改表結(jié)構(gòu)、創(chuàng)建維護(hù)索引)和統(tǒng)計(jì)信息更新操作,不要并發(fā)的去做統(tǒng)計(jì)信息更新(很少有這種場(chǎng)景)。絕大部分場(chǎng)景下,是可以大膽地執(zhí)行統(tǒng)計(jì)信息更新操作,它不會(huì)阻塞數(shù)據(jù)操作(DML),不用擔(dān)心它阻塞了其它會(huì)話或被阻塞的。

轉(zhuǎn)自https://www.cnblogs.com/kerrycode/p/18704641


該文章在 2025/2/12 11:19:38 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved