最佳化分散式查詢
為提升效能,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 物件應支援其所有的強制介面:IRowset、IRowsetIndex、IAccessor、IColumnsInfo、IRowsetInfo 和 IConvertTypes。
使用 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 邏輯與實體運算子來呈現。這個運算子的引數是在遠端執行的查詢。