Подстрока-индексирование в Oracle
Я только что обнаружил, что наш текущий дизайн базы данных немного неэффективен в соответствии с SELECT
запросы мы выполняем самые. IBANs-это позиционные координаты, в соответствии с национальными форматами.
так как мы в основном выполняют JOIN
s и WHERE
s на точной подстроке столбцов IBAN в некоторых таблицах мой вопрос заключается в назначении индекса подстроке (- ам) столбца
вынуждены ли мы добавлять избыточные и индексированные столбцы в таблицу? То есть. добавлять колонки NATION_CODE
, IBAN_CIN
, IT_CIN
, IT_ABI
, IT_CAB
, IT_ACCOUNT
(где поля IT_ рассматриваются только для учетных записей, начиная с ITXX) каждый с соответствующей вторичной индексацией или существует ли какой-либо специальный вторичный индекс, который может применяться только к подстроке столбца?
первое решение может сделать БД более сложной, так как учетные записи IBAN используются по всей СУБД (и, очевидно, у меня нет полного контроля над дизайн.)
спасибо
[Edit] типичный запрос
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]
2 ответов
Если вы используете Oracle 11g, вы можете посмотреть на использование виртуальные столбцы и затем индексировать их. Это в значительной степени эквивалентно ответу Рене, но может обеспечить немного больше формальности вокруг использования данных, так что используются только правильные символы.
виртуальные столбцы не будут занимать дополнительное пространство в базе данных, хотя любой индекс, созданный в этом виртуальном столбце, будет.