powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / select max партиционнированного поля - из таблицы и из view. из view - очень медленно
16 сообщений из 16, страница 1 из 1
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
    #39929185
bhr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bhr
Гость
есть таблица sales партиционнированная по полю sale_date
во многих местах программ используется такой (или поожий) select

Код: plsql
1.
2.
3.
select max(sale_date) 
          into a_dt 
          from sales


в какойто момент понадобилось убрать текстовые поля из sales.
заменив таблицу представлением.
Создана таблица sales_2
и представление:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or replace view sales as
select бла
         бла
         бла
  from sales_2 s
  left join agent a
    on (s.agent_id = a.agent_id)
  left join product   g
    on (s.product_id = g.product_id)


sales_2 - также партиционирована по sale_date
так вот весь программный код, работавший секунды, при выборке
select max(sale_date)
теперь работает очень долгое время.
причем вьюха сама по себе не причем
select from select - если во внутреннем селекте есть джоин, а в наружнем ограничение на партиционированное поле - работает медленно. никаким хинтом не удалось это исправить.
Буду благодарен любому совету.
...
Рейтинг: 0 / 0
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
    #39929191
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bhr,

А чего еще ты ожидал? Была одна таблица. Из нее дергали max(sale_date). Oracle лезв индекс и быстро выдавал результат. Тепеь ты дергаешь max(sale_date) из view которое вначале джойнит а только потом ищет max(sale_date) среди результата джойнаа, т.е. сортирует a не через индекс. Конечно в принципе optimizer мог бы сообразить что ищем max(sale_date) таблицы которая в left outer join слева и поx...рить left outer join. Но ведь у программиста тоже должна быть соображалка. Делай selec max(sale_date) from sales_2.

SY.
...
Рейтинг: 0 / 0
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
    #39929193
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
optimizer мог бы сообразить
он сообразил, что джоины могут отфильтровать строки.
...
Рейтинг: 0 / 0
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
    #39929194
flexgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bhr,

Странно прицепить к таблице еще две и ожидать что поведение запроса не изменится.

План выполнения запроса из view что показывает?
Есть ли индексы по полям agent_id и product_id в таблице sales_2?
Есть ли индексы в таблице agent по полю agent_id?
Есть ли индексы в таблице product по полю product_id?
...
Рейтинг: 0 / 0
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
    #39929201
bhr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bhr
Гость
-2-
SY
optimizer мог бы сообразить
он сообразил, что джоины могут отфильтровать строки.

дык... лефт джоин ведь не отфильтрует строки.
индексов нет ни в одной таблице
sales - огромная таблица
две другие - по тыще строк имеют
проверяю вашу версию:
Код: plsql
1.
2.
3.
4.
5.
6.
select max(sale_date)
  from sales_2 s
  left join agent a
    on (s.agent_id = a.agent_id)
  left join product   g
    on (s.product_id = g.product_id)


тоже тормозит
то есть попытки хинтом inline помочь ораклу заведомо провальны
очень хочется получить в плане выполнения:
PARTITION RANGE ALL MIN/MAX
...
Рейтинг: 0 / 0
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
    #39929202
bhr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bhr
Гость
flexgen
bhr,

Странно прицепить к таблице еще две и ожидать что поведение запроса не изменится.

План выполнения запроса из view что показывает?
Есть ли индексы по полям agent_id и product_id в таблице sales_2?
Есть ли индексы в таблице agent по полю agent_id?
Есть ли индексы в таблице product по полю product_id?

в первом случае
план выполнения показывает
partition range all min/max
во втором случае
partition range all
...
Рейтинг: 0 / 0
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
    #39929204
bhr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bhr
Гость
похоже, тупик...
все запросы с предикатом
sale_date > t1
работают норм.
а вот max - полная засада.
и неизвестно в скольких местах и кем такие max - используются....
делать вычисляемое поле тоже не фонтан.
должно быть какое-то простое решение. Задачка-то на вид стандартная.
...
Рейтинг: 0 / 0
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
    #39929236
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
bhr,

Отфильтровать не могут, но могут размножить. Сделайте внешние ключи и тогда должен сработать join elimination. А вообще лучше сразу приводите трассу 10053 при таких вопросах
...
Рейтинг: 0 / 0
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
    #39929240
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
bhr,

простой пример:
DDL
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create table agent (agent_id int primary key, blabla varchar2(100));
create table product (product_id int primary key, blabla varchar2(100));

create table sales_2 (sale_date date, agent_id int, product_id int, blabla varchar2(100))
  partition by range(sale_date)
  interval (numtoyminterval(1,'MONTH'))
  (
   partition part_01 values less than (date'2000-01-01')
  );
create index sales_2_dt on sales_2(sale_date) local;

create or replace view sales as
select s.blabla, s.sale_date
  from sales_2 s
  left join agent a
    on (s.agent_id = a.agent_id)
  left join product   g
    on (s.product_id = g.product_id)
/
explain plan for select max(sale_date) from sales;
select * from table(dbms_xplan.display('','','+outline'));


план
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
Plan hash value: 171128069

----------------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name       | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |            |     1 |     9 |     1   (0)| 00:00:01 |       |       |
|   1 |  PARTITION RANGE ALL MIN/MAX|            |     1 |     9 |            |          |1048575|     1 |
|   2 |   SORT AGGREGATE            |            |     1 |     9 |            |          |       |       |
|   3 |    INDEX FULL SCAN (MIN/MAX)| SALES_2_DT |     1 |     9 |     1   (0)| 00:00:01 |1048575|     1 |
----------------------------------------------------------------------------------------------------------

Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
      INDEX(@"SEL$96CBDA52" "S"@"SEL$2" ("SALES_2"."SALE_DATE"))
      OUTLINE(@"SEL$3")
      OUTLINE(@"SEL$2")
      ANSI_REARCH(@"SEL$3")
      OUTLINE(@"SEL$F52A8B21")
      ANSI_REARCH(@"SEL$2")
      OUTLINE(@"SEL$1A566D0B")
      ANSI_REARCH(@"SEL$F52A8B21")
      OUTLINE(@"SEL$791DB105")
      OUTLINE(@"SEL$4")
      MERGE(@"SEL$1A566D0B" >"SEL$791DB105")
      OUTLINE(@"SEL$1BEB249F")
      ANSI_REARCH(@"SEL$4")
      OUTLINE(@"SEL$D2E4DCB5")
      MERGE(@"SEL$1BEB249F" >"SEL$D2E4DCB5")
      OUTLINE(@"SEL$49DCB01B")
      OUTLINE(@"SEL$1")
      MERGE(@"SEL$49DCB01B" >"SEL$1")
      OUTLINE(@"SEL$F79F3764")
      ELIMINATE_JOIN(@"SEL$F79F3764" "G"@"SEL$3")
      ELIMINATE_JOIN(@"SEL$F79F3764" "A"@"SEL$2")
      OUTLINE_LEAF(@"SEL$96CBDA52")
      ALL_ROWS
      DB_VERSION('18.1.0')
      OPTIMIZER_FEATURES_ENABLE('18.1.0')
      IGNORE_OPTIM_EMBEDDED_HINTS
      END_OUTLINE_DATA
  */

...
Рейтинг: 0 / 0
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
    #39929241
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
bhr
то есть попытки хинтом inline помочь ораклу заведомо провальны
причем тут хинт inline? У вас есть WITH (subquery factoring clause)?
...
Рейтинг: 0 / 0
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
    #39929249
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
bhr,

Отфильтровать не могут, но могут размножить.


Что не изменит значение max(sale_date).

SY.
...
Рейтинг: 0 / 0
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
    #39929252
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SY
Что не изменит значение max(sale_date).
это не важно. Уникальность не выполняется - Join elimination не будет выполнен. И при проверке условий для JE, не анализуются проекции по другим таблицам.
...
Рейтинг: 0 / 0
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
    #39929253
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
Уникальность не выполняется - Join elimination не будет выполнен.


A мог бы для GROUP BY с уникальность независимыми агрегациями min/max, count(distinct), ...

SY.
...
Рейтинг: 0 / 0
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
    #39929255
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SY,

С этим помогает только group-by placement. Дело в том, что трансформации работают по кусочкам, по query block за раз. Соответственно, на этапе JE он тупо может не знать, что с этим qb будет происходить далее, есть ли дальше group-by. Конечно, по идее, если бы gby-placement отработал раньше и создал инлайн вью с группировкой, и только потом запустил бы JE, тогда бы он сработал и лишние джойн исчезли. Но это сложно слишком ради мизерного процента таких запросов.
...
Рейтинг: 0 / 0
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
    #39929256
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
И в любом случае, group-by placement тоже требует уникальности. Размножение или фильтрация строк его блокирует.
...
Рейтинг: 0 / 0
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
    #39929345
bhr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bhr
Гость
xtender
bhr,

простой пример:
DDL
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create table agent (agent_id int primary key, blabla varchar2(100));
create table product (product_id int primary key, blabla varchar2(100));

create table sales_2 (sale_date date, agent_id int, product_id int, blabla varchar2(100))
  partition by range(sale_date)
  interval (numtoyminterval(1,'MONTH'))
  (
   partition part_01 values less than (date'2000-01-01')
  );
create index sales_2_dt on sales_2(sale_date) local;

create or replace view sales as
select s.blabla, s.sale_date
  from sales_2 s
  left join agent a
    on (s.agent_id = a.agent_id)
  left join product   g
    on (s.product_id = g.product_id)
/
explain plan for select max(sale_date) from sales;
select * from table(dbms_xplan.display('','','+outline'));


план
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
Plan hash value: 171128069

----------------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name       | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |            |     1 |     9 |     1   (0)| 00:00:01 |       |       |
|   1 |  PARTITION RANGE ALL MIN/MAX|            |     1 |     9 |            |          |1048575|     1 |
|   2 |   SORT AGGREGATE            |            |     1 |     9 |            |          |       |       |
|   3 |    INDEX FULL SCAN (MIN/MAX)| SALES_2_DT |     1 |     9 |     1   (0)| 00:00:01 |1048575|     1 |
----------------------------------------------------------------------------------------------------------

Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
      INDEX(@"SEL$96CBDA52" "S"@"SEL$2" ("SALES_2"."SALE_DATE"))
      OUTLINE(@"SEL$3")
      OUTLINE(@"SEL$2")
      ANSI_REARCH(@"SEL$3")
      OUTLINE(@"SEL$F52A8B21")
      ANSI_REARCH(@"SEL$2")
      OUTLINE(@"SEL$1A566D0B")
      ANSI_REARCH(@"SEL$F52A8B21")
      OUTLINE(@"SEL$791DB105")
      OUTLINE(@"SEL$4")
      MERGE(@"SEL$1A566D0B" >"SEL$791DB105")
      OUTLINE(@"SEL$1BEB249F")
      ANSI_REARCH(@"SEL$4")
      OUTLINE(@"SEL$D2E4DCB5")
      MERGE(@"SEL$1BEB249F" >"SEL$D2E4DCB5")
      OUTLINE(@"SEL$49DCB01B")
      OUTLINE(@"SEL$1")
      MERGE(@"SEL$49DCB01B" >"SEL$1")
      OUTLINE(@"SEL$F79F3764")
      ELIMINATE_JOIN(@"SEL$F79F3764" "G"@"SEL$3")
      ELIMINATE_JOIN(@"SEL$F79F3764" "A"@"SEL$2")
      OUTLINE_LEAF(@"SEL$96CBDA52")
      ALL_ROWS
      DB_VERSION('18.1.0')
      OPTIMIZER_FEATURES_ENABLE('18.1.0')
      IGNORE_OPTIM_EMBEDDED_HINTS
      END_OUTLINE_DATA
  */



ЙЕЕЕССС... огромное спасибо....
форум очень полезная штука
создал primary key по справочникам. индекс не создавал. все залетало.
Это просто праздник какой-то.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / select max партиционнированного поля - из таблицы и из view. из view - очень медленно
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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