Share via


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

更新: 2006 年 12 月 12 日

您可以使用 Transact-SQL ALTER TABLE...SWITCH 陳述式以下列方式快速並有效傳送資料區塊:

  • 將資料表作為資料分割,指派到現有的資料分割資料表。
  • 從一個資料分割資料表切換資料分割到另一個。
  • 重新指派資料分割形成單一的資料表。

如需資料分割切換概念的詳細資訊,請參閱<設計資料分割來管理資料的子集>。若要查看實作資料分割切換的範例程式碼,請參閱<Readme_SlidingWindow>。

切換資料分割的一般需求

傳送資料分割時,您實際上沒有移動資料。您只是變更資料儲存相關位置的中繼資料。這表示從中移動資料分割的資料表 (來源資料表) 以及接收資料分割的資料表 (目標資料表) 兩者必須存在於執行 SWITCH 作業之前的資料庫中。

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

如果您要重新指派資料分割來形成單一且沒有資料分割的資料表,則接收資料分割的資料表必須已經建立好,而且必須是空的。

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

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

資料表與索引結構需求

來源資料表和目標資料表兩者必須有相同的結構。這表示:

  • 這些資料表必須有相同的資料行,包括相同的名稱、相同的資料類型、長度、定序、有效位數、小數位數、Null 屬性和 PRIMARY KEY 條件約束,而且也要有相同的 ANSI_NULLS 和 QUOTED IDENTIFIER 設定。此外,資料行必須以相同的順序定義。不考慮 IDENTITY 屬性。
    ms191160.Caution(zh-tw,SQL.90).gif注意:
    執行資料分割切換可能會造成在目標資料表的 IDENTITY 資料行引入重複的值,以及在來源資料表的 IDENTITY 資料行產生值的間距。如果需要的話,您可以使用 DBCC CHECKIDENT 來檢查資料表的識別值並更正這些值。
  • 資料分割資料行的 Null 屬性必須一致。也就是說兩者必須同時是 NULL 或 NOT NULL。如果其中一個資料表沒有進行資料分割,對應到另一個資料表之分割資料行的資料行其可為 Null 屬性必須與另一個資料表的分割資料行一致。
    ms191160.note(zh-tw,SQL.90).gif重要事項:
    我們建議您在資料分割資料表的資料分割資料行上指定 NOT NULL,以及在非資料分割資料表 (ALTER TABLE...SWITCH 作業的來源或目標) 上進行這項作業。透過進行這項作業,您可以確保資料分割資料行上的任何 CHECK 條件約束都不需要檢查 Null 值。Null 值一般位於資料分割資料表的最左邊資料分割。當您要切換最左邊資料分割以外的任何資料分割,而且 ANSI_NULLS 資料庫選項設定為 ON 時,如果來源和目標資料表上沒有 NOT NULL 條件約束,就可能會干擾同時在資料分割資料行上定義的任何 CHECK 條件約束。
  • 如果它們對應的資料分割索引鍵是計算的資料行,則定義計算資料行的運算式語法要相同,而且都要保留兩者的計算資料行。
  • 以 ROWGUID 屬性定義的任何資料行必須對應到另一個資料表中也是以 ROWGUID 屬性定義的資料行。
  • 任何 xml 資料行必須以相同的 XML 結構描述集合輸入。
  • 任何 textntextimage 資料行的 in-row 設定要相同。如需有關此設定的詳細資訊,請參閱<同資料列資料>。
  • 這些資料表要有相同的叢集索引。這些索引不能停用。
  • 任何在目標資料表中定義的非叢集索引也要在來源資料表中定義,而且每個索引鍵資料行的唯一性、子索引鍵和排序方向 (ASC 或 DESC) 都要有相同的結構。停用的非叢集索引不受此需求的限制。

條件約束需求

任何在目標資料表中定義的 CHECK 條件約束也要在來源資料表中定義,此定義可以完全相符或適用於目標資料表的 CHECK 條件約束。

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

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

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

ms191160.Caution(zh-tw,SQL.90).gif注意:
請避免在條件約束定義中使用資料類型轉換。如果條件約束包含隱含或明確資料類型轉換而且是在資料分割切換之來源的資料表上定義,就可能會造成 ALTER TABLE...SWITCH 失敗。

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

移動資料分割的額外需求

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

  • 在來源資料表或目標資料表上的任何索引必須與資料表校準,無論來源資料表或目標資料表一者有資料分割,或是兩者都有資料分割。
  • 來源資料表或目標資料表上可以沒有全文檢索索引。
  • 目標資料表上可以沒有任何 XML 索引。
  • 來源資料表和目標資料表之間可以沒有作用中的主索引鍵/外部索引鍵關係,而是由來源資料表保留主索引鍵。
  • 來源資料表和目標資料表之間可以沒有作用中的主索引鍵/外部索引鍵關係,而是由目標資料表保留外部索引鍵。
  • 來源資料表不能由另一個資料表的外部索引鍵參考。
  • 來源資料表和目標資料表不能以結構描述繫結參與檢視。因此,不能在它們上面定義索引檢視。
  • 來源資料表或目標資料表上可以沒有定義的規則。
    ms191160.note(zh-tw,SQL.90).gif附註:
    規則是回溯相容性功能。比較好的實作方式是使用 CHECK 條件約束。若為 CHECK 條件約束限制,請參閱本主題中前面的條件約束需求。
  • 來源資料表或目標資料表都不能是來源的複寫。
  • 資料分割切換與執行 ALTER TABLE 陳述式有關。因此,您必須擁有與 ALTER TABLE 陳述式相關的必要資料庫權限。來源資料表與目標資料表之間的使用權限集合不必相同。

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

ms191160.note(zh-tw,SQL.90).gif附註:
執行 ALTER TABLE…SWITCH 作業可在來源和目標資料表上取得結構描述修改鎖定,以確保在變更期間沒有其他連接參考,甚至是資料表的中繼資料。如需有關鎖定的詳細資訊,請參閱<鎖定模式>。

若要移動資料表資料分割

請參閱

概念

設計資料分割來管理資料的子集

其他資源

DBCC CHECKIDENT (Transact-SQL)
ALTER PARTITION FUNCTION (Transact-SQL)
ALTER PARTITION SCHEME (Transact-SQL)
Readme_SlidingWindow

說明及資訊

取得 SQL Server 2005 協助

變更歷程記錄

版本 歷程記錄

2006 年 12 月 12 日

新增內容:

新增一則建議事項,內容有關建議在資料分割資料表的資料分割資料行上指定 NOT NULL,以及在非資料分割資料表 (ALTER TABLE...SWITCH 作業的來源或目標) 上進行這項作業。

2006 年 4 月 14 日

變更的內容:
  • 在來源資料表上定義的 XML 索引不會影響資料分割切換。目標資料表上可以沒有任何切換資料分割的 XML 索引。