教你轻松的掌握如何来解析分布式分区视图
Microsoft® SQL Server 2000™ 查询处理器已得到增强,优化了分布式分区视图的性能。分布式分区视图性能的最重要方面是使成员服务器之间传送的数据量减到最少。
SQL Server 2000 生成智能的动态计划,以便有效地利用分布式查询访问远程成员表中的数据:
◆查询处理器首先使用 OLE DB 从每个成员表中检索 CHECK 约束定义。这使查询处理器可以在各成员表间映射键值的分布。
◆查询处理器将 SQL 语句 WHERE 子句中指定的键范围与显示成员表中行的分布方式的映射进行比较。查询处理器然后生成查询执行计划,以使用分布式查询只检索那些完成 SQL 语句所需的远程行。还以这样一种方式生成执行计划,即任何对远程成员表中的数据或元数据的访问都一直被延迟到要求这些信息时。
例如,考察某个系统,该系统中的客户表在 Server1(CustomerID 从 1 到 3299999)、Server2(CustomerID 从 3300000 到 6599999)和 Server3(CustomerID 从 6600000 到 9999999)间进行分区。
考虑在 Server1 上执行的下列查询所生成的执行计划:
SELECT *FROM CompanyData.dbo.CustomersWHERE CustomerID BETWEEN 3200000 AND 3400000 |
该查询的执行计划从本地成员表中析取 CustomerID 键值从 3200000 到 3299999 的行,并发出分布式查询从 Server2 中检索键值从 3300000 到 3400000 的行。
SQL Server 2000 查询处理器还可以在查询执行计划中内置动态逻辑,以用于在必须生成计划时尚不知道键值的 SQL 语句。例如,考察下面的存储过程:
CREATE PROCEDURE GetCustomer @CustomerIDParameter INTASSELECT *FROM CompanyData.dbo.CustomersWHERE CustomerID = @CustomerIDParameter |
SQL Server 2000 无法预测每次执行过程时 @CustomerIDParameter 参数将提供什么键值。因为无法预测键值,所以查询处理器还无法预测必须访问哪个成员表。为了处理这种情况,SQL Server 生成了具有条件逻辑(称为动态筛选)的执行计划,可根据输入参数值控制要访问的成员表。假设在 Server1 上执行了 GetCustomer 存储过程,则执行计划逻辑可以表示为:
IF @CustomerIDParameter BETWEEN 1 and 3299999 Retrieve row from local table CustomerData.dbo.Customer_33ELSEIF @CustomerIDParameter BETWEEN 3300000 and 6599999 Retrieve row from linked table Server2.CustomerData.dbo.Customer_66ELSEIF @CustomerIDParameter BETWEEN 6600000 and 9999999 Retrieve row from linked table Server3.CustomerData.dbo.Customer_99 |
SQL Server 2000 有时甚至对没有参数化的查询生成这些类型的动态执行计划。优化程序可能将查询自动参数化,以便执行计划可再次使用。如果优化程序自动参数化引用分区视图的查询,则优化程序不再假定所需的行将来自指定的基表,并且必须使用执行计划中的动态筛选。
(责任编辑:卢兆林)