Sql-Server

可以在 ID 列上的聚集索引上使用 100 的填充因子嗎?

  • October 12, 2016

因此,我在 SQL Server 的 ID 列(自動增量列)上有一個帶有聚集索引的表。

由於數據將始終使用下一個最新的 ID 寫入,因此是否可以將填充因子設置為 100?如果此表上的其他列針對現有 ID 進行大量更新,這是否重要?

此外,刪除將如何影響表的碎片?

在大多數情況下,您確實需要FILLFACTOR100。只有在特殊情況下,您才需要降低該值。更新僅在增加行的大小以使其不適契約一數據頁時才會導致頁面拆分。在這兩種情況下,這里和那裡的刪除都不重要。REBUILD在所有情況下,當碎片超過一定限制時,您都需要定期維護索引和聚集索引。Rebuild 將按照理想的順序重新排序所有數據,因此它將填補由DELETE操作和UPDATE導致頁面拆分的操作留下的空白,在舊數據頁面和/或新數據頁面上仍有可用空間。

大量刪除可能會留下空白頁面,因此會產生一些碎片,但使用較低FILLFACTOR的頁面並無濟於事。事實上,根據要刪除的行,您可能會增加空頁碎片,因為首先每個數據頁上的行數會減少。

但請記住:

  • 使用FILLFACTOR100 並不意味著使用了 100% 的空間。只要整行有空間,行就適合數據頁。如果您有 100 個字節剩餘並有一個 105 字節的行要添加,它就不能放在那裡。但是對於可變長度列的更新仍然有空間增加 50 個字節。
  • 當您設置FILLFACTOR為小於 100 時,您將在所有數據頁上保留空間,而不僅僅是那些將要更新的數據頁。除非您的使用模式可以在整個表/索引範圍內均勻分佈更新,否則為什麼要在包含未更新的“較舊”行的數據頁上保留空間?這只會減慢整個索引/表的查詢速度,希望一些較新的數據頁(即更有可能更新的行)不會像使用100時那樣早地進行頁面拆分。FILLFACTOR
  • 考慮你的行的大小,當FILLFACTOR為 100 時,有多少行將適合數據頁,以及有多少行將適合較低的數據頁,FILLFACTOR例如 90,甚至 80。如果您有 500 - 1000 字節的寬行,各種FILLFACTOR值之間的差異可能只有一行或幾行。正在發生哪些類型的更新?如果更新是固定長度的列,這甚至都不是問題。對於可變長度列,它們的大小可以增加 100 - 500 字節嗎?

這裡有幾個真正實用的因素需要考慮:如果在一天或一周的過程中(操作之間的間隔時間是多長?)對排列緊密的行的REBUILD連續操作會擴大大小並導致多個頁面拆分,那麼UPDATE將頁面拆分幾個小時或一天確實值得在整個表/索引中保留該空間的影響,這樣它會佔用更多的磁碟空間,記憶體中的空間(即緩衝池),使備份更大,需要更長的時間從磁碟讀取到緩衝池,需要更長的時間來進行索引維護等?

  • 碎片化會對范圍查詢產生不利影響,而不是單例查詢。如果您正在獲取單個行(或查找要更新或刪除的行),您可能不會看到碎片的影響,至少直到它真的很糟糕,但可能根本看不到。

與許多/大多數技術決策一樣,有各種技術因素會影響“最佳”或“最佳”方法。因此,您確實需要考慮行的最大大小,如果更新將發生在可變長度列上,更新活動是否將主要分佈在表/索引中或僅限於它的“最近”段等等。我曾在政策規定所有表的 aFILLFACTOR為 80 的地方工作過,這是一種瘋狂(且不負責任)的做法,因為我們IDENTITY很少將列用於聚集索引(通常是 PK)和“舊”數據曾經更新過。恢復操作需要更長的時間!)並消耗更多記憶體,這要麼強制記憶體計劃被驅逐或記憶體數據頁面(即頁面預期壽命非常低)。

**ERGO:**從 100 開始,並在您認為可能需要優化的情況下嘗試少量降低(即,如果您發現特定表上的碎片在重建之間增長到更高的水平,並且這也會導致性能下降!)。

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