Index

用於索引優化的 Ola Hallengrens 程式碼 - 澄清

  • July 21, 2017

我正在嘗試在我們的 PROD 環境中部署用於索引優化的 Ola Hallengrens 程式碼。

在下面的程式碼中使用USER_DATABASESAVAILABILITY_GROUP_DATABASES代替 @Databases 有什麼區別。

我也在瀏覽部落格並閱讀:

用於索引優化的 Ola Hallengrens 程式碼僅用於對超過 1000 頁的頁面進行碎片整理。

當我執行以下命令時,它只更新統計資訊而不重建索引 -

這是否意味著我擅長處理碎片,不用太擔心它,因為我的最終使用者不會抱怨任何關於數據庫端響應緩慢或性能不佳的事情。

EXECUTE dbo.IndexOptimize
@Databases = '',
@FragmentationLow = NULL,
@FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE',
@FragmentationLevel1 = 5,
@FragmentationLevel2 = 30

user_databasesavailability_group_databases之間的區別在於,當指定 user_databases 時,您將優化每個使用者數據庫(也是 AG 組中的數據庫),如果您指定availability_group_databases,您將優化可用性組內的數據庫索引。

如果您的表沒有超過 1000 頁的碎片,這不會損害您的 SQL Server 性能。我建議您也閱讀 Brent Ozar 的這篇文章。https://www.brentozar.com/archive/2012/08/sql-server-index-fragmentation/

可用性組數據庫

如果您快速查看文件,則有一個很好的範例USER_DATABASESand AVAILABILITY_GROUP_DATABASES

數據庫

選擇數據庫。支持關鍵字 SYSTEM_DATABASES、USER_DATABASES、ALL_DATABASES 和 AVAILABILITY_GROUP_DATABASES。連字元 (-) 用於排除數據庫,百分號 (%) 用於萬用字元選擇。所有這些操作都可以使用逗號 (,) 進行組合。

Value                                           Description  
----------------------------------------------  --------------------------------------------------------  
SYSTEM_DATABASES                                All system databases (master, msdb, and model)  
USER_DATABASES                                  All user databases`  
ALL_DATABASES                                   All databases`  
AVAILABILITY_GROUP_DATABASES                    All databases in availability groups  
USER_DATABASES, -AVAILABILITY_GROUP_DATABASES   All user databases that are not in availability groups  
Db1                                             The database Db1  
Db1, Db2                                        The databases Db1 and Db2  
USER_DATABASES, -Db1                            All user databases, except Db1  
`%Db%                                           All databases that have “Db” in the name  
%Db%, -Db1                                      All databases that have “Db” in the name, except Db1  
ALL_DATABASES, -%Db%                            All databases that do not have “Db” in the name  

索引碎片化

正如您正確指出的那樣,索引優化是在某些級別觸發的。

  • 如果表中有超過 1000 個頁面並且索引碎片在 5% 到 30% 之間,則會重新組織索引。
  • 如果表中有超過 1000 個頁面並且索引碎片超過 30%,則會重建索引。

根據您的要求和/或數據的大小,您可能需要提前重新組織一些索引。

非常簡單的例子

您有一個包含 2 億條記錄(線上存檔)的表,每天修改 10'000 條記錄,每天創建 10'000 條記錄。做簡單的數學計算會產生 0.01% 的最大碎片,這永遠不會觸發索引重組或重建。達到 5% 的碎片化需要 500 天。在生產環境中,這可能會導致潛在的性能問題,具體取決於所涉及的表的大小和查詢的複雜性。

你的問題已回答

是的,你擅長碎片化,但有上述限制。

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