仅使用第一列的多列索引

时间:2019-07-01 18:42:04

标签: oracle indexing

如果我的表具有多列索引(OrderId,OrderType),而where子句正在使用索引的第一列,那么该索引有用吗?

索引的效率是否比有索引(OrderId)的效率稍低(也许行数很大)?

我的理解是,即使我没有在select或在where中使用返回第二列,多列索引在使用第一列的where准则时也很有用。但是,我在Oracle方面的经验少于其他数据库引擎,并且有人告诉我除非我在查询中同时引用了两列,否则不使用多列索引。此外,计划分析器建议在已有索引(OrderId,OrderType)的情况下,在OrderId上创建单列索引。因此,感觉像创建一个单列索引(OrderId)是多余的。

不希望分析我的查询。只是试图确定我是否误解了Oracle多列索引的一些基本知识。

要求另一种方式:

如果我已经有了索引(OrderId,OrderType),那么是否还会有一个同时创建索引(OrderId)的情况呢?

select OrderId, Amount
from Orders
where OrderDate > i_startSearchDate and OrderDate < i_endSearchDate
and OrderId in (
   select OrderFk from Items where ItemType = 1
);

1 个答案:

答案 0 :(得分:3)

Oracle当然可以在此查询中使用OrderID, OrderType上的索引。优化器是否期望使用该索引或进行表扫描(或使用其他索引)会更有效,这取决于诸如期望返回的OrderID值数量之类的事情。 IN列表中的值以及表中所代表的行的分数。当有更多的列时,扫描索引需要更多的I / O的事实也将是优化器考虑的一个因素,但这并不是一个很大的因素。如果优化程序是正确的,则复合索引将比表扫描慢,而表扫描将比仅OrderID上的索引慢,那么这三个访问计划可能都需要非常相似的数量时间。