我需要加入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
,因为这会消除索引。我正在处理数百万条记录。有办法解决这个问题吗?
答案 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