Сокращение раздела Oracle с помощью переменных связывания - PullRequest
4 голосов
/ 19 июля 2010

У меня есть большая (150 м + строка) таблица, которая разбивается на четверти с использованием ключа разделения DATE.

Когда я запрашиваю таблицу, используя что-то вроде ...

SELECT *
FROM   LARGE_TABLE
WHERE  THE_PARTITION_DATE >= TO_DATE('1/1/2009', 'DD/MM/YYYY')
AND    THE_PARTITION_DATE < TO_DATE('1/4/2009', 'DD/MM/YYYY');

... сокращение разделов работает корректно ... optomiser может понять, что ему нужно только взглянуть на один раздел (в данном случае первый квартал 2009 года).EXPLAIN PLAN показывает «SINGLE RANGE RANGE»

Однако, когда я перемещаю этот запрос в PL / SQL и передаю те же даты, что и переменные, план отображается как «RANGE PARTITION (ITERATOR)»optomiser не может понять, что ему нужно только смотреть на отдельную часть (вероятно, потому что у него нет фактических значений при оценке плана).

Единственный обходной путь, который я нашел до сих пор, этозакодировать EXECUTE IMMEDIATE, включая даты в строке SQL, чтобы корректно обрезать раздел.

Есть ли лучший способ?

1 Ответ

7 голосов
/ 19 июля 2010

Я не думаю, что вы должны увидеть реальную разницу в производительности с переменными связывания - вы должны увидеть шаг плана выполнения «PARTITION RANGE ITERATOR PARTITION: KEY KEY ...», что означает, что Oracle определит запуск и останов разделов во время исполнения.

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