使用資料分割切換有效傳送資料

分割資料可讓您快速且有效率地管理和存取資料子集,同時又可維護整個資料集合的完整性。您可以使用 Transact-SQL ALTER TABLE...SWITCH 陳述式以下列方式快速並有效地傳送您的資料子集:

  • 將資料表作為資料分割,指派到現有的資料分割資料表。

  • 從一個資料分割資料表切換資料分割到另一個。

  • 重新指派資料分割形成單一的資料表。

如需有關資料分割切換概念的詳細資訊,請參閱 ReadMe_SlidingWindow 範例。如需有關範例的詳細資訊,請參閱<安裝 SQL Server 範例和範例資料庫的考量>。

切換資料分割的一般需求

當系統傳送資料分割時,資料不會實體移動,只是變更了有關資料位置的中繼資料。在您能夠切換資料分割之前,必須先符合幾個一般需求:

  • 在 SWITCH 作業之前,必須存在兩個資料表。在您進行切換作業之前,移動資料分割的資料表 (來源資料表) 以及接收資料分割的資料表 (目標資料表) 必須存在於資料庫中。

  • 接收資料分割必須存在,且必須為空。當您要將作為資料分割的資料表加入到現有的資料分割資料表,或將資料分割從一個資料分割資料表移動到另一個,接收新資料分割的資料分割必須存在,而且必須是空的。

  • **接收的非資料分割資料表必須存在,且必須為空。**如果您要重新指派資料分割來形成單一的非資料分割的資料表,則接收新資料分割的資料表必須已經存在,而且必須是空的非資料分割資料表。

  • **磁碟分割必須位於相同的資料行。**如果您要從一個資料分割資料表切換到另一個,兩個資料表都必須在相同的資料行上進行資料分割。

  • **來源和目標資料表兩者必須共享相同的檔案群組。**ALTER TABLE...SWITCH 陳述式的來源和目標資料表,必須都位於相同的檔案群組,而且它們的大數值資料行也必須儲存在相同的檔案群組中。任何對應的索引、索引資料分割或索引檢視資料分割,必須也位於相同的檔案群組。但是,對應資料表或其他對應索引的檔案群組可以是不相同的。

如需有關在定義索引檢視時進行資料分割切換的詳細資訊,請參閱<在定義索引檢視時進行資料分割切換>。

資料表與索引結構需求

除了上述一般需求之外,來源資料表和目標資料表兩者必須有相同的結構。結構需求如下:

  • 來源資料表和目標資料表兩者必須有相同的資料行結構和順序。這些資料表必須有相同的資料行,包括相同的名稱、相同的資料類型、長度、定序、有效位數、小數位數、Null 屬性和 PRIMARY KEY 條件約束 (如果有的話),而且也要有相同的 ANSI_NULLS 和 QUOTED IDENTIFIER 設定。此外,資料行必須以相同的順序定義。不考慮 IDENTITY 屬性。

    警告注意事項注意

    資料分割切換可能會造成在目標資料表的 IDENTITY 資料行引入重複的值,以及在來源資料表的 IDENTITY 資料行產生值的間距。如果需要的話,您可以使用 DBCC CHECKIDENT 來檢查資料表的識別值並更正這些值。

  • 資料分割資料行的 Null 屬性必須相符。來源和目標資料表兩者必須是 NULL 或 NOT NULL。如果其中一個資料表沒有進行資料分割,對應到另一個資料表之資料分割資料行的資料行 Null 屬性,必須與資料分割資料表的資料行相符。

    重要事項重要事項

    我們建議您為資料分割資料表中的資料分割資料行指定 NULL 或 NOT NULL。我們也建議您在 ALTER TABLE...SWITCH 作業的來源或目標之非資料分割資料表上,指定 NOT NULL。當資料分割資料行為 NOT NULL,您就可以確保資料分割資料行上的任何 CHECK 條件約束都不會強迫檢查 Null 值。Null 值一般位於資料分割資料表的最左邊資料分割。當切換到任何非最左邊的資料分割、同時 ANSI_NULLS 資料庫選項設定為 ON 時,如果來源和目標資料表上不存在 NOT NULL 條件約束,可能會影響同時在資料分割資料表上定義的所有 CHECK 條件約束。

  • 計算資料行必須有相同的語法。如果它們對應的資料分割索引鍵是計算的資料行,則定義計算資料行的運算式語法要相同,而且都要保留兩者的計算資料行。

  • **ROWGUID 屬性必須相同。**以 ROWGUID 屬性定義的任何資料行必須對應到另一個資料表中也是以 ROWGUID 屬性定義的資料行。

  • **XML 資料行必須有相同的結構描述。**所有 xml 資料行必須以相同的 XML 結構描述集合輸入。

  • **所有 text、ntext 或 image 資料行的 in-row 設定要相同。**如需有關此設定的詳細資訊,請參閱<同資料列資料>。

  • 資料表必須有相同的叢集索引。來源和目標資料表必須有相同的叢集索引,而且在進行切換資料分割之前不能停用這些索引。

  • **必須定義相同的非叢集索引。**所有在目標資料表中定義的非叢集索引也要在來源資料表中定義,而且每個索引鍵資料行的唯一性、子索引鍵和排序方向 (ASC 或 DESC) 都要有相同的結構。停用的非叢集索引不受此需求的限制。

條件約束需求

要移動資料分割,必須滿足下列額外條件約束需求:

  • **CHECK 條件約束必須完全符合或適用於來源和目標資料表。**所有在目標資料表中定義的 CHECK 條件約束必須在來源資料表中定義,此定義可以完全相符或適用 (例如,做為子集) 於目標資料表的 CHECK 條件約束。

  • **int 資料行上的條件約束必須是相同的,或必須為子集。**所有來源資料表中 int 資料行的 CHECK 條件約束,必須完全符合目標資料表中 int 資料行的條件約束,或做為其子集。例如,如果目標資料表的 int 資料行 Column1 有一個指定 Column1 < 100 的條件約束,來源資料表的對應資料行 Column1 就必須有相同的條件約束或其值是目標資料表的條件約束子集,例如來源資料表的 Column1 < 90。指定多個資料行的 CHECK 條件約束必須使用相同的語法定義。

  • **非資料分割資料表必須與目標資料分割有相同的條件約束。**如果您要將非資料分割的資料表當做資料分割加入現有的資料分割資料表,就必須在對應到目標資料表資料分割索引鍵的來源資料表資料行上定義一個條件約束。這樣可確保值的範圍位於目標資料分割的界限值內。

  • **來源資料分割的界限值必須在目標資料分割的界限之內。**如果您要將資料分割資料表的資料分割切換到另一個資料分割資料表,來源資料分割的界限值就必須位於目標資料分割的界限值內。如果界限值不符合,必須要有條件約束定義在來源資料表的分割索引鍵上,以確保資料表的所有資料都位於目標資料分割的界限值內。

    警告注意事項注意

    請避免在條件約束定義中使用資料類型轉換。如果條件約束包括隱含或明確資料類型轉換,而且是在資料分割切換之來源的資料表上定義,就可能會造成 ALTER TABLE...SWITCH 失敗。

  • **來源和目標資料表必須有相同的 FOREIGN KEY 條件約束。**如果目標資料表有任何 FOREIGN KEY 條件約束,來源資料表在對應的資料行上就必須有相同的外部索引鍵定義,而且這些外部索引鍵必須參考目標資料表的相同主索引鍵。來源資料表的外部索引鍵不能標示為 is_not_trusted (可在 sys.foreign_keys 目錄檢視中檢視),除非目標資料表對應的外部索引鍵也標示為 is_not_trusted。如需有關此設定的詳細資訊,請參閱<停用索引的指導方針>。SQL Server 會將目標資料表之外部索引鍵上定義的任何 CASCADE 規則套用到新移動的資料分割。

移動資料分割的額外需求

要移動資料分割,也必須滿足下列額外需求:

  • **索引必須與資料表資料分割對齊。**所有在來源資料表上的索引必須與來源資料表對齊,所有在目標資料表上的索引也必須與目標資料表對齊。來源資料表和目標資料表可以是:兩者都經過資料分割、兩者都沒有資料分割,或是只有一個資料表經過資料分割。如需有關索引對齊的詳細資訊,請參閱<資料分割索引的特殊指導方針>。

  • **適用於有索引檢視的來源資料表之額外條件約束與需求。**如果 ALTER TABLE SWITCH 陳述式中的目標資料表已定義索引檢視,請參閱<在定義索引檢視時進行資料分割切換>,查看相關條件約束與範例。

  • **不允許全文檢索索引。**來源資料表或目標資料表上不能使用全文檢索索引。

  • **目標資料表上不允許 XML 索引。**目標資料表上不能使用 XML 索引。

  • **如果來源資料表有主索引鍵,則不可定義主索引鍵/外部索引鍵。**當來源資料表有主索引鍵時,來源資料表和目標資料表之間不能有作用中的主索引鍵/外部索引鍵關係。

  • **如果目標資料表有外部索引鍵,則不可定義主索引鍵/外部索引鍵。**當目標資料表有外部索引鍵時,來源資料表和目標資料表之間不能有作用中的主索引鍵/外部索引鍵關係。

  • **另一個資料表的外部索引鍵不能參考來源資料表。**不允許另一個資料表的外部索引鍵參考來源資料表。

  • **在來源或目標資料表上不允許有規則。**來源資料表或目標資料表上不能定義規則。可在來源及目標資料表上使用 CHECK 條件約束。

    [!附註]

    規則是回溯相容性功能。比較好的實作方式是使用 CHECK 條件約束。若為 CHECK 條件約束限制,請參閱本主題中前面的條件約束需求。

  • **來源和目標資料表必須無法複寫。**來源資料表或目標資料表都不能做為複寫的來源。

  • **在資料分割切換之前,必須擁有必要的資料庫權限。**因為切換資料分割使用 ALTER TABLE 陳述式,因此您必須擁有與 ALTER TABLE 陳述式相關的必要資料庫權限。來源資料表與目標資料表之間的使用權限集合不必相同。

  • **在移動資料分割時,必不能啟動觸發程序。**移動資料表資料分割不會啟動 INSERT、UPDATE 或 DELETE 觸發程序或重疊顯示動作,因此來源資料表或目標資料表不必擁有類似定義的觸發程序才能移動資料分割。

    [!附註]

    在執行 ALTER TABLE…SWITCH 作業期間,可在來源和目標資料表上取得結構描述修改鎖定,以確保在變更期間沒有其他連接參考資料表。如需有關鎖定的詳細資訊,請參閱<鎖定模式>。

若要移動資料表資料分割