聚集索引和填充因子fill factor的设置,减少死锁
我的數據庫很容易死鎖,我后來發現是聚集索引引起的,我的索引填充因子是90,后來我把聚集索引去掉,問題就解決了,但是我不明白聚集索引為什么會引起死鎖??
你的填充因子設置得不對 ?
? ?
? 聚集索引代表了表中記錄的存儲順序,所以每次數據的變化,都可能導致表中的數據按照聚集索引重新調整順序 ?
? ?
? 而填充因子設置為90,這是偏向于減少索引空間占用的做法,這樣的做法導致為了減少索引的空間占用,使數據頁的空閑空間很小 ?
? 在向一個已滿的索引頁添加某個新行時,SQL ? Server ? 把大約一半的行移到新頁中以便為新行騰出空間。這種重組稱為頁拆分。頁拆分會降低性能并使表中的數據存儲產生碎片 ?
? 因為你這樣的填充因子設置,導致數據頁空閑空間很小,所以頁拆分經常發生,這樣數據處理性能低,當然就很容易鎖表了? ;
有關填充因子的一些說明,參考SQL聯機幫助: ? ??
? ?
? 填充因子 ?
? 在創建聚集索引時,表中的數據按照索引列中的值的順序存儲在數據庫的數據頁中。在表中插入新的數據行或更改索引列中的值 時,可能必須重新組織表中的數據存儲,以便為新行騰出空間,保持數據的有序存儲。這同樣適用于非聚集索引。添加或更改數據時,SQL ? Server ? 可能不得不重新組織非聚集索引頁中的數據存儲。向一個已滿的索引頁添加某個新行時,SQL ? Server ? 把大約一半的行移到新頁中以便為新行騰出空間。這種重組稱為頁拆分。頁拆分會降低性能并使表中的數據存儲產生碎片。有關更多信息,請參見表和索引構架。 ?
? ?
? 創建索引時,可以指定一個填充因子,以便在索引的每個葉級頁上留出額外的間隙和保留一定百分比的空間,供將來表的數據存儲容量進行擴充和減少頁拆分的可能 性。填充因子的值是從 ? 0 ? 到 ? 100 ? 的百分比數值,指定在創建索引后對數據頁的填充比例。值為 ? 100 ? 時表示頁將填滿,所留出的存儲空間量最小。只有當不會對數據進行更改時(例如,在只讀表中)才會使用此設置。值越小則數據頁上的空閑空間越大,這樣可以減 少在索引增長過程中對數據頁進行拆分的需要,但需要更多的存儲空間。當表中數據會發生更改時,這種設置更為適當。 ?
? ?
? 提供填充因子選項是為了對性能進行微調。但是,使用 ? sp_configure ? 系統存儲過程指定的服務器范圍的默認填充因子,在大多數情況下都是最佳的選擇。 ? ?
? ? ? ?? ?
? 說明 ? ? 即使對于一個面向許多插入和更新操作的應用程序來說,數據庫讀取次數一般也超過數據庫寫入次數的 ? 5 ? 到 ? 10 ? 倍。因此,指定一個不同于默認設置的填充因子會降低數據庫的讀取性能,而降低量與填充因子設置值成反比。例如,當填充因子的值為 ? 50% ? 時,數據庫的讀取性能會降低兩倍。 ?
? ? ? ?
? 只有當在表中根據現有數據創建新索引,并且可以精確預見將來會對這些數據進行哪些更改時,將填充因子選項設置為另一個值才有用。 ?
? ?
? 填充因子只在創建索引時執行;索引創建后,當表中進行數據的添加、刪除或更新時,不會保持填充因子。如果試圖在數據頁上保持額外的空間,則將有背于使用填 充因子的本意,因為隨著數據的輸入,SQL ? Server ? 必須在每個頁上進行頁拆分,以保持填充因子指定的空閑空間百分比。因此,如果表中的數據進行了較大的變動,添加了新數據,可以填充數據頁的空閑空間。在這 種情況下,可以重新創建索引,重新指定填充因子,以重新分布數據。?
fill ? factor ? 選項 ?
? 使用 ? fill ? factor ? 選項指定當使用現有數據創建新索引時,Microsoft® ? SQL ? Server™ ? 應使每一頁填滿的程度。由于 ? SQL ? Server ? 必須在填充時花費時間分割這些頁面,所以 ? fill ? factor ? 百分比會影響系統性能。 ?
? ?
? fill ? factor ? 百分比僅在創建索引時使用。這些頁面都不可能被維護在任何特定的飽滿水平上。 ?
? ?
? fill ? factor ? 的默認值為 ? 0;其有效值是從 ? 0 ? 到 ? 100。fill ? factor ? 的值為 ? 0 ? 并不表示頁面的填滿程度為 ? 0%。類似于 ? fill ? factor ? 設置為 ? 100 ? 的情況,SQL ? Server ? 在 ? fill ? factor ? 值為 ? 0 ? 時,會用頁面全部為數據的頁來創建聚集索引,用頁面全部為數據的葉子頁來創建非聚集索引。與 ? fill ? factor ? 設置為 ? 100 ? 的情況不同的是,SQL ? Server ? 在索引樹的高層級別上預留空間。很少有理由去改變 ? fill ? factor ? 的默認值,因為可以使用 ? CREATE ? INDEX ? 命令來覆蓋它。 ?
? ?
? 較小的 ? fill ? factor ? 值將導致 ? SQL ? Server ? 以不飽滿的頁面創建新索引。例如,將 ? fill ? factor ? 值設置為10 ? 對于想在一個最終將保持較少數據的表上創建索引是合適的。越小的 ? fill ? factor ? 值將導致每一個索引占用更多的存儲空間,但同時也允許以后可不進行頁面拆分進行插入操作。 ?
? ?
? 如果設置 ? fill ? factor ? 值為 ? 100,SQL ? Server ? 以100% ? 的飽滿度創建聚集和非聚集索引。設置 ? fill ? factor ? 的值為 ? 100 ? 僅對只讀表是合適的,因為數據從來不被添加到此類表中。 ?
? ?
? fill ? factor ? 是一個高級選項。如果要用 ? sp_configure ? 系統存儲過程改變該設置,必須把當 ? show ? advanced ? options ? 設置為 ? 1 ? 時僅能更改 ? fill ? factor,該選項在停止并重新啟動服務器后生效。
一般的填充因子設置策略: ?
? 數據變化越頻繁,填充因子越小 ?
? 數據越少變化,填充因子越大,對于數據不變化的表,填充因子設置為100
總結
以上是生活随笔為你收集整理的聚集索引和填充因子fill factor的设置,减少死锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笔记本有必要7200转吗
- 下一篇: 【RIA Services】系统分析