Oracle: индекс организованной таблицы с нулевыми значениями - PullRequest
2 голосов
/ 08 сентября 2011

У меня есть таблица, которая в основном представляет собой древовидную структуру со столбцами parent_id и id.

parent_id - это null для корневых узлов.

Существует также самоссылочный внешний ключ, так что каждому parent_id соответствует id.

* 1012.* Эта таблица в основном доступна только для чтения, в основном с пакетными обновлениями.

Один из самых распространенных запросов приложения, которое обращается к этой таблице, - select ... where parent_id = X.Я думал, что это могло бы быть быстрее, если бы эта таблица была индексирована по parent_id.

Однако я не уверен, как индексировать эту таблицу, если parent_id может быть null.Я бы предпочел не выдумывать, чтобы parent_id=0 был каким-то особым идентификатором, поскольку мне нужно было бы добавить фиктивные значения в таблицу, чтобы обеспечить соблюдение ограничений внешнего ключа, а также изменить логику приложения.

Есть ли способ индексации таблицы по возможным null столбцам значений?

Ответы [ 2 ]

1 голос
/ 08 сентября 2011

Решение от вопроса:

Я обнаружил, что могу получить те же преимущества от организации индекса, просто добавив запрошенные столбцы в конец индекса parent_id, то есть вместо:

create index foo_idx on foo_tab(parent_id);

Я делаю:

create index foo_idx on foo_tab(parent_id, col1, col2, col3);

Где col1, col2, col3 и т. Д. Часто используемые столбцы.

У меня есть толькосделать это с помощью индексов, которые используются для возврата нескольких строк, которые получают выгоду от упорядочения и, следовательно, локальности диска, обеспечиваемой индексом, вместо того, чтобы перемещаться по таблице.Индексы, которые обычно используются для возврата отдельных строк, которые я оставил для ссылки на таблицу, так как в любом случае есть только одна строка для чтения, так что локальность имеет гораздо меньшее значение.

Как я уже говорил, это в основном таблица для чтения,а также пространство не является большой проблемой, поэтому я не думаю, что чрезмерные затраты на записи, вызванные этими индексами, являются большой проблемой.

(я понимаю, что это не будет индексировать null parent_id с, но вместо этого я сделал еще один индекс для decode(parent_id, null, 1, null), который индексирует нули и только нули).

0 голосов
/ 08 сентября 2011

Я бы попытался добавить индекс для одного столбца parent_id.

Если все столбцы в вашем индексе не равны NULL, то эта строка не отображается в вашем индексе.

Так что для parent_id = X, который вы цитируете выше, следует использовать индекс. Однако, если вы делаете parent_id is null, тогда он не будет использовать индекс, и вы получите ту же производительность, что и сейчас. Это звучит как поведение, которое подойдет вам.

В прошлом я использовал это для повышения производительности запросов. Особенно хорошо это работает, если количество элементов в индексе мало по сравнению с количеством строк в базе данных. У нас было около 3% наших строк в этом конкретном индексе, и он вылетел: -)

Но, как всегда, вам нужно попробовать и измерить разницу в производительности. Ваш пробег может отличаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...