powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Partitioned table и использование функций в запросе
10 сообщений из 10, страница 1 из 1
Partitioned table и использование функций в запросе
    #39795194
Sergalin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Хочу разбить таблицу P_TABLE на партиции по колонке p_type.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE p_table
( p_name VARCHAR(32),
  p_type   VARCHAR(32)
)
PARTITION BY LIST(p_type) (
  PARTITION type1 VALUES ('type1'),
  PARTITION type2 VALUES ('type2')
);



Имеется запрос (формируется приложением, изменить нет возможности)
Код: plsql
1.
2.
3.
SELECT p_name
   FROM p_table
 WHERE UPPER(p_type) = UPPER ('type1');



При выполнении запроса сканируются все партиции (PARTITION LIST ALL). Если убрать функцию UPPER, то всё работает отлично (сканируется только одна партиция). Каким образом нужно выполнить разбиение таблицы, чтобы при таких запросах сканировалась, только соответствующая партиция? Или такой возможности нет?
...
Рейтинг: 0 / 0
Partitioned table и использование функций в запросе
    #39795199
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если есть уверенность, что p_type всегда в верхнем регистре, можно добавить ограничение CHECK (P_TYPE=UPPER(P_TYPE))
Скорее всего, тогда и partition pruning отработает
...
Рейтинг: 0 / 0
Partitioned table и использование функций в запросе
    #39795206
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровСкорее всего, тогда и partition pruning отработает
Эт врядли... (с)
...
Рейтинг: 0 / 0
Partitioned table и использование функций в запросе
    #39795211
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE dropme_t
( p_name VARCHAR(32),
  p_type   VARCHAR(32)
  , p_typeUp VARCHAR(32) as (upper(p_type))
)
PARTITION BY LIST(p_typeUp) (
  PARTITION type1 VALUES ('TYPE1'),
  PARTITION type2 VALUES ('TYPE2')
);
...
Рейтинг: 0 / 0
Partitioned table и использование функций в запросе
    #39795216
Да ну
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergalin,

Как вариант - через виртуальную колонку (11.1+)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE p_table
( p_name VARCHAR(32),
  p_type VARCHAR(32),
  p_type_upper AS (upper(p_type))
)
PARTITION BY LIST(p_type_upper) (
  PARTITION type1 VALUES ('TYPE1'),
  PARTITION type2 VALUES ('TYPE2')
)
...
Рейтинг: 0 / 0
Partitioned table и использование функций в запросе
    #39795249
Sergalin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав ЛюбомудровЕсли есть уверенность, что p_type всегда в верхнем регистре, можно добавить ограничение CHECK (P_TYPE=UPPER(P_TYPE))
Скорее всего, тогда и partition pruning отработает

В таблице p_type находится и в верхнем и нижнем регистре. Запрос конечно от разработчика странный, но приходится с ним жить
...
Рейтинг: 0 / 0
Partitioned table и использование функций в запросе
    #39795293
Sergalin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!
Отлично работает с виртуальной колонкой
...
Рейтинг: 0 / 0
Partitioned table и использование функций в запросе
    #39795437
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergalinВ таблице p_type находится и в верхнем и нижнем регистре.

Тогда ты чего-о недоговариваешь:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SQL> CREATE TABLE p_table
  2  ( p_name VARCHAR(32),
  3    p_type   VARCHAR(32)
  4  )
  5  PARTITION BY LIST(p_type) (
  6    PARTITION type1 VALUES ('type1'),
  7    PARTITION type2 VALUES ('type2')
  8  );

Table created.

SQL> INSERT INTO P_TABLE VALUES('A','TYPE1');
INSERT INTO P_TABLE VALUES('A','TYPE1')
            *
ERROR at line 1:
ORA-14400: inserted partition key does not map to any partition


SQL> 




Так-что у тебя или партиция с VALUES(DEFAULT) или для таблицы задан SET PARTITIONING AUTOMATIC.

SY.
...
Рейтинг: 0 / 0
Partitioned table и использование функций в запросе
    #39795520
Sergalin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,

Добрый день!
Да Вы правы немного не договорил )).

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE p_table
( p_name VARCHAR(32),
  p_type   VARCHAR(32)
)
PARTITION BY LIST(p_type) (
  PARTITION type1 VALUES ('type1'),
  PARTITION type2 VALUES ('type2'),
  PARTITION other_type VALUES (DEFAULT)
);



p_type может содержать строки вида: Type1, TyPe1, TYPE1 и т.д., но это один и тот же тип ))). Есть ещё партиция DEFAULT. Мною была приведена таблица в качестве примера, интересовал подход к реализации секционирования для моего случая.
...
Рейтинг: 0 / 0
Partitioned table и использование функций в запросе
    #39795604
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousВячеслав ЛюбомудровСкорее всего, тогда и partition pruning отработает
Эт врядли... (с)Да, к сожалению, не срабатывает
Была надежда, что будет что-то подобное transitive closure (правда на первых порах оптимизатор сувал его куда не попадя и бывало, что ухудшал запрос)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Partitioned table и использование функций в запросе
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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