Sql-Server

如何減少日期分區日誌表上非聚集索引的碎片

  • January 5, 2021

在我按照我的直覺並重建非聚集索引以使用我們的分區鍵之前尋找一些建議。這是一個永遠不會更新或刪除的僅插入表,我們在左側保留一個滑動視窗我的截斷/合併週期,並在右側添加新周期。由於我們插入的數據的構成(許多唯一的帳戶 ID 和庫存 ID),非聚集索引始終處於 99% 的碎片狀態。我想知道最好的方法是保持非聚集索引以通過 accountId 查找而沒有所有碎片,或者我不應該擔心碎片?

我知道我們的表沒有明確的唯一索引,我們依賴

$$ UNIQUIFIER $$自動添加到 changedAt 中。 使用模式:始終使用日期過濾器(ChangedAt)查詢表

分區功能:

CREATE PARTITION FUNCTION pf_Weekly_QuantityHistory (datetime2(2)) AS RANGE RIGHT FOR VALUES ( '01 Jul 2019','08 Jul 2019','15 Jul 2019',etc )

CREATE PARTITION SCHEME [ps_Weekly_QuantityHistory]  AS PARTITION [pf_Weekly_QuantityHistory] 
ALL TO ( [ExampleFG] );

CREATE TABLE [dbo].[QuantityHistory](
   [AccountId] [int] NOT NULL,
   [InventoryID] [int] NOT NULL,
   [QuantityBefore] [int] NULL,
   [QuantityAfter] [int] NULL,
   [ChangedAt] [datetime2](2) NOT NULL DEFAULT (getutcdate())
) ON [ps_Weekly_QuantityHistory](ChangedAt)

CREATE CLUSTERED INDEX [CX_QuantityHistory] ON [dbo].[QuantityHistory]
(
   [ChangedAt] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, DATA_COMPRESSION=PAGE)

CREATE NONCLUSTERED INDEX [IX_AccountId] ON [dbo].[QuantityHistory]
(
   [AccountId] ASC,
   [InventoryId] ASC,
   [ChangedAt] ASC
) INCLUDE(QuantityBefore,QuantityAfter) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, DATA_COMPRESSION=PAGE)

我想知道最好的方法是保持一個非聚集索引以通過 accountId 查找而沒有所有碎片

您在非聚集索引中獲得了分區鍵,因此它在分區方案中(預設情況下),並且只有頭分區會獲得插入和額外的碎片。

因此,您可以很少重建較舊的分區並且它們不會碎片化,並且可以更頻繁地為頭分區重建索引。

但是對於插入分佈在排序順序中的索引,您總是會產生碎片。碎片化並不總是很重要。這實際上取決於儲存設計和工作負載。

此外,您還保留了此表的兩份完整副本,一份按 排序,ChangedAt一份按 排序(AccountId,InventoryId,ChangedAt)。您可以只將(AccountId,InventoryId,ChangedAt)索引設為聚集索引,並且只儲存一次表。

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