Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка в SQL из партиции по параметру / 5 сообщений из 5, страница 1 из 1
11.12.2017, 10:14
    #39567516
stells2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка в SQL из партиции по параметру
Добрый день.
Есть табличка, которая секционирована динамически с интервалом в год
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
....
PARTITION BY RANGE (RECTIME) 
INTERVAL (INTERVAL'1'YEAR)
(
  PARTITION PT0 VALUES LESS THAN (TO_DATE(' 2009-01-01 00:00:00','SYYYY-MM-DD HH24:MI:SS','NLS_CALENDAR=GREGORIAN')),
  PARTITION VALUES LESS THAN (TO_DATE(' 2010-01-01 00:00:00','SYYYY-MM-DD HH24:MI:SS','NLS_CALENDAR=GREGORIAN')),
  PARTITION VALUES LESS THAN (TO_DATE(' 2011-01-01 00:00:00','SYYYY-MM-DD HH24:MI:SS','NLS_CALENDAR=GREGORIAN')),
  PARTITION VALUES LESS THAN (TO_DATE(' 2012-01-01 00:00:00','SYYYY-MM-DD HH24:MI:SS','NLS_CALENDAR=GREGORIAN')),
  PARTITION VALUES LESS THAN (TO_DATE(' 2013-01-01 00:00:00','SYYYY-MM-DD HH24:MI:SS','NLS_CALENDAR=GREGORIAN')),
  PARTITION VALUES LESS THAN (TO_DATE(' 2014-01-01 00:00:00','SYYYY-MM-DD HH24:MI:SS','NLS_CALENDAR=GREGORIAN')),
  PARTITION VALUES LESS THAN (TO_DATE(' 2015-01-01 00:00:00','SYYYY-MM-DD HH24:MI:SS','NLS_CALENDAR=GREGORIAN')),
  PARTITION VALUES LESS THAN (TO_DATE(' 2016-01-01 00:00:00','SYYYY-MM-DD HH24:MI:SS','NLS_CALENDAR=GREGORIAN')),
  PARTITION VALUES LESS THAN (TO_DATE(' 2017-01-01 00:00:00','SYYYY-MM-DD HH24:MI:SS','NLS_CALENDAR=GREGORIAN')),
  PARTITION VALUES LESS THAN (TO_DATE(' 2018-01-01 00:00:00','SYYYY-MM-DD HH24:MI:SS','NLS_CALENDAR=GREGORIAN'))
);



соответственно, названия партиций автоматически создаются
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
PT0	0	TO_DATE(' 2009-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
SYS_P61	0	TO_DATE(' 2010-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
SYS_P62	0	TO_DATE(' 2011-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
SYS_P63	0	TO_DATE(' 2012-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
SYS_P64	0	TO_DATE(' 2013-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
SYS_P65	0	TO_DATE(' 2014-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
SYS_P66	0	TO_DATE(' 2015-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
SYS_P67	0	TO_DATE(' 2016-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
SYS_P68	0	TO_DATE(' 2017-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
SYS_P69	0	TO_DATE(' 2018-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')



Предполагалось, что будет вьюшка, которая бы возвращала данные за текущий год, т.к. тягать 10 млн. записей за все года не резон.
Следовательно, что-то типа такого:
Код: plsql
1.
SELECT * FROM TABLE partition for (TRUNC(SYSDATE,'YY')



Однако, динамический параметр наотрез не хочет работать - выпадает ошибка
"ORA-14108: Неверный синтаксис имени секционированной таблицы"
А статичный, типа
SELECT * FROM TABLE partition for (TO_DATE('01-01-2017','DD-MM-YYYY'))
работает на ура.
В общем, как я понял, это не баг а фича, и действительно в отличие от WHERE, сюда надо передавать статический параметр. Все здорово.
Но как все же решить основное назначение для меня секционирования - возвращать данные за нужный период. Вариант переписывания вьюшек каждый год - бред.
Пользоваться только функциями??
Что можно сделать в этом случае?
...
Рейтинг: 0 / 0
11.12.2017, 10:31
    #39567524
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка в SQL из партиции по параметру
partition for суть partition_extension_clause, см. синтаксические диаграммы.
Видите там слово expression в параметрах? Нет? Это и есть ответ на вопрос о "динамике".

Но Ваша основная ошибка иной природы.
partitioning - это способ физической организации данных.
НЕ логической.
Потому view следует сформулировать так:
Код: plsql
1.
2.
SELECT * FROM TABLE 
where rectime >= TRUNC(SYSDATE,'YY')


С одной стороны, это включит механизмы partition pruning, с другой - результат не будет зависеть от административных действий с разделами (split/merge)
...
Рейтинг: 0 / 0
11.12.2017, 12:06
    #39567587
stells2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка в SQL из партиции по параметру
andrey_anonymous,
Сейчас так и реализовано, просто я не был уверен, что при таком запросе будет реализован смысл партиций.
...
Рейтинг: 0 / 0
11.12.2017, 16:24
    #39567791
Bobby Z.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка в SQL из партиции по параметру
stells2Сейчас так и реализовано, просто я не был уверен, что при таком запросе будет реализован смысл партиций.А в чём, по-вашему, заключается смысл партиций?
...
Рейтинг: 0 / 0
12.12.2017, 06:18
    #39568056
stells2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка в SQL из партиции по параметру
Bobby Z.,
организованное на физическом уровне разделенное по группам хранение данных.
Просто, считал что движку явно надо как то указывать откуда брать и куда смотреть, что бы выгоду от такой организации хранения получить, все же, такая организация имеет дополнительные накладные расходы.

По планам запросов вижу что берет из последней партиции. Если он такой умный, то хорошо :)
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка в SQL из партиции по параметру / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]