解析分散式資料分割檢視
SQL Server 查詢處理器最佳化分散式資料分割檢視的效能。分散式資料分割檢視效能最重要的一點,便是將在成員伺服器間傳輸的資料量最小化。
SQL Server 會建立智慧型的動態計畫,以有效使用分散式查詢來存取遠端成員資料表的資料:
查詢處理器會先使用 OLE DB 來擷取各成員資料表中的 CHECK 條件約束。這可以讓查詢處理器將索引鍵值的散發對應到每個成員資料表中。
查詢處理器會將 SQL 陳述式 WHERE 子句中所指定的索引鍵範圍,與顯示成員資料表中資料列分散情況的對應做比較。然後,查詢處理器會建立查詢執行計畫,而此計畫的分散式查詢僅會擷取那些完成 SQL 陳述式所需的遠端資料列。執行計畫也會以系統取得所需的資訊前,對資料或中繼資料延遲遠端成員資料表存取的方法執行。
例如,某系統中的客戶資料表分割成 Server1 (CustomerID 從 1 到 3299999)、Server2 (CustomerID 從 3300000 到 6599999)、和 Server3 (CustomerID 從 6600000 到 9999999) 三部份。
請參考這個在 Server1 上執行之查詢所建立的執行計畫:
SELECT *
FROM CompanyData.dbo.Customers
WHERE CustomerID BETWEEN 3200000 AND 3400000;
這個查詢的執行計畫,可擷取區域成員資料表中 CustomerID 索引鍵值為 3200000 到 3299999 之間的資料列,並提交分散式查詢以擷取 Server2 中索引鍵值為 3300000 到 3400000 間的資料列。
SQL Server 查詢處理器也可以將動態邏輯建立至 SQL 陳述式的查詢執行計畫中,但該計畫建立時索引鍵值是未知的。例如,請參考這個預存程序:
CREATE PROCEDURE GetCustomer @CustomerIDParameter INT
AS
SELECT *
FROM CompanyData.dbo.Customers
WHERE CustomerID = @CustomerIDParameter;
SQL Server 無法預測每次執行程序時,@CustomerIDParameter 參數將提供的索引鍵值。因為索引鍵值無法預測,所以查詢處理器也無法預測必須存取哪個成員資料表。為了處理這種情形,SQL Server 建立了具有條件式邏輯的執行計畫 (稱為動態篩選),可根據輸入參數值來控制存取的成員資料表。假設 GetCustomer 預存程序是在 Server1 上執行,則執行計畫邏輯便可以表示如下:
IF @CustomerIDParameter BETWEEN 1 and 3299999
Retrieve row from local table CustomerData.dbo.Customer_33
ELSEIF @CustomerIDParameter BETWEEN 3300000 and 6599999
Retrieve row from linked table Server2.CustomerData.dbo.Customer_66
ELSEIF @CustomerIDParameter BETWEEN 6600000 and 9999999
Retrieve row from linked table Server3.CustomerData.dbo.Customer_99
SQL Server 有時候甚至會為尚未參數化的查詢建立這些動態執行計畫類型。最佳化工具可能會參數化查詢以重複使用執行計畫。如果最佳化工具將對參考資料分割檢視的查詢進行參數化,則最佳化工具不會再假設需要的資料列將取自指定的基底資料表。接著在執行計畫中必須使用動態篩選。如需詳細資訊,請參閱<簡單參數化>。