使用索引的连接的示例

查询计划中使用索引和约束可为优化器提供选项,这些选项可以大大缩短查询执行时间。

本主题显示与使用列过滤器的连接的示例中所示查询不同的查询计划的大纲,因为它是使用索引构建的。

图: 使用索引的查询计划

      for each row in the customer table do:
            read the row into C
      look up C.customer_num in index on orders.customer_num
      for each matching row in the orders index do:
            read the table row for O
            if O.paid_date is null then
                  look up O.order_num in index on items.order_num
                  for each matching row in the items index do:
                        read the row for I
                        construct output row and return to user
            end for 
         end if
      end for 
   end for 
将索引中的关键字进行排序,以便当数据库服务器找到第一个匹配条目时,可以使用相同的关键字读取任何其他行而无需进行进一步的搜索,因为这些行是位于物理的相邻位置上的。该查询计划只读取以下行:

与不使用索引的计划相比,该查询计划明显降低了成本。同理,一个逆相计划也是可行的,该计划是先读取 orders,然后根据索引在 customer 中查找行。

表中行的物理顺序也将影响索引使用的成本。若表的排序方式与索引相关,那么按索引顺序访问多个表行的开销就会下降。例如:如果 orders 表行是根据 customer 号进行物理排序的,那么对某个给定的 customer 的顺序进行多次检索要比表随机排序时的检索快得多。

在某些情况下,使用索引可能会产生附加费用。有关更多信息,请参阅索引查找开销