Оракул силы перегородки в состоянии

У меня есть таблица с разделами списка по двум столбцам в порядке MY_ID (целое число со значениями 1,2,3,5,8...1100), RUN_DATE (последние несколько дней).

Мой запрос

select * from my_partitioned_table 
where run_date = '10-sep-2014' 
and my_id in (select my_id from mapping_table where category = 1)
;

Это происходит для полного сканирования таблицы, с последующим объяснением плана.

PX RECEIVE      115K    4M  600     1,01    PCWP            
PX SEND BROADCAST   :TQ10000    115K    4M  600     1,00    P->P    BROADCAST       
PX BLOCK ITERATOR       115K    4M  600     1,00    PCWC            
TABLE ACCESS FULL   MAPPING_TABLE   115K    4M  600     1,00    PCWP    
PX BLOCK ITERATOR       1G  412G    34849   1,01    PCWC        1   16
TABLE ACCESS FULL   MY_PARTITIONED_TABLE    1G  412G    34849   1,01    PCWP        KEY     KEY 

Как я могу заставить его получить доступ только к определенным разделам, а не для полного сканирования таблицы?

Извините, я немного новичок в Oracle и не смог найти конкретный вопрос раньше.

1 ответ

Этот план запроса указывает, что он идет после одного (или нескольких) разделов my_partitioned_table, Так что обрезка разделов уже происходит.

Вы обрезали заголовки столбцов, когда публиковали свой план объяснения (было бы также полезно получить версию с фиксированной шириной). Но последние два столбца почти наверняка являются начальным и конечным разделами. Когда ты видишь KEY для начального или конечного раздела это означает, что Oracle определяет набор разделов, которые ему фактически необходимо сканировать во время выполнения. В этом случае необходимо определить набор my_id значения, которые ваш подзапрос возвратит, прежде чем он сможет определить, какие разделы из вашей таблицы должны быть доступны. TABLE ACCESS FULL бит просто указывает, что он собирается сделать полное сканирование раздела (ов), к которому ему нужно получить доступ.

Другие вопросы по тегам