Share via


建立分散式資料分割檢視

實作資料分割檢視之前,您必須先將資料表水平地分割。設計資料分割檢視時,必須很清楚每個成員資料表所屬的資料。原始資料表會被數個較小型的成員資料表所取代。每一個成員資料表與原始資料表具有相同數量的資料行,且每一個資料行與原始資料表中的對應資料行具有相同的屬性,例如資料類型、大小與定序。如果您建立的是分散式資料分割檢視,每一個成員資料表便位於個別的成員伺服器上。為了達到最佳的位置透明度,成員資料庫在每一個成員伺服器上的名稱應該相同,不過這並不是必要條件。例如:Server1.CustomerDBServer2.CustomerDBServer3.CustomerDB

建立成員資料表

您設計成員資料表,讓每個資料表依照索引鍵值的範圍來儲存原始資料表的水平切割。範圍是依照位於分割資料行的資料值而定。在每個成員資料表中值的範圍是由位於分割資料行的 CHECK 條件約束來強制限定,且範圍不得重疊。例如,如果一個資料表的範圍是 1 到 200000,另一個資料表的範圍就不可以是從 150000 到 300000,否則會不確定從 150000 到 200000 之間的值究竟在哪個資料表中。

例如,若將 Customer 資料表分割成三個資料表。這三個資料表的 CHECK 條件約束如下列所示:

-- On Server1:
CREATE TABLE Customers_33
  (CustomerID   INTEGER PRIMARY KEY
                CHECK (CustomerID BETWEEN 1 AND 32999),
  ... -- Additional column definitions)

-- On Server2:
CREATE TABLE Customers_66
  (CustomerID   INTEGER PRIMARY KEY
                CHECK (CustomerID BETWEEN 33000 AND 65999),
  ... -- Additional column definitions)

-- On Server3:
CREATE TABLE Customers_99
  (CustomerID   INTEGER PRIMARY KEY
                CHECK (CustomerID BETWEEN 66000 AND 99999),
  ... -- Additional column definitions)

定義分散式資料分割檢視

建立成員資料表之後,請在每個成員伺服器上定義一個分散式資料分割檢視;而每一個檢視都具有相同名稱。這可讓參考分散式資料分割檢視表名稱的查詢,在一個或多個成員伺服器上執行。系統的運作情形就如原始資料表的副本位於每個成員伺服器上一般,但是每個伺服器則只有一個成員資料表與一個分散式資料分割檢視。資料的位置對於應用程式而言是透明的。

您可以執行下列工作,來建立分散式資料分割檢視:

  • 在每一個成員伺服器上新增連結的伺服器定義,各成員伺服器中包含在其他成員伺服器上執行查詢時,所需的連接資訊。這使得分散式資料分割檢視可以存取其他伺服器上的資料。

  • 對於分散式資料分割檢視中使用的每一個連結的伺服器定義,使用 sp_serveroption 來設定 lazy schema validation 選項。這樣可最佳化效能,因為確定查詢處理器不會為任何一個連結資料表要求中繼資料,直到遠端成員資料表確實需要資料為止。

  • 在每一個成員伺服器上建立一個分散式資料分割檢視。檢視使用分散式 SELECT 陳述式來存取連結的成員伺服器上的資料,並將分散式資料列與本機成員資料表中的資料列合併。

若要為上述範例建立分散式資料分割檢視,您必須執行下列動作:

  • 使用 Server2 的連接資訊來新增名為 Server2 之連結的伺服器定義,以及用來存取 Server3 且名為 Server3 之連結的伺服器定義。

  • 建立下列分散式資料分割檢視:

    CREATE VIEW Customers AS
       SELECT * FROM CompanyDatabase.TableOwner.Customers_33
    UNION ALL
       SELECT * FROM Server2.CompanyDatabase.TableOwner.Customers_66
    UNION ALL
       SELECT * FROM Server3.CompanyDatabase.TableOwner.Customers_99
    
  • 對 Server2 和 Server3 執行相同的步驟。

資料表規則

成員資料表是以檢視定義中每個 SELECT 陳述式的 FROM 子句定義的。每個成員資料表都必須遵守下列規則:

  • 檢視對成員資料表的參考皆不可超過一次。

  • 在任何計算的資料行中,成員資料表都不可具有索引。

  • 成員資料表應在相同數目的資料行上具有所有 PRIMARY KEY 條件約束。

  • 成員資料表必須擁有相同的 ANSI 填補設定。如需有關 ANSI 填補設定的詳細資訊,請參閱<SET ANSI_PADDING>。

資料行規則

資料行是以檢視定義中每個 SELECT 陳述式的選取清單定義的。每個資料行都必須遵守下列規則:

  • 每個成員資料表中的所有資料行都必須包含在選取清單中。SELECT * FROM <成員資料表> 是可接受的語法。

  • 不能在選取清單中參考資料行一次以上。

  • 資料行的排列必須採用與選取清單中一樣的順序。

  • 每一個 SELECT 陳述式的選取清單中的資料行,必須具有相同類型。這包括資料類型、有效位數、小數位數和定序。例如,以下的檢視定義由於兩個 SELECT 陳述式中第一個資料行的資料類型不同,因此無效:

    CREATE VIEW NonUpdatable
    AS
    SELECT IntPrimaryKey, IntPartNmbr
    FROM FirstTable
      UNION ALL
    SELECT NumericPrimaryKey, IntPartNmbr
    FROM SecondTable
    

分割資料行規則

只有一個資料行可用於分割,而且它必須存在於每一個成員資料表上。CHECK 條件約束會識別每一個成員資料表上可用的資料。適用下列其他規則:

  • 每個資料表的 CHECK 條件約束索引鍵範圍,不能與其他任何資料表的範圍重疊。分割資料行的任一特定值,必須只對應到一個資料表。CHECK 條件約束只能使用這些運算子:BETWEEN、IN、AND、OR、<、<=、>、>=、=。

  • 分割資料行不可以是身分識別、預設或 timestamp 資料行。

  • 分割資料行在檢視的每個 SELECT 陳述式選取清單中的序數位置必須相同。例如,分割資料行永遠是每個選取清單中的第一個資料行,或是選取清單中的第二個資料行,依此類推。

  • 分割資料行不允許 Null 值。

  • 分割資料行必須是資料表主索引鍵的一部分。

  • 分割資料行不能是計算的資料行。

  • 分割資料行一定只有一個條件約束。如果不止一個條件約束,SQL Server 會忽略所有條件約束,在決定檢視是不是資料分割檢視時不會考慮它們。

  • 分割資料行的可更新性沒有限制。

符合所有這些規則的分割資料行,將支援查詢最佳化工具支援的所有最佳化。如需詳細資訊,請參閱<解析分散式資料分割檢視>。

一般規則

[!附註]

下列條件不適用於在同一台伺服器上建立的本機資料分割檢視。這是為了回溯相容性目的而納入的功能。

下列是一些需要考慮的額外規則:

  • 無法使用 EXCEPT 或 INTERSECT 運算子,來構成分散式資料分割檢視。

  • 分散式交易將被啟動,以保證不可部份完成性 (Atomicity) 會橫跨所有受到更新影響的節點。

  • XACT_ABORT SET 選項必須設成 ON。

  • 遠端資料表中的 smallmoneysmalldatetime 資料行分別對應為 moneydatetime。因此,本機資料表中對應的資料行也應該是 moneydatetime

  • 任何連結的伺服器都不能是回送連結的伺服器。這是指向相同 SQL Server 執行個體之連結的伺服器。

如果檢視上有 INSTEAD OF 觸發程序,則參考資料分割資料表但未遵循上述所有規則的該檢視仍然可以更新。但是,查詢最佳化工具可能無法永遠為包含 INSTEAD OF 觸發程序的檢視建立執行計畫 (這類查詢計畫的效率,與針對遵循所有規則的資料分割檢視而建立的計畫相同)。