Oracle中的子字符串索引

时间:2011-12-13 10:21:20

标签: sql performance oracle indexing

我刚刚发现,根据我们最常执行的SELECT查询,我们当前的数据库设计效率不高。 IBAN是根据国家特定格式的位置坐标。

由于我们主要在某些表中的IBAN列的精确子字符串上执行JOINWHERE,因此我的问题是将索引分配给列的子字符串

我们是否被迫向表中添加冗余和索引列? IE浏览器。添加列NATION_CODEIBAN_CINIT_CINIT_ABIIT_CABIT_ACCOUNT(其中IT_字段仅适用于以ITXX开头的帐户)每个具有适当的二级索引的是否有任何特殊类型的二级索引只能应用于列的子字符串?

第一个解决方案可能会使DB变得更复杂,因为IBAN帐户在整个DBMS中使用(显然,我没有完全控制设计)。

谢谢

[编辑]典型查询

SELECT * FROM DELEGATIONS WHERE SUBSTR(IBAN, 6, 5) IN (SELECT ABI FROM BANKS WHERE ANY_CONDITION)

将目标帐户所属的所有付款授权提取到与CONDITION匹配的任何银行。应该改为

SELECT * FROM DELEGATIONS WHERE SUBSTR(IBAN, 1, 2) = 'IT' AND SUBSTR(IBAN, 6, 5) IN (SELECT ABI FROM BANKS WHERE ANY_CONDITION)

确保BBAN确实以数字[6-11]

保存银行代码

2 个答案:

答案 0 :(得分:9)

您正在寻找function based index

create index ix_substring on TABLE (substr(COLUMN, 4, 9))

答案 1 :(得分:4)

如果您使用的是Oracle 11g,则可以查看使用virtual columns然后将其编入索引。这几乎与René的答案相同,但可能会在使用数据方面提供更多形式,以便只使用正确的字符。

虚拟列不会占用数据库中的任何额外空间,尽管您在该虚拟列上创建的任何索引都会。