Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Partitioned table и использование функций в запросе / 10 сообщений из 10, страница 1 из 1
02.04.2019, 14:42
    #39795194
Sergalin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Partitioned table и использование функций в запросе
Добрый день!

Хочу разбить таблицу 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
02.04.2019, 14:46
    #39795199
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Partitioned table и использование функций в запросе
Если есть уверенность, что p_type всегда в верхнем регистре, можно добавить ограничение CHECK (P_TYPE=UPPER(P_TYPE))
Скорее всего, тогда и partition pruning отработает
...
Рейтинг: 0 / 0
02.04.2019, 14:56
    #39795206
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Partitioned table и использование функций в запросе
Вячеслав ЛюбомудровСкорее всего, тогда и partition pruning отработает
Эт врядли... (с)
...
Рейтинг: 0 / 0
02.04.2019, 15:00
    #39795211
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Partitioned table и использование функций в запросе
Код: 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
02.04.2019, 15:03
    #39795216
Да ну
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Partitioned table и использование функций в запросе
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
02.04.2019, 15:40
    #39795249
Sergalin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Partitioned table и использование функций в запросе
Вячеслав ЛюбомудровЕсли есть уверенность, что p_type всегда в верхнем регистре, можно добавить ограничение CHECK (P_TYPE=UPPER(P_TYPE))
Скорее всего, тогда и partition pruning отработает

В таблице p_type находится и в верхнем и нижнем регистре. Запрос конечно от разработчика странный, но приходится с ним жить
...
Рейтинг: 0 / 0
02.04.2019, 16:16
    #39795293
Sergalin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Partitioned table и использование функций в запросе
Спасибо!
Отлично работает с виртуальной колонкой
...
Рейтинг: 0 / 0
02.04.2019, 21:53
    #39795437
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Partitioned table и использование функций в запросе
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
03.04.2019, 08:50
    #39795520
Sergalin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Partitioned table и использование функций в запросе
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
03.04.2019, 10:16
    #39795604
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Partitioned table и использование функций в запросе
andrey_anonymousВячеслав ЛюбомудровСкорее всего, тогда и partition pruning отработает
Эт врядли... (с)Да, к сожалению, не срабатывает
Была надежда, что будет что-то подобное transitive closure (правда на первых порах оптимизатор сувал его куда не попадя и бывало, что ухудшал запрос)
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Partitioned table и использование функций в запросе / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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