解析分布式分区视图

SQL Server 查询处理器对分布式分区视图的性能进行优化。分布式分区视图性能的最重要方面是尽量减少成员服务器之间传输的数据量。

SQL Server 生成智能的动态计划,以便有效地利用分布式查询访问远程成员表中的数据:

  • 查询处理器首先使用 OLE DB 从每个成员表中检索 CHECK 约束定义。这样,查询处理器就可以在各成员表之间映射键值的分布。

  • 查询处理器将 SQL 语句 WHERE 子句中指定的键范围与显示行在成员表中如何分布的映射进行比较。然后查询处理器生成查询执行计划,该计划使用分布式查询只检索那些完成 SQL 语句所需的远程行。也可以采用这种方式生成执行计划:任何对远程成员表数据或元数据的访问,都被延迟到需要这些信息时。

例如,有这样一个系统:其中的客户表在 Server1CustomerID 从 1 到 3299999)、Server2CustomerID 从 3300000 到 6599999)和 Server3CustomerID 从 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 生成了具有条件逻辑(称为动态筛选)的执行计划,可基于输入参数值来控制访问哪个成员表。假设在 Server1 上执行了 GetCustomer 存储过程,则执行计划逻辑可以表示如下:

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 也生成这些类型的动态执行计划。优化器可以参数化查询以便可以重新使用执行计划。如果优化器参数化引用了分区视图的查询,则优化器不再假设所需行将来自指定的基表。它将必须在执行计划中使用动态筛选。有关详细信息,请参阅简单参数化