2016-07-25 3 views
0

Я хотел бы запросить таблицу с миллионом записей для клиентов с именем «FooBar», которые имеют записи, датированные 7-24-2016 годами. В таблице содержится 10 дней данных.В Oracle SQL я могу запросить раздел таблицы вместо целой таблицы, чтобы заставить ее работать быстрее?

select * 
from table 
where customer = 'FooBar' 
and insert_date between to_date('2016-07-24 00:00:00', 'YYYY-MM-DD HH24:MI:SS') and to_date('2016-07-24 23:59:59', 'YYYY-MM-DD HH24:MI:SS'); 

Проблема с запросом выше заключается в том, что требуется некоторое время для запуска. Я бы хотел, чтобы он работал быстрее.

Стол разделен на 24 часа. Могу ли я сфокусировать запрос на табличных разделах? Это сделает запрос быстрее?

select * 
from partition-7-24-2016 
where customer = 'FooBar'; 
+3

Oracle должен выбирать правильные разделы для запроса. –

+0

Что такое план запроса? Является ли Oracle фактически обрезкой разделов автоматически? Есть ли локальный индекс на 'customer'? Если в таблице содержится всего 10 дней данных, разделение разделов по-прежнему потребует полного сканирования раздела, в котором 10% данных в таблице, что, по-видимому, много. Предполагая, что «клиент» является достаточно избирательным, индекс «клиент» будет гораздо большим преимуществом, чем разделение. –

ответ

1

Правильный синтаксис: select [columns] from [table] partition ([partition]). Так, в этом USECASE, вы бы что-то вроде этого:

SELECT * 
FROM mytable PARTITION (partition_7_24_2016) 
WHERE customer = 'FooBar'; 
+3

Во-первых, я уверен, что вам нужно будет окружать имя раздела скобкой (на данный момент я не имею секционированную таблицу). Хотя вы можете использовать этот синтаксис, вы почти никогда не должны использовать этот синтаксис. Если таблица разделена на столбец 'date' (который, по-видимому, фактически не назван в честь зарезервированного слова), то обрезка разделов должна автоматически выбирать нужные вам разделы (разделы). Это будет иметь гораздо больше смысла, чем использование динамического SQL, чтобы добавить имя раздела в запрос. –

+0

Этот запрос работал для меня. Я сделал три отдельных теста на трех отдельных разделах. Сравнивая мой первоначальный запрос выше без разделов, этот запрос выполнялся между 8x и 24x быстрее. Тест 1: 28 секунд исходного запроса, запрос на 3 сек. Раздела. Тест 2: исходный запрос 49 секунд, запрос на 2 секунды раздела. Тест 3: исходный запрос 79 секунд, запрос на разделение 9 секунд. –

1

Вы можете сделать это следующим образом:

select * from table PARTITION FOR (date '2016-07-24') where customer = 'FooBar' 
and insert_date between to_date('2016-07-24 00:00:00', 'YYYY-MM-DD HH24:MI:SS') and to_date('2016-07-24 23:59:59', 'YYYY-MM-DD HH24:MI:SS'); 

Это будет выглядеть только для строк в разделе, где ваша дата попадает - date '2016-07-24' в этом примере.

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

+0

В запросе выше я удалил лишние «и» и запустил его. Когда я это сделал, я получил ошибку. ORA-00905: отсутствует ключевое слово. –

+1

работает на 12c, возможно, вы используете более старую версию – Palcente

Смежные вопросы