最佳化分散式查詢

為提升效能,SQL Server 特別針對分散式查詢執行下列類型的最佳化:

  • 搭配 OLE DB SQL 命令提供者使用遠端查詢執行。

    如果 OLE DB 提供者符合下列最小需求,OLE DB 提供者就會被當成是 SQL 命令提供者:

    • 支援 Command 物件與其所有的強制介面。

    • 支援 DBPROPVAL SQL SUBMINIMUM 語法、或是 Entry Level (含) 以上的 ISO、或在 Core Level (含) 以上的 ODBC。提供者應該透過 DBPROP_SQLSUPPORT OLE DB 屬性公開這個用語層級。

  • 搭配 OLE DB 索引提供者使用索引存取。

    如果 OLE DB 提供者符合下列最小需求,OLE DB 提供者就會被當成是索引提供者:

    • 支援具有 TABLES、COLUMNS 與 INDEXES 結構描述資料列集的 IDBSchemaRowset 介面。

    • 支援指定索引名稱與對應的基底資料表名稱,來使用 IOpenRowset 開啟某索引的資料列集。

    • Index 物件應支援其所有的強制介面:IRowsetIRowsetIndexIAccessorIColumnsInfoIRowsetInfoIConvertTypes

    • 使用 IRowsetLocate 針對索引基底資料表開啟的資料列集,應該支援 IOpenRowset 介面在以擷取自索引之書籤為基礎之資料列上的定位。

遠端查詢執行

SQL Server 會嘗試儘可能將分散式查詢的評估委派給 SQL 命令提供者。一個只存取儲存在提供者資料來源中遠端資料表的 SQL 查詢,會從原始的分散式查詢中被擷取出來,並針對提供者執行。這個行為使得從提供者傳回的資料列數變少,並讓提供者可以使用索引來評估查詢。

究竟要將多少原始分散式查詢委派給 SQL 命令提供者,其考量因素如下:

  • SQL 命令提供者支援的用語層級

  • 定序相容性

SQL 命令提供者支援的用語層級

只在特定用語層級支援要委派的作業時,SQL Server 才會委派作業。從最高到最低的用語層級為:SQL Server、ISO Entry Level、ODBC Core 和 Jet。用語層級越高,SQL Server 可委派給提供者的作業越多。

[!附註]

當提供者對應到 SQL Server 連結伺服器時,就會用到 SQL Server 用語層級。

每個用語層級都是較低層級的超集。因此,如果將作業委派給特定層級,表示此作業也委派給所有較高的層級。

涉及 bit 和 uniqueidentifer 資料類型的查詢絕不會委派給提供者,而且一定會在本機評估。

當 SET 選項 CONCAT_NULL_YIELDS_NULL 為 OFF 時,字串串連一律在本機完成。

下列作業/語法元素會委派給指定的用語層級,以及所有較高的層級:

  • SQL Server:外部聯結、CUBE、ROLLUP、模數運算子 (%)、位元運算子、字串函數與算術系統函數。

  • ISO Entry Level:UNION 和 UNION ALL。

  • ODBC Core:含 DISTINCT 的彙總函數與字串常數。

  • Jet:不含 DISTINCT 的彙總函式、排序 (ORDER BY)、內部聯結、述詞、子查詢運算子 (EXISTS、ALL、SOME、IN)、DISTINCT、較高層未提到的算術運算子、較高層未提到的常數以及所有邏輯運算子。

    例如,除了涉及 CUBE、ROLLUP、外部聯結、模數運算子 (%)、位元運算子、字串函數與算術系統函數的作業,以外的所有作業都會委派給 ISO Entry Level 提供者 (不是 SQL Server)。

定序相容性

對於分散式查詢,所有字元資料的比較語意,都是由本機 SQL Server 執行個體的字元集與排序次序所定義。SQL Server 支援多個定序。每一個資料行的定序可以不同,而且每一個字元值都有相關聯的定序屬性。SQL Server 會解譯來自遠端資料來源之字元資料的定序屬性,並依此屬性來處理。如需有關遠端資料行定序的詳細資訊,請參閱<分散式查詢中的定序>。

只有當 SQL Server 可以判定下列項目時,才能將字元資料行的比較與 ORDER BY 作業委派給提供者:

  • 基礎資料來源使用定序順序與資料行的字元集。

  • 字元比較的語意遵循 ISO 和 SQL Server 標準。

主題<分散式查詢中的定序>摘要說明 SQL Server 如何決定每個資料行的定序。如果遠端資料來源支援該定序時,提供者可以視同具備定序相容性。

其他 SQL 支援考慮事項

SQL 用語層級不規定下列 SQL 語法元素:

  • 巢狀查詢支援

    如果提供者支援巢狀查詢 (子查詢),SQL Server 可以將這些作業委派給提供者。因為巢狀查詢支援無法從 OLE DB 屬性自動判斷,所以系統管理員應該設定 NestedQueries 提供者選項,讓 SQL Server 知道提供者支援巢狀查詢。

  • 參數標記支援

    如果提供者支援參數化查詢執行 (藉由在查詢中使用 ? 參數標記),則 SQL Server 可以將參數化查詢執行委派給提供者。因為參數標記支援無法從 OLE DB 屬性自動判斷,所以系統管理員應該設定 DynamicParameters 提供者選項,讓 SQL Server 知道提供者支援參數標記。

  • LIKE 支援

    如果提供者支援在 SQL Server 語法和語意中實作 LIKE 運算子,可以設定 SqlServerLike 提供者選項,來表示支援。

    如需有關設定這些提供者選項的詳細資訊,請參閱<設定分散式查詢的 OLE DB 提供者>。

索引查詢

SQL Server 可以使用會用到索引提供者的索引來評估述詞的執行策略,然後再對遠端資料表執行排序作業。若要啟用對提供者執行索引存取,請設定 IndexAsAccessPath 提供者選項。

此外,當使用涉及字元資料行的索引時,請為對應的連結伺服器將 [定序相容] 連結伺服器組態選項設成 true。如需詳細資訊,請參閱<sp_serveroption (Transact-SQL)>。

[!附註]

使用 SQL Server Management Studio 可用圖形方式顯示執行計畫,以決定特定分散式查詢的執行計畫。當執行計畫中採用遠端查詢執行時,就會使用 Remote Query 邏輯與實體運算子來呈現。這個運算子的引數是在遠端執行的查詢。