SQL Server 2016 新增強:
- 使用 ALTER DATABASE 語法中的 AUTOGROW_ALL_FILES 來設定當 FileGroup 中的某個檔案達到自動成長閾值時, FileGroup 中的所有檔案都會自動同時成長。
- 此為 FileGroup 層級的屬性。
- 減少 allocation contention(配置競爭) 問題,提升效能。
- 預設 tempdb 有啟用 AUTOGROW_ALL_FILES。
- 先前版本,必須要額外啟用 Trace Flags 1117。
- 預設值是 AUTOGROW_SINGLE_FILE,當 FileGroup 中的某個檔案達到自動成長閾值時,只有該檔案會成長。
- 從 SQL Server 2016 (13.x) 開始,追蹤旗標 1117 沒有任何作用。
在 SSMS 17.8.1 版本 亦支援 AUTOGROW_ALL_FILES 屬性與產生 T-SQL Script。
效能規劃建議
- 設計檔案資料時,啟用 Autogrowth,建議採用 MB 方式來成長,不使用 Percent 方式。
- 確保具備相同的大小,進而減少 allocation contention(配置競爭) 問題,提升效能。
FileGroup 內含多個資料檔案
- SQL Server 對於 FileGroup 內的所有檔案,預設是使用 比例性 的填滿策略。
- 依據每個檔案中的可用空間,使用 比例性 的填滿策略,將資料採取 循環 寫入到檔案內。
- 如果檔案的可用空間不足,將觸發自動成長事件來增長檔案。
- 如此一來,在同一個 FileGroup 內的資料檔案,就有可能大小不一的問題。導致資料的數據分布不均衡。
- 若要資料能均勻分布到各個資料檔案,資料檔案應該具備相同的大小,進而減少 allocation contention(配置競爭) 問題,提升效能。
啟用 Trace Flags 1117
功用
- 當大量使用 tempdb 資料庫時,將造成 allocation contention(配置競爭),拖延回應時間。
- 啟用 Trace Flags 1117,
- 影響到全部資料庫的每一個資料檔案。
- 當檔案群組中的某個檔案達到自動成長閾值時,檔案群組中的所有檔案都會成長。
- 減少 allocation contention(配置競爭) 問題,提升效能。
注意
- 從 SQL Server 2016 (13.x) 開始,追蹤旗標 1117 沒有任何作用。
- 改由 ALTER DATABASE 的 AUTOGROW_SINGLE_FILE 和 AUTOGROW_ALL_FILES 選項控制
缺點
- Trace Flags 1117 卻是 global(全域) 層級的旗標。
- 一旦啟用,影響到全部的資料庫,導致耗用更多的 硬碟空間。
- 改用 FileGroup 層級的 AUTOGROW_ALL_FILES,可依據資料存取特性,各別設定。
以下範例中
啟用 AUTOGROW_ALL_FILES 後,多耗用 34 % 的資料檔案空間。
AUTOGROW_ALL_FILES Option: All files in the filegroup grow.
01. 建立資料庫:FG_Move,並啟用 AUTOGROW_ALL_FILES 屬性。
參考以下說明:
Syntax ALTER DATABASE [dbname] MODIFY FILEGROUP [filegroup] { AUTOGROW_ALL_FILES | AUTOGROW_SINGLE_FILE } For example: ALTER DATABASE [FG_Move] MODIFY FILEGROUP [G4_ALL_FILES] AUTOGROW_ALL_FILES GO
AUTOGROW_SINGLE_FILE
- 適用於: SQL Server ( SQL Server 2016 (13.x) 至 SQL Server 2017)
- 當檔案群組中的某個檔案達到自動成長閾值時,只有該檔案會成長。 這是預設值。
AUTOGROW_ALL_FILES
- 適用於: SQL Server ( SQL Server 2016 (13.x) 至 SQL Server 2017)
- 當檔案群組中的某個檔案達到自動成長閾值時,檔案群組中的所有檔案都會成長。
FileGroup: G3_SINGLE_FILE 與 G4_ALL_FILES
- 兩者都包含有 4 個 Data Files,初始值: 10 MB,每次增量成長: 10 MB
- 但 FileGroup: G4_ALL_FILES 有啟用 AUTOGROW_ALL_FILES 資料庫屬性。
-- figure 01_Create_DB_FG_Move_AUTOGROW_ALL_FILES
02. SSMS 17.8.1 版本 已經支援 AUTOGROW_ALL_FILES 屬性與產生 T-SQL Script。
- 使用 SSMS 切換 資料庫屬性: AUTOGROW_ALL_FILES | AUTOGROW_SINGLE_FILE 。
-- figure 02_Autogrow_All_Files_SSMS
03. 觀察: 是否有啟用 AUTOGROW_ALL_FILES
- 使用 sys.filegroups 的 is_autogrow_all_files
- 適用於: SQL Server ( SQL Server 2016 (13.x) 至 目前版本)。
- 1 = 當自動成長臨界值,而檔案群組中的所有檔案成長的檔案群組符合中的檔案。
- 0 = 時自動成長臨界值,只有該檔案成長的檔案群組符合中的檔案。 這是預設值。
-- figure 31_is_autogrow_all_files
04. 觀察:全部資料庫的每個 FileGroup 是否有啟用 AUTOGROW_ALL_FILES 屬性。
-- figure 32_Get is_autogrow_all_files in all databases
05. 觀察: 資料庫內每個 FileGroup 的相關資訊
-- figure 03_List all filegroup and file of related information in database
-- figure 04_List all filegroup and file of related information in database
FileGroup: G3_SINGLE_FILE 與 G4_ALL_FILES
- 兩者都包含有 4 個 Data Files,初始值: 10 MB,每次增量成長: 10 MB
- 但 FileGroup: G4_ALL_FILES 有啟用 AUTOGROW_ALL_FILES 資料庫屬性。
06. 建立資料表與新增資料列。
- 建立 T1G3 與 T1G4 在 FileGroup: G3_SINGLE_FILE 與 G4_ALL_FILES 上。
- 每筆資料列的長度在 8000 byte 以上。
- 新增 7000 筆資料列。
-- figure 05_Create_Talbe_T1G3_T1G4_Insert_Rows
08. 新增資料列後,再度觀察:資料庫內每個 FileGroup 的相關資訊。
FileGroup: G3_SINGLE_FILE
- 各個 Data File 的成長量不一,分別是:20 , 10, 10, 20 (MB)。總使用量是: 60 MB。
- Data_Size 非平均分布,分別是:20, 10, 10, 15.25 (MB)。總使用量是: 55.25 MB。
FileGroup: G4_ALL_FILES
- 各個 Data File 成長量相同,都是:20 (MB)。總使用量是: 80 MB。
- 相較之下,多耗用 20 MB,多耗用 34 % 的資料檔案空間。
- Data_Size 採取 平均分布,都是:13.8125 (MB)。總使用量是:55.25 MB。
-- figure 11_List all filegroup and file of related information in database
09. 觀察:資料表的使用空間,包含 Data 與 Index。
-- figure 21_Get size of tables(include index and data)
10. 觀察: Index 的 fragmentation。
- T1G3 資料表 的 Fragment_count: 656
- 預設值,AUTOGROW_SINGLE_FILE
- T1G4 資料表 的 Fragment_count 增加為 : 898
- 有啟用 AUTOGROW_ALL_FILES
-- figure 22_Get fragmentation for each index
11. 觀察 Report: Index_Physical_Statistics
- T1G3 資料表 的 Fragment_count: 656
- 預設值,AUTOGROW_SINGLE_FILE
- T1G4 資料表 的 Fragment_count 增加為 : 898
- 有啟用 AUTOGROW_ALL_FILES
-- figure 23_Index_Physical_Statistics
File and Filegroup Fill Strategy (檔案與檔案群組填滿策略)
以下為預設的 AUTOGROW_SINGLE_FILE 屬性。
檔案群組針對每個檔案群組內的所有檔案,使用 比例性 的填滿策略。
- 當資料寫入檔案群組時, SQL Server Database Engine 不會將所有資料都寫入第一個檔案,直到該檔案滿了為止;
- 而是在檔案群組內的每一個檔案中,寫入與檔案可用空間等比例的量, 然後再寫入下一個檔案。
例如,
若檔案 f1 有 100 MB 可用空間、檔案 f2 有 200 MB 可用空間,系統就會從檔案 f1 配置 1 份範圍,再從檔案 f2 配置 2 份範圍,其餘依此類推。
如此一來,兩個檔案大約會在相同的時間填滿,而達成簡易等量配置。
檔案群組中的 所有檔案 都填滿之後, SQL Server Database Engine 會以 循環配置 的方式,自動一次擴充一個檔案,以容納更多資料,但前提是資料庫必須設定為自動成長。
例如,
檔案群組由 3 個檔案組成,全部都設為自動成長。
- 當檔案群組中所有檔案的空間都用完時,只會先擴充第 1 個檔案。
- 當第 1 個檔案已滿,不能再寫入更多資料到檔案群組時,再擴充第 2 個檔案。
- 當第 2 個檔案已滿,不能再寫入更多資料到檔案群組時,再擴充第 3 個檔案。
- 如果第 3 個檔案已滿,不能再寫入更多資料到檔案群組時,再重新擴充第 1 個檔案,依此類推。
Sample Code
20180701_AUTOGROW_ALL_FILES Option
https://drive.google.com/drive/folders/0B9PQZW3M2F40OTk3YjI2NTEtNjUxZS00MjNjLWFkYWItMzg4ZDhhMGIwMTZl?usp=sharing
Reference
Recommended updates and configuration options for SQL Server 2012 and SQL Server 2014 with high-performance workloads
https://support.microsoft.com/en-us/help/2964518/recommended-updates-and-configuration-options-for-sql-server-2012-and
SQL Server 2016: Changes in default behavior for autogrow and allocations for tempdb and user databases
https://blogs.msdn.microsoft.com/sql_server_team/sql-server-2016-changes-in-default-behavior-for-autogrow-and-allocations-for-tempdb-and-user-databases/
AUTOGROW_ALL_FILES and READ_ONLY aren't either updated by DDL or preserved after a database restarts in SQL Server 2016
https://support.microsoft.com/en-us/help/3163924/autogrow-all-files-and-read-only-aren-t-either-updated-by-ddl-or-prese
ALTER DATABASE (Transact-SQL) File and Filegroup Options
https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql-file-and-filegroup-options?view=sql-server-2017
Database Files and Filegroups
https://docs.microsoft.com/en-us/sql/relational-databases/databases/database-files-and-filegroups?view=sql-server-2017
SQL 2016 – It Just Runs Faster: -T1117 and -T1118 changes for TEMPDB and user databases
https://blogs.msdn.microsoft.com/psssql/2016/03/15/sql-2016-it-just-runs-faster-t1117-and-t1118-changes-for-tempdb-and-user-databases/
Recommendations to reduce allocation contention in SQL Server tempdb database
https://support.microsoft.com/en-us/help/2154845/recommendations-to-reduce-allocation-contention-in-sql-server-tempdb-d
DBCC TRACEON - Trace Flags (Transact-SQL)
https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql?view=sql-server-2017
沒有留言:
張貼留言