Предикаты доступа и фильтрации в плане выполнения Oracle

в чем разница между предикатами Access и Filter в плане выполнения Oracle? Если я правильно понимаю, " доступ "используется для определения того, какие блоки данных необходимо прочитать, а" фильтр " применяется после чтения блоков. Следовательно, фильтрация-это "зло".

в примере раздела сведений о предикатах плана выполнения ниже:

10 - access("DOMAIN_CODE"='BLCOLLSTS' AND "CURRENT_VERSION_IND"='Y')
     filter("CURRENT_VERSION_IND"='Y')

почему "CURRENT_VERSION_IND" повторяется в разделах доступа и фильтра?

соответствующее операция-сканирование диапазона индексов по индексу, который определяется в полях (DOMAIN_CODE, CODE_VALUE, CURRENT_VERSION_IND, DECODE_DISPLAY).

Я предполагаю, что, поскольку CURRENT_VERSION_IND не является вторым столбцом в индексе, Oracle не может использовать его на этапе доступа. Следовательно, он обращается к индексу по столбцу DOMAIN_CODE, извлекает все блоки, а затем фильтрует их по CURRENT_VERSION_IND. Я прав?

2 ответов


нет, предикаты доступа в этом примере указывают, что индекс пересекается обоими DOMAIN_CODE и CURRENT_VERSION_IND.

Я бы не беспокоился о предикате фильтра, который кажется избыточным - это, похоже, причуда плана объяснения, вероятно, что-то связанное с тем, что он должен делать своего рода пропуск-сканирование по индексу (он выполняет сканирование диапазона в первом столбце, затем пропуск сканирования по CODE_VALUE, поиск любого соответствия CURRENT_VERSION_INDs).

нужно ли изменить индекс или создать другой индекс-совсем другое дело.

кроме того, просто чтобы исправить небольшое недоразумение: блоки должны быть извлечены из индекса, прежде чем он сможет что-либо сделать, будь то выполнение шагов "доступ" или "фильтр". Если вы имеете в виду выборку блоков из таблицы, то также ответ Нет - вы сказали, что предикат фильтра "10" был в доступе к индексу, а не в доступе к таблице; и в любом случае, нет причин, по которым Oracle не может оценить фильтр на CURRENT_VERSION_IND по индексу-ему вообще не нужно обращаться к таблице, если только ему не нужны другие столбцы, не включенные в индекс.


Я считаю, что вы правы в своей оценке того, что делает Oracle, но неправильно говорить, что шаг фильтра (или любой другой выбор оптимизатора) всегда "зло". Не имеет смысла индексировать абсолютно все возможные комбинации столбцов, которые могут быть запрошены, поэтому часто требуется фильтрация.

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