SQL Server 支援數據表和索引分割。 分割數據表和索引的數據會分割成可分散在資料庫中多個檔案群組的單位。 數據會水準分割,以便將數據列群組對應到個別分割區。 單一索引或數據表的所有分割區都必須位於相同的資料庫中。 當查詢或更新對數據執行時,數據表或索引會被視為單一邏輯實體。 MicrosoftSQL Server 的每個版本都無法使用數據分割數據表和索引。 如需 SQL Server 版本所支援的功能清單,請參閱 SQL Server 2014 版本支援的功能。
這很重要
SQL Server 2014 預設支援最多 15,000 個分割區。 在 SQL Server 2012 之前的版本中,數據分割數目預設限製為 1,000。在 x86 型系統上,可以建立具有超過 1000 個數據分割的數據表或索引,但不受支援。
分割的優點
分割大型數據表或索引可以具有下列管理性和效能優點。
您可以快速且有效率地傳輸或存取數據子集,同時維護數據收集的完整性。 例如,將數據從 OLTP 載入 OLAP 系統之類的作業只需要幾秒鐘,而不是未分割數據時作業所花費的分鐘和小時。
您可以更快速地對一或多個分割區執行維護作業。 作業更有效率,因為它們只以這些數據子集為目標,而不是整個數據表。 例如,您可以選擇壓縮一或多個分割區中的數據,或重建索引的一或多個分割區。
您可以根據您經常執行的查詢類型,以及在硬體設定上改善查詢效能。 例如,當數據表中的數據分割數據行相同時,查詢優化器可以更快速地處理兩個或多個數據分割數據表之間的等聯結查詢,因為數據分割本身可以聯結。
當 SQL Server 執行 I/O 作業的數據排序時,它會先依分割區排序數據。 SQL Server 一次存取一個磁碟驅動器,這可能會降低效能。 若要改善數據排序效能,請藉由設定RAID,將分割區的數據檔等量分割到多個磁碟上。 如此一來,雖然 SQL Server 仍依數據分割排序數據,但它可以同時存取每個分割區的所有磁碟驅動器。
此外,您可以啟用分割區層級的鎖定擴大,而不是整個數據表,以改善效能。 這可減少數據表上的鎖定爭用。
元件和概念
下列詞彙適用於數據表和索引分割。
數據分割函數
一個資料庫物件,用來定義數據表或索引的資料列如何依據稱為分割欄位的特定資料行的值對應到一組分割區。 也就是說,數據分割函數會定義數據表將擁有的分割區數目,以及如何定義數據分割的界限。 例如,假設數據表包含銷售訂單數據,您可能會想要根據 datetime 銷售日期欄位,將數據表劃分成12個(每月)分區。
分割區配置
資料庫物件,會將分割區函式的數據分割對應至一組檔案群組。 將分割區放在個別檔案群組的主要原因,是確定您可以在分割區上獨立執行備份作業。 這是因為您可以在個別檔案群組上執行備份。
資料分割資料行
用於數據分割函數來分割數據表或索引的欄位。 參與分區函數的計算欄必須明確標示為 PERSISTED。 所有適用於作為索引欄的有效數據類型都可以用作分割欄,但timestamp除外。 無法指定ntext、text、image、xml、varchar(max)、nvarchar(max)或varbinary(max)資料類型。 此外,無法指定 Microsoft .NET Framework Common Language Runtime (CLR) 使用者定義類型和別名資料類型欄。
對齊索引
索引,建置在與其對應數據表相同的分割區配置上。 當數據表及其索引對齊時,SQL Server 可以快速且有效率地切換數據分割,同時維護數據表及其索引的數據分割結構。 索引不必參與相同的具名數據分割函式,即可與其基表對齊。 不過,索引和基表的數據分割函數基本上必須相同,在該 1) 數據分割函數的自變數具有相同的數據類型,2) 它們定義相同的數據分割數目,而 3) 它們為分割區定義相同的界限值。
非對齊索引
與對應數據表分開分割的索引。 也就是說,索引具有不同的分割區配置,或放在與基表不同的檔案群組上。 在下列情況下,設計非對齊的數據分割索引很有用:
基表尚未分割。
索引鍵是唯一的,而且不包含資料表的分區列。
您希望基表使用不同的聯結數據行,參與具有更多數據表的共置聯結。
分割區消除
查詢優化器只存取相關分割區以符合查詢篩選準則的程式。
效能指導方針
新的 15,000 個分割區限制會影響記憶體、分割索引作業、DBCC 命令和查詢。 本節探討將數據分割數量增加至超過 1,000 所帶來的效能影響,並提供相應的解決方案以便需要時使用。 由於數據分割數目上限增加到 15,000 個,您可以儲存數據較長的時間。 不過,只要需要數據並維持效能與分割區數目之間的平衡,您就應該保留數據。
記憶體使用量和指導方針
如果大量分割區正在使用中,建議您至少使用 16 GB 的 RAM。 如果系統沒有足夠的記憶體,數據作語言 (DML) 語句、數據定義語言 (DDL) 語句和其他作業可能會因為記憶體不足而失敗。 在大量分割區上執行的作業上,具有16 GB RAM的系統可能會耗盡記憶體。 因此,您擁有超過 16 GB 的記憶體越多,就不太可能遇到效能和記憶體問題。
記憶體限制可能會影響 SQL Server 建置數據分割索引的效能或能力。 這種情況尤其常見於索引未與基表對齊或未與叢集索引對齊,而數據表已套用叢集索引。
分片索引操作
記憶體限制可能會影響 SQL Server 建置數據分割索引的效能或能力。 特別是在非對齊索引的情況下。 您可以對包含超過 1,000 個分割區的資料表,建立及重建非對齊的索引,但不予支援。 此做法可能會導致在作業期間效能降低或耗用過多記憶體。
建立和重建對齊的索引可能需要較長的時間才能執行,因為分割區數目增加。 建議您不要同時執行多個建立和重建索引命令,因為您可能會遇到效能和記憶體問題。
當 SQL Server 執行排序以建置數據分割索引時,它會先為每個分割區建置一個排序數據表。 然後,如果指定了 SORT_IN_TEMPDB 索引選項,它會在每個分區的個別檔案群組或 tempdb 中建置排序表。 每個排序表都需要最少的記憶體才能建置。 當您建置與基表對齊的數據分割索引時,會使用較少的記憶體,一次建置一個排序數據表。 不過,當您建置非對齊的數據分割索引時,會同時建置排序表。 因此,必須有足夠的記憶體來處理這些並行排序。 分割區數目愈大,所需的記憶體越多。 每個數據分割的每個排序表大小下限為 40 頁,每頁 8 KB。 例如,具有 100 個分割的非對齊分割索引需要足夠的記憶體,才能同時以串行方式排序 4,000 頁(40 * 100)。 如果此記憶體可用,建置作業將會成功,但效能可能會受到影響。 如果無法使用此記憶體,建置作業將會失敗。 或者,對齊分割索引有100個分區,只需具備足夠的記憶體以排序40頁,因為這些排序並不是同時進行的。
針對對齊和非對齊索引,如果 SQL Server 將平行處理原則的程度套用至多處理器電腦上的建置作業,記憶體需求可能會更大。 這是因為平行處理原則的程度越大,記憶體需求越大。 例如,如果 SQL Server 將平行處理原則的程度設定為 4,則具有 100 個數據分割的非對齊數據分割索引需要足夠的記憶體,讓四個處理器同時排序 4,000 個頁面,或 16,000 個頁面。 如果分割索引對齊,則記憶體需求會減少到由四個處理器排序40頁,即總共160(4 * 40)頁。 您可以使用 MAXDOP 索引選項,手動減少平行處理原則的程度。
DBCC 命令
當分割區數目增加時,DBCC 命令可能需要較長的時間才能執行。
查詢
運用分割區排除的查詢,當分割數量更多時,可能會具有相當或更佳的效能。 當分割區數目增加時,未使用分割區消除的查詢可能需要較長的時間才能執行。
例如,假設資料表有 1 億個資料列和欄位 A、 B、 C。 在案例 1 中,數據表會分割成數據行 上的 1000 個分割區 A。 在案例 2 中,數據表會分割成數據行 上的 10,000 個分割區 A。 在數據表上具有篩選資料行 A 的 WHERE 子句的查詢,將會執行分割區消除,並僅掃描一個分割區。 在案例 2 中,相同的查詢可能會執行得更快,因為分割區中掃描的數據列較少。 在欄位 B 上具有 WHERE 子句篩選的查詢將會掃描所有分區。 查詢在案例 1 中執行的速度可能會比案例 2 更快,因為要掃描的數據分割較少。
在數據分割數據行以外的數據行上使用 TOP 或 MAX/MIN 等運算子的查詢,可能會因為必須評估所有分割區而降低效能。
分割索引作業期間統計數據計算的行為變更
從 SQL Server 2012 開始,建立或重建數據分割索引時,不會掃描數據表中的所有數據列來建立統計數據。 反之,查詢最佳化工具會使用預設的採樣演算法來產生統計資料。 升級具有數據分割索引的資料庫之後,您可能會注意到這些索引的直方圖數據有所差異。 這種行為變更可能不會影響查詢效能。 若要掃描表格中的所有列來取得分區索引的統計數據,請使用 CREATE STATISTICS 或 UPDATE STATISTICS 搭配 FULLSCAN 子句。
相關工作
| 任務 | 主題 |
| 描述如何建立數據分割函式和數據分割配置,然後將這些數據套用至數據表和索引。 | 建立分區表和索引 |
相關內容
您可能會發現以下白皮書對於資料分割資料表和索引策略及實作非常有幫助。