Оракул силы перегородки в состоянии
У меня есть таблица с разделами списка по двум столбцам в порядке 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
бит просто указывает, что он собирается сделать полное сканирование раздела (ов), к которому ему нужно получить доступ.