Oracle SQL:具有两列的单个索引与一列上的索引

Oracle SQL: Single Index with two Columns vs index on one Column

我正在使用 Oracle12c

我有一个带有主键和单独列的 table。

create tableB(
   ID number(10)
   ,data number(10)
);

ID 是我的主键。

我必须在我的查询中加入 3 个 table,性能问题是 B.data 没有索引。 B.data 包含 'null' 个值和相同数字的多个条目。

select A.examp from tabled D
   join tableb B on D.data = B.data
   join tablec C on B.ID = C.ID
   join tablea A on C.val = A.val 
   where D.ID = :value;

所以我的问题是像数据列这样只包含一个值的索引有什么区别

create index ind_tableb on tableb (data);

和一个包含多列的索引,如

create index ind_tableb on tableb (data, id); 

我可以通过以连接列的方式选择索引中的 id 和数据来获得改进吗?

感谢您的建议和帮助。

对于这个特定的查询,您需要两列索引版本:

create index ind_tableb on tableb (data, id);

如果使用上述索引,Oracle 可以快速查找 tabled.data 值以寻找与 tableb.data 值的潜在匹配项。如果找到匹配项,则相同的索引也将包含 tableb.ID 的下一个连接值 tablec。如果您仅在 tableb.data 上单独使用单列版本,那么 Oracle 将不得不返回 tableb table 来查找 ID 值。这可能会影响性能,甚至可能导致索引无法使用。