为了利用索引列上的 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> |
![]() |
使用DocCommentXchange 讨论此页。
|
版权 © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |