我刚刚发现,根据我们执行最多的SELECT查询,我们当前的数据库设计有点效率低下。根据特定于国家的格式,IBANs是位置坐标。
由于我们在某些表中对IBAN列的精确子字符串执行JOINs和WHEREs,所以我的问题是为列的子字符串分配索引。
我们是否被迫向表中添加冗余和索引列?即。添加列NATION_CODE、IBAN_CIN、IT_CIN、IT_ABI、IT_CAB、IT_ACCOUNT (其中IT_字段仅用于从ITXX开始的帐户)每一列都有适当的二级索引或,是否有任何特殊类型的辅助索引只能应用于列的子字符串?
第一种解决方案可能会使DB变得更加复杂,因为IBAN帐户一直在使用DBMS (显然,我对设计没有完全的控制)。
谢谢
编辑典型查询
SELECT * FROM DELEGATIONS WHERE SUBSTR(IBAN, 6, 5) IN (SELECT ABI FROM BANKS WHERE ANY_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中。
发布于 2011-12-13 10:24:50
你在找基于功能的索引
create index ix_substring on TABLE (substr(COLUMN, 4, 9))发布于 2011-12-13 11:19:54
如果您使用的是Oracle11g,您可以考虑使用虚拟列,然后对它们进行索引。这与勒内的回答相当,但可能会在数据的使用方面提供更多的形式化,从而只使用正确的字符。
虚拟列不会占用数据库中的任何额外空间,尽管您在该虚拟列上创建的任何索引都会占用。
https://stackoverflow.com/questions/8487520
复制相似问题