最佳化分散式查詢
為提升效能,SQL Server 2005 特別針對分散式查詢執行下列類型的最佳化:
- 搭配 OLE DB SQL 命令提供者使用遠端查詢執行。
如果 OLE DB 提供者符合下列最小需求,OLE DB 提供者就會被當成是 SQL 命令提供者:- 支援 Command 物件與其所有的強制介面。
- 支援 DBPROPVAL SQL SUBMINIMUM 語法、或是 Entry Level (含) 以上的 SQL-92 語法、或在 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、SQL-92 Entry level、ODBC Core 與 Jet。用語層級越高,SQL Server 可委派給提供者的作業越多。
附註: |
---|
當提供者對應到 SQL Server 連結伺服器時,就會用到 SQL Server 用語層級。 |
每個用語層級都是較低層級的超集。因此,如果將作業委派給特定層級,表示此作業也委派給所有較高的層級。
涉及 bit 和 uniqueidentifer 資料類型的查詢絕不會委派給提供者,而且一定會在本機評估。
當 SET 選項 CONCAT_NULL_YIELDS_NULL 為 OFF 時,字串串連一律在本機完成。
下列作業/語法元素會委派給指定的用語層級,以及所有較高的層級:
- SQL Server:外部聯結、CUBE、ROLLUP、模除運算子 (%)、位元運算子、字串函數與算術系統函數。
- SQL-92 Entry Level:UNION 與 UNION ALL。
- ODBC Core:含 DISTINCT 的彙總函數與字串常數。
- Jet:不含 DISTINCT 的彙總函數、排序 (ORDER BY)、內部聯結、述詞、子查詢運算子 (EXISTS、ALL、SOME、IN)、DISTINCT、較高層未提到的算術運算子、較高層未提到的常數以及所有邏輯運算子。
例如,除了涉及 CUBE、ROLLUP、外部聯結、模除運算子 (%)、位元運算子、字串函數與算術系統函數的作業,以外的所有作業都會委派給 SQL-92 Entry Level 提供者 (不是 SQL Server)。
定序相容性
對於分散式查詢,所有字元資料的比較語意,是由本機 SQL Server 執行個體的字元集與排序順序來定義。SQL Server 2005 支援多個定序。每一個資料行的定序可以不同,而且每一個字元值都有相關聯的定序屬性。SQL Server 會解譯來自遠端資料來源之字元資料的定序屬性,並依此屬性來處理。如需有關遠端資料行定序的詳細資訊,請參閱<分散式查詢中的定序>。
只有當 SQL Server 可以判定下列項目時,才能將字元資料行的比較與 ORDER BY 作業委派給提供者:
- 基礎資料來源使用定序順序與資料行的字元集。
- 字元比較的語意遵循 SQL-92 與 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 邏輯與實體運算子來呈現。這個運算子的引數是在遠端執行的查詢。 |