索引问题PLSQL Oracle。在索引中使用子字符串

时间:2015-11-17 22:30:52

标签: sql oracle plsqldeveloper

我需要加入2个表并且不确定如何有效地使用索引

表1具有以下索引:nvl(Member_ID,'NA')

表2具有以下索引:Member_ID

我无法使用以下查询:

select * from table 1 A
join table 2 B on nvl(A.Member_ID,'NA') = B.Member_ID

因为Member_ID的格式在两个表中都不同。 表格A Member_ID可以在末尾留出空格,或者额外的字符,例如' 123 00'和' 123 01' 和表B Member_ID只有前3位数字。但前3个字符表示这是同一个成员

我无法join on substr(nvl(A.Member_ID,'NA'),0,3) = B.Member_ID,因为这会消除索引。我正在处理数百万条记录。有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

Oracle允许基于函数的索引。因此,您可以定义索引,例如:

create index idx_table1_mid3 on table1(coalesce(substr(member_id, 1, 3), 'NA'));

然后,假设table2.MemberId是一个字符串,Oracle可以利用索引。如果它不是字符串,则类型转换可能会阻止使用计算的索引。

注意:必须在索引中指定join条件:

on coalesce(substr(Member_Id, 1, 3), 'NA') = b.Member_Id