Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 查询处理 » 查询优化与执行 » 语义查询转换

 

优化 OR 和 IN 列表谓语

为了利用索引列上的 IN 谓语,优化程序支持一种特殊的优化。这种优化也同样适用于相同索引列上用 OR 连在一起的多个谓语,因为这两种查询在语义上是等效的。若要能够进行这种优化,IN 列表必须只包含常量或在查询块的一次执行中为常量的值(例如外部引用)。

当优化程序遇到限定的 IN 列表谓语,并且该 IN 列表谓语所具有的选择性足以考虑索引检索时,优化程序就会将该 IN 列表谓语转换为嵌套循环连接。以下示例将说明这种优化的工作原理。

假定有以下查询,它列出了两个销售代表的所有订单:

SELECT *
FROM SalesOrders
WHERE SalesRepresentative = 902 OR SalesRepresentative = 195;

该查询在语义上等效于:

SELECT *
FROM SalesOrders
WHERE SalesRepresentative IN (195, 902);

优化程序估计到该 IN 列表谓语的组合选择性足够低,以便保证索引检索。因此,优化程序会将该 IN 列表视为虚拟表,并基于 SalesRepresentative 属性将该虚拟表连接到 SalesOrders 表。虽然这种优化的实际效果是在访问计划中包含附加的连接,但查询的连接度不会提高,因此优化时间不会受到影响。

这种优化具有两项主要的优点。首先,可以将 IN 列表当作 sargable 谓语并利用它来进行索引检索。其次,优化程序可以将 IN 列表排序,以匹配索引的排序序列,从而使检索更为有效。

以上查询的访问计划的简单形式为:

SalesOrders<FK_SalesRepresentative_EmployeeID>
另请参见