优化分布式查询

为了提高性能,SQL Server 执行下列类型的、针对分布式查询的优化:

  • 对 OLE DB SQL 命令提供程序使用远程查询执行。

    如果 OLE DB 访问接口满足下列最低要求,则将该 OLE DB 访问接口视为 SQL 命令提供程序:

    • 支持 Command 对象及其所有必需接口。

    • 支持 DBPROPVAL SQL SUBMINIMUM 语法、ISO 入门级或更高级别,或者 ODBC 核心级或更高级别。提供程序应通过 DBPROP_SQLSUPPORT OLE DB 属性表现此专用语级别。

  • 对 OLE DB 索引提供程序使用索引访问。

    如果 OLE DB 访问接口满足下列最低要求,则将该 OLE DB 访问接口视为索引提供程序:

    • 支持带有 TABLES、COLUMNS 和 INDEXES 架构行集的 IDBSchemaRowset 接口。

    • 支持通过指定索引名称和相应的基表名称、使用 IOpenRowset 在索引上打开行集。

    • Index 对象应支持其所有必需接口:IRowsetIRowsetIndexIAccessorIColumnsInfoIRowsetInfoIConvertTypes

    • 为了在从索引检索到的书签以外的行上定位,使用 IOpenRowset 在索引基表上打开的行集应支持 IRowsetLocate 接口。

远程查询执行

SQL Server 尝试将分布式查询的评估工作尽可能多地委托给 SQL 命令提供程序。如果 SQL 查询只访问存储在提供程序数据源中的远程表,将从原始分布式查询中提取该查询并在提供程序上执行。这种行为将减少从提供程序返回的行数,并允许提供程序在评估查询时使用它的索引。

在多大程度上将原始分布式查询委派给 SQL 命令提供程序的影响因素包括:

  • SQL 命令提供程序支持的专用语级别

  • 排序规则兼容性

SQL 命令提供程序支持的专用语级别

SQL Server 只委派特定的专用语级别支持的操作。专用语级别从高到低依次为:SQL Server、ISO 入门级、ODBC 核心和 Jet。专用语级别越高,SQL Server 可以向提供程序委派的操作就越多。

注意注意

当提供程序对应于 SQL Server 链接服务器时可以使用 SQL Server 专用语级别。

每个专用语级别都是其较低级别的超集。因此,如果将操作委托给某个级别,也就将它委派给了所有较高级别。

从未将涉及 bit 和 uniqueidentifer 数据类型的查询委派给提供程序,而始终在本地对这类查询进行评估。

当 SET 选项 CONCAT_NULL_YIELDS_NULL 为 OFF 时,始终在本地完成字符串串联。

下列操作/语法元素委派给对应的专用语级别和所有较高级别:

  • SQL Server:外部联接、CUBE、ROLLUP、取模运算符 (%)、位运算符、字符串函数和算术系统函数。

  • ISO 入门级:UNION 和 UNION ALL。

  • ODBC 核心:带有 DISTINCT 的聚合函数和字符串常量。

  • Jet:不带 DISTINCT 的聚合函数、排序 (ORDER BY)、内部联接、谓词、子查询运算符(EXISTS、ALL、SOME、IN)、DISTINCT、在较高级别中没提到的算术运算符、在较高级别中没提到的常量、以及所有逻辑运算符。

    例如,除涉及 CUBE、ROLLUP、外部联接、取模运算符 (%)、位运算符、字符串函数和算术系统函数的运算外,所有其他运算都委托给不同时作为 SQL Server 的 ISO 入门级提供程序。

排序规则兼容性

对于分布式查询,所有字符数据的比较语义由字符集和本地 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 提供程序选项。

此外,使用涉及字符列的索引时,请将相应链接服务器的 collation compatible 链接服务器配置选项设置为 true。有关详细信息,请参阅 sp_serveroption (Transact-SQL)

注意注意

使用 SQL Server Management Studio 以图形方式显示执行计划,以便确定给定分布式查询的执行计划。在执行计划中使用远程查询执行时,使用 Remote Query 逻辑和物理运算符表示该查询执行。此运算符的参数显示远程执行的查询。