我的公司承諾在我們的Azure SQL數據庫表上使用GUID作爲主鍵的罪名(它實際上比這更糟糕:我們使用VARCHAR(36)而不是UNIQUEIDENTIFIER)。因此,我們最終得到分散的索引。他們看起來像這樣:爲什麼我的Azure SQL數據庫索引仍然是碎片?
CREATE TABLE OldTable (
Id VARCHAR(36) PRIMARY KEY CLUSTERED NOT NULL DEFAULT NEWID(),
CreateTime DATETIME2 NOT NULL,
...
)
我通過創建新表「修復」了問題。這一次,我爲CLUSTERED INDEX使用了不可變的,不斷增長的DATETIME2(例如CreateTime)列,並將VARCHAR(36)保留爲PRIMARY KEY,但這次是NONCLUSTERED。就像這樣:
CREATE TABLE NewTable (
Id VARCHAR(36) PRIMARY KEY NONCLUSTERED NOT NULL DEFAULT NEWID(),
CreateTime DATETIME2 NOT NULL INDEX IX_NewTable_CreateTime CLUSTERED,
)
然後我 「抄襲」 行從舊錶使用INSERT INTO newtable的SELECT * FROM OldTable新表。最後,我重新命名了表格並刪除了舊錶格。生活似乎很好。
令我驚訝的是,幾周後,我發現NewTable有許多分段索引,平均分片高達80%!即使IX_NewTable_CreateTime報告了18%的碎片。
INSERT INTO是否支離破碎的索引? REBUILD索引能解決問題嗎?
弗拉gmentation是不可避免的,隨着時間的推移,索引將會碎片化。你必須重建索引,因爲SQL azure不會爲你做這件事 – TheGameiswar