powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка в SQL из партиции по параметру
5 сообщений из 5, страница 1 из 1
Выборка в SQL из партиции по параметру
    #39567516
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Есть табличка, которая секционирована динамически с интервалом в год
Код: 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
Выборка в SQL из партиции по параметру
    #39567524
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Выборка в SQL из партиции по параметру
    #39567587
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,
Сейчас так и реализовано, просто я не был уверен, что при таком запросе будет реализован смысл партиций.
...
Рейтинг: 0 / 0
Выборка в SQL из партиции по параметру
    #39567791
Bobby Z.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2Сейчас так и реализовано, просто я не был уверен, что при таком запросе будет реализован смысл партиций.А в чём, по-вашему, заключается смысл партиций?
...
Рейтинг: 0 / 0
Выборка в SQL из партиции по параметру
    #39568056
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobby Z.,
организованное на физическом уровне разделенное по группам хранение данных.
Просто, считал что движку явно надо как то указывать откуда брать и куда смотреть, что бы выгоду от такой организации хранения получить, все же, такая организация имеет дополнительные накладные расходы.

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


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