Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / select max партиционнированного поля - из таблицы и из view. из view - очень медленно / 16 сообщений из 16, страница 1 из 1
20.02.2020, 21:40
    #39929185
bhr
bhr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
есть таблица 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
20.02.2020, 21:59
    #39929191
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
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
20.02.2020, 22:06
    #39929193
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
SY
optimizer мог бы сообразить
он сообразил, что джоины могут отфильтровать строки.
...
Рейтинг: 0 / 0
20.02.2020, 22:07
    #39929194
flexgen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
bhr,

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

План выполнения запроса из view что показывает?
Есть ли индексы по полям agent_id и product_id в таблице sales_2?
Есть ли индексы в таблице agent по полю agent_id?
Есть ли индексы в таблице product по полю product_id?
...
Рейтинг: 0 / 0
20.02.2020, 22:27
    #39929201
bhr
bhr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
-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
20.02.2020, 22:30
    #39929202
bhr
bhr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
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
20.02.2020, 22:46
    #39929204
bhr
bhr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
похоже, тупик...
все запросы с предикатом
sale_date > t1
работают норм.
а вот max - полная засада.
и неизвестно в скольких местах и кем такие max - используются....
делать вычисляемое поле тоже не фонтан.
должно быть какое-то простое решение. Задачка-то на вид стандартная.
...
Рейтинг: 0 / 0
21.02.2020, 00:35
    #39929236
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
bhr,

Отфильтровать не могут, но могут размножить. Сделайте внешние ключи и тогда должен сработать join elimination. А вообще лучше сразу приводите трассу 10053 при таких вопросах
...
Рейтинг: 0 / 0
21.02.2020, 01:20
    #39929240
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
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
21.02.2020, 01:23
    #39929241
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
bhr
то есть попытки хинтом inline помочь ораклу заведомо провальны
причем тут хинт inline? У вас есть WITH (subquery factoring clause)?
...
Рейтинг: 0 / 0
21.02.2020, 02:58
    #39929249
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
xtender
bhr,

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


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

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


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

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

С этим помогает только group-by placement. Дело в том, что трансформации работают по кусочкам, по query block за раз. Соответственно, на этапе JE он тупо может не знать, что с этим qb будет происходить далее, есть ли дальше group-by. Конечно, по идее, если бы gby-placement отработал раньше и создал инлайн вью с группировкой, и только потом запустил бы JE, тогда бы он сработал и лишние джойн исчезли. Но это сложно слишком ради мизерного процента таких запросов.
...
Рейтинг: 0 / 0
21.02.2020, 04:16
    #39929256
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
И в любом случае, group-by placement тоже требует уникальности. Размножение или фильтрация строк его блокирует.
...
Рейтинг: 0 / 0
21.02.2020, 11:09
    #39929345
bhr
bhr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select max партиционнированного поля - из таблицы и из view. из view - очень медленно
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / select max партиционнированного поля - из таблицы и из view. из view - очень медленно / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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