Sql-Server
FillFactor:Ola Hallengren 的 IndexOptimize 腳本
我們正在使用 Ola Hallengren 的 IndexOptimize 腳本在 SQL Server 2008 和 2012 上重建索引。這些維護腳本非常好,並且已經為我們的數據庫工作了幾個月。但是,最近我注意到它在數據庫上執行索引重建後將 FillFactor 更改為 90,即使 FillFactor 參數為
NULL
.在執行腳本之前,我檢查
sys.indexes
了所有索引的 FillFactor 是否為 0,但我不確定為什麼腳本在完成後將 FillFactor 更改為 90。這在數據庫上引起了很多問題。您知道這是否是 IndexOptimize 腳本中 FillFactor 更改為 90 的預期行為?
這是我執行的:
EXECUTE dbo.IndexOptimize @Databases = 'dbname', @FragmentationLow = NULL, @FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE', @FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE', @FragmentationLevel1 = 5, @FragmentationLevel2 = 30, @LogToTable = 'Y'
如果您為變數賦值,Ola 的腳本只會更改填充因子
@FillFactor
。IF @FillFactor IS NOT NULL AND @CurrentIsPartition = 0 AND @CurrentIndexType IN(1,2,3,4) SET @CurrentCommand13 = @CurrentCommand13 + ', FILLFACTOR = ' + CAST(@FillFactor AS nvarchar)
這意味著某人:
- 修改儲存過程以使用 90 作為預設值;
- 從維護中帶外執行它;要麼
- 使用不同的腳本或 GUI 更改了值。
您可以編寫儲存過程的腳本以查看是否有人更改了預設值,
或者,您可以查詢
dbo.CommandLog
表以查看是否在REBUILD
填充因子為 90 的情況下執行命令。SELECT * FROM dbo.CommandLog AS cl WHERE cl.CommandType = 'ALTER_INDEX' AND cl.Command LIKE '%FILLFACTOR%'
如果有人通過使用不同的腳本或 GUI 對其進行了更改,那將更難追踪。
就我而言,在 SSMS 伺服器報告“架構更改歷史記錄”中,我看到該表在夜間被刪除並重新創建。我追踪了工作,然後是程序。果然,該表每晚都在重建,而沒有指定 FILLFACTOR(因此使用伺服器預設值)。