powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / дают ли разные аналитические функции разную производительность
24 сообщений из 24, страница 1 из 1
дают ли разные аналитические функции разную производительность
    #39318773
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oracle 11.2 EE
есть таблица, содержащая бухгалтерские полупроводки.
каждая строка содержит остаток перед проводкой C_START_SUM и сумму проводки C_SUMMA
задача: собрать итоги: оборот за день и остаток на конец дня по каждому счету.

текущее решение - наглядное (на каждом уровне запроса можно визуально выполнить отладку) - через row_number:

Код: 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.
--уровень 3 - вычисляем итого оборот за день / остаток на конец дня
          select account_id, 
          trunc(c_date) c_date, 
          sum(C_TURNOVER_DBT) C_TURNOVER_DBT, 
          sum(C_TURNOVER_DBT_LCL) C_TURNOVER_DBT_LCL,
          sum(C_TURNOVER_CRT) C_TURNOVER_CRT, 
          sum(C_TURNOVER_CRT_LCL) C_TURNOVER_CRT_LCL,
          sum(C_BALANCE) C_BALANCE, 
          sum(C_BALANCE_LCL) C_BALANCE_LCL
          from (
              select  r2.*,
              --уровень 2 - для последней строки вычисляем баланс
              --баланс считаем только для последней записи во избежание размножения при SUM() на уровне выше:
               case when rn = 1 then nvl(C_START_SUM,0) +     direction * nvl(C_SUMMA,0)     end as C_BALANCE,
               case when rn = 1 then nvl(C_START_SUM_NAT,0) + direction * nvl(C_SUMMA_NAT,0) end as C_BALANCE_LCL
                    from (
                    select /*+ full(r) full(r.t) full(r.t.DA) full(r.t.DC) PARALLEL(16) */
                           r.*
                           --уровень 1 - нумеруем строки
                          ,row_number() over (partition by r.account_id, trunc(r.c_date) order by r.c_date desc, r.id desc) as rn --последняя запись на ключе Счет+Опердень
                           case when C_DT = '1' then -1 else 1 end direction --множитель для остатка 
                    from recs r --полупроводки
                    where r.c_date >= date '2015-01-04' and r.c_date <date '2015-01-04' +1 
                    ) r2
              ) r3
          group by account_id,trunc(c_date)


понятно, что такое решение не единственное - как минимум напрашиваются:
а) max() keep dense_rank last over (partition by
б) Last_value() over (partition by


вопросы:

1) что можете предложить эффективнее (править таблицу-источник или предрассчитать что-то нельзя)

2) есть ли смысл выписывать варианты а и б для сравнения производительности, или производительность будет варьироваться в пределах погрешности измерения?
или так: дают ли разные аналитические функции реально разную производительность?

спасибо!
...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39318778
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12дают ли разные аналитические функции реально разную производительность?



Зависит от того есть ли сортировка в них, если сортировка одинакова то вообщем то разницы нет.
...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39318952
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12,
есть ли признак последней проводки по счету (ид,тм)?

......
stax
...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39319175
drema201
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ora601,

Насколько помню keep dense rank сделает сортировку для каждого выражения (c keep dense rank) в SELECTе,
вне зависимости таже эта сортировка или другая.
...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39319661
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..Alexus12,
есть ли признак последней проводки по счету (ид,тм)?

......
stax

нет, поэтому и идет ее вычисление в коде
...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39319761
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drema201ora601,

Насколько помню keep dense rank сделает сортировку для каждого выражения (c keep dense rank) в SELECTе,
вне зависимости таже эта сортировка или другая.

Если точнее то он делает сортирвку по выражению указанному в order by ... То же самое касаеться row_number , lead/lag , sum over() и т.д.
...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39319946
drema201
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ora601,

Да целиком и полностью согласен,
просто с "обычной" аналитикой зачастую проще обойтись одной сортировкой,
с keep dense rank иногда использовал трюк с max(rowid) keep dense ... , но это приводит к одноблочному чтению на соответствуещем шаге плана, что было довольно затратно.
...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39319978
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
drema201ora601,

Насколько помню keep dense rank сделает сортировку для каждого выражения (c keep dense rank) в SELECTе,
вне зависимости таже эта сортировка или другая.Примерчик можно? Желательно с планом и трассой 10032.
Мой примерчик в вложении
...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39320261
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые,
найдена информация по теме у Кайта:
https://asktom.oracle.com/pls/apex/f?p=100:11:0::NO::P11_QUESTION_ID:122801500346829407

цитирую конкретный вопрос-ответ:

 Performance of DENSE_RANK FIRST ORDER BY

July 29, 2008 - 5:50 pm UTC

Reviewer: A reader

  

Why is the SQL that uses "DENSE_RANK FIRST ORDER BY" so much faster than the one that uses row_number?

Код: 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.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
CREATE TABLE x (
  dept  NUMBER,
  name  VARCHAR2(20),
  sal   NUMBER
);

BEGIN
   FOR i IN 1..1000000 LOOP
      INSERT INTO x VALUES (
         MOD(i, 1000),
         dbms_random.string('A', 20),
         TRUNC(dbms_random.value(10000, 1000000))
      );
   END LOOP;

   COMMIT;
END;
/

set autotrace traceonly
set timing on

SELECT dept, name, sal
FROM   (
        SELECT dept, name, sal,
               row_number() OVER (PARTITION BY dept ORDER BY sal DESC) rn
        FROM   x
       )
WHERE  rn = 1;

1000 rows selected.

Elapsed: 00:00:06.04

Execution Plan
----------------------------------------------------------
Plan hash value: 4121446221

-----------------------------------------------------------------------------------------
| Id  | Operation                | Name | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |      |   989K|    48M|       | 10876   (1)| 00:02:11 |
|*  1 |  VIEW                    |      |   989K|    48M|       | 10876   (1)| 00:02:11 |
|*  2 |   WINDOW SORT PUSHED RANK|      |   989K|    35M|    90M| 10876   (1)| 00:02:11 |
|   3 |    TABLE ACCESS FULL     | X    |   989K|    35M|       |  1079   (2)| 00:00:13 |
-----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("RN"=1)
   2 - filter(ROW_NUMBER() OVER ( PARTITION BY "DEPT" ORDER BY
              INTERNAL_FUNCTION("SAL") DESC )<=1)

Note
-----
   - dynamic sampling used for this statement


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
       4850  consistent gets
          0  physical reads
          0  redo size
      40067  bytes sent via SQL*Net to client
       1111  bytes received via SQL*Net from client
         68  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
       1000  rows processed


SELECT dept, 
       MAX(name) KEEP (DENSE_RANK FIRST ORDER BY sal DESC) name,
       MAX(sal) sal
FROM   x
GROUP  BY dept;

1000 rows selected.

Elapsed: 00:00:01.09

Execution Plan
----------------------------------------------------------
Plan hash value: 2477198225

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |   989K|    35M|  1150   (8)| 00:00:14 |
|   1 |  SORT GROUP BY     |      |   989K|    35M|  1150   (8)| 00:00:14 |
|   2 |   TABLE ACCESS FULL| X    |   989K|    35M|  1079   (2)| 00:00:13 |
---------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
       4850  consistent gets
          0  physical reads
          0  redo size
      40067  bytes sent via SQL*Net to client
       1111  bytes received via SQL*Net from client
         68  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
       1000  rows processed

set autotrace off
set timing off





Followup August 01, 2008 - 10:54 am UTC
you would want to use tkprof, not timing in sqlplus, to see what is going on. for example:

Код: 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.
SELECT dept, name, sal
FROM   ( SELECT dept, name, sal, row_number() OVER (PARTITION BY dept ORDER BY sal DESC) rn FROM   x) WHERE  rn = 1

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.01          0          1          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch       68      1.32       1.61         26        500          4        1000
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total       70      1.33       1.62         26        501          4        1000

Rows     Row Source Operation
-------  ---------------------------------------------------
   1000  VIEW  (cr=500 pr=26 pw=26 time=1569382 us)
   5752   WINDOW SORT PUSHED RANK (cr=500 pr=26 pw=26 time=1688642 us)
 100000    TABLE ACCESS FULL X (cr=500 pr=0 pw=0 time=2899972 us)
********************************************************************************
SELECT dept, MAX(name) KEEP (DENSE_RANK FIRST ORDER BY sal DESC) name, MAX(sal) sal FROM   x GROUP  BY dept

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.01          0          1          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch       68      0.69       0.89          0        500          0        1000
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total       70      0.70       0.91          0        501          0        1000

Rows     Row Source Operation
-------  ---------------------------------------------------
   1000  SORT GROUP BY (cr=500 pr=0 pw=0 time=883211 us)
 100000   TABLE ACCESS FULL X (cr=500 pr=0 pw=0 time=2499976 us)


you can see they have very different plans - one of them is an aggregate, it squishes out rows, it only has to cache the 1000 rows to be returned as it aggregates (eg: only one ROW per dept needs be cached in the sort area, because it is grouping by dept)

the other one needed lots more temp (you can see pw=NN, it actually spilled to disk).

The aggregate IN THIS CASE was more efficient because of the things it could do to the data (keep only one row per dept), the analytic in this case was less efficient because the rows for dept had to be buffered, sorted and then down selected on
...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39320270
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus12Уважаемые,
найдена информация по теме у Кайта:
Бинго, Вы сделали это!
Теперь Вы тоже в курсе разницы между агрегатными и аналитическими функциями, ура!
...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39320857
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

спасибо - действительно, не обратил внимания на то, что max() keep dense_rank last в данном случае теряет аналитический хвост "over (partition by" и становится агрегатной функцией
...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39322837
drema201
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender,

Ниже мой test case: 1e7 записей: 1e6 групп/документов/сущностей с "глубиной версий 10"

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
DROP TABLE TTT;

CREATE TABLE TTT (id NUMBER, idgrp NUMBER, f1 VARCHAR2(100), f2 VARCHAR2(100),f3 VARCHAR2(100),f4 VARCHAR2(100),f5 VARCHAR2(100),f6 VARCHAR2(100),f7 VARCHAR2(100),f8 VARCHAR2(100),f9 VARCHAR2(100),f10 VARCHAR2(100) );

insert into TTT
select  
rownum,
mod(rownum,1e6), 
rownum || rpad('a'|| rownum, 90, 'd' ),
rownum-1 || rpad('b'|| rownum, 90, 'd' ) , 
rownum-2 || rpad('c'|| rownum, 90, 'd' ),  
rownum-3 || rpad('b'|| rownum, 90, 'd' ),  
rownum-4 || rpad('b'|| rownum, 90, 'd' ),  
rownum-5 || rpad('b'|| rownum, 90, 'd' ),  
rownum-6 || rpad('r'|| rownum, 90, 'd' ),  
rownum-7|| rpad('b'|| rownum, 90, 'd' ),  
rownum-8 || rpad('b'|| rownum, 90, 'd' ),  
rownum-9 || rpad('e'|| rownum, 90, 'd' ) 
 from dual connect by level <= 1e7;

commit;



ну и разные варианты исполнения:


set arraysize 5000
set lines 200

@mysx2 "temporary|sort" 25

@sx_a.sx

set term off

BEGIN
for c IN (select
max(f1) keep(dense_rank first order by id) f1,
max(f2) keep(dense_rank first order by id) f2--,
-- max(f1) keep(dense_rank first order by f2) f1,
-- max(f1) keep(dense_rank first order by f2) f1,
-- max(f1) keep(dense_rank first order by f2) f1,
-- max(f1) keep(dense_rank first order by f2) f1,
-- max(f1) keep(dense_rank first order by f2) f1,
-- max(f1) keep(dense_rank first order by f2) f1,
-- max(f1) keep(dense_rank first order by f2) f1,
-- max(f1) keep(dense_rank first order by f2) f1
from TTT
group by idgrp) loop
null;
end loop;
END;
/

set term on

PROMPT 2 items keep

@sx_b.sx
----------------------------------------
@sx_a.sx

set term off

BEGIN
for c in (select
max(f1) keep(dense_rank first order by id) f1,
max(f1) keep(dense_rank first order by id) f2,
max(f1) keep(dense_rank first order by id) f3,
max(f1) keep(dense_rank first order by id) f4,
max(f1) keep(dense_rank first order by id) f5,
max(f1) keep(dense_rank first order by id) f6,
max(f1) keep(dense_rank first order by id) f7,
max(f1) keep(dense_rank first order by id) f8,
max(f1) keep(dense_rank first order by id) f9,
max(f1) keep(dense_rank first order by id) f10
from TTT group by idgrp) loop
null;
end loop;
END;
/

set term on

PROMPT 10 same items keep

@sx_b.sx

------------------------------------------
@sx_a.sx

set term off

BEGIN
for c in (select
max(f1) keep(dense_rank first order by id) f1,
max(f2) keep(dense_rank first order by id) f2,
max(f3) keep(dense_rank first order by id) f3,
max(f4) keep(dense_rank first order by id) f4,
max(f5) keep(dense_rank first order by id) f5,
max(f6) keep(dense_rank first order by id) f6,
max(f7) keep(dense_rank first order by id) f7,
max(f8) keep(dense_rank first order by id) f8,
max(f9) keep(dense_rank first order by id) f9,
max(f10) keep(dense_rank first order by id) f10
from TTT group by idgrp) loop
null;
end loop;
END;
/


set term on

PROMPT 10 different items keep

@sx_b.sx

------------------------------------------
@sx_a.sx

set term off

BEGIN
for c in (select f1,f2,f3,f4,f5,f6,f7,f8,f9,f10 from (select
row_number() OVER (partition by idgrp ORDER BY id ) rn,
t.*
from TTT t ) where rn =1 ) loop
null;
end loop;
END;
/


set term on

PROMPT row_number

@sx_b.sx



ну и результаты

SQL>
SQL> @sx_a.sx
SQL> set term off
SQL>
SQL> set term off
SQL>
SQL> PROMPT 2 items keep
2 items keep
SQL>
SQL> @sx_b.sx
SQL> set echo off
357164 physical reads direct temporary tablespace
357164 physical writes direct temporary tablespace
0 sorts (memory)
1 sorts (disk)
10000000 sorts (rows)

SQL> ----------------------------------------
SQL> @sx_a.sx
SQL> set term off
SQL>
SQL> set term off
SQL>
SQL> PROMPT 10 same items keep
10 same items keep
SQL>
SQL> @sx_b.sx
SQL> set echo off
185202 physical reads direct temporary tablespace
185202 physical writes direct temporary tablespace
0 sorts (memory)
1 sorts (disk)
10000000 sorts (rows)

SQL>
SQL> ------------------------------------------
SQL> @sx_a.sx
SQL> set term off
SQL>
SQL> set term off
SQL>
SQL> PROMPT 10 different items keep
10 different items keep
SQL>
SQL> @sx_b.sx
SQL> set echo off
2000009 physical reads direct temporary tablespace
2000009 physical writes direct temporary tablespace
0 sorts (memory)
1 sorts (disk)
10000000 sorts (rows)

SQL>
SQL> ------------------------------------------
SQL> @sx_a.sx
SQL> set term off
SQL>
SQL> set term off
SQL>
SQL> PROMPT row_number
row_number
SQL>
SQL> @sx_b.sx
SQL> set echo off
1250031 physical reads direct temporary tablespace
1250031 physical writes direct temporary tablespace
0 sorts (memory)
1 sorts (disk)
10000000 sorts (rows)



оцениваю "хорошесть" по кол-ву сгенеренного TEMPa, (для больших сортировок это основной потребитель ресурса, IMHO),
конечно это весьма косвенный метод оценки обьема сортировок.

PS
трассу пока не собрал

PPS
план банальный

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Plan hash value: 1567363153
 
---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |       |       |   253K(100)|          |
|   1 |  SORT GROUP BY     |      |    10M|  5309M|   253K  (3)| 00:50:48 |
|   2 |   TABLE ACCESS FULL| TTT  |    10M|  5309M|   251K  (2)| 00:50:19 |
---------------------------------------------------------------------------

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Plan hash value: 981889577
 
-----------------------------------------------------------------------------------------
| Id  | Operation                | Name | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |      |       |       |       |  1411K(100)|          |
|*  1 |  VIEW                    |      |    10M|  5083M|       |  1411K  (1)| 04:42:16 |
|*  2 |   WINDOW SORT PUSHED RANK|      |    10M|  5207M|  5580M|  1411K  (1)| 04:42:16 |
|   3 |    TABLE ACCESS FULL     | TTT  |    10M|  5207M|       |   251K  (2)| 00:50:18 |
-----------------------------------------------------------------------------------------

...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39322907
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для полноты картины попробуйте /*+ parallel(TTT, 32)*/.
Жесткий parallel помогает скушать больше оперативки.
...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39322916
ORA__SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drema201
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 ---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |       |       |   253K(100)|          |
|   1 |  SORT GROUP BY     |      |    10M|  5309M|   253K  (3)| 00:50:48 |
|   2 |   TABLE ACCESS FULL| TTT  |    10M|  5309M|   251K  (2)| 00:50:19 |
---------------------------------------------------------------------------
Тормозная штука на больших объемах. Попробуй для сравнения:
Код: plsql
1.
/*+ use_hash_aggregation */
...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39322993
drema201
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ORA__SQL,

Оопс,

Спасибо незаметил, тестовый наборчик получился сортированный, возможно оптимайзер его и выбрал.
Переделаю (В реальной жизни конечно HASH GROUP BY)
...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39322996
drema201
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

это да помогает, спасибо. В продуктиве PARALLEL 16 ну и WORKAREA_SIZE_POLICY мануальная ~1 GB на slave (выше баги лезут)

PS
Ну и обьемы там на 2-3 порядка поболе:)
...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39322999
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39323111
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
drema201,

1. а вы сами поняли, что предоставленный тест-кейс как раз и противоречит вашей фразе
drema201Насколько помню keep dense rank сделает сортировку для каждого выражения (c keep dense rank) в SELECTе, вне зависимости таже эта сортировка или другая.
запрос:
drema201
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select 
  max(f1) keep(dense_rank first order by id) f1,
  max(f1) keep(dense_rank first order by id) f2,
  max(f1) keep(dense_rank first order by id) f3,
  max(f1) keep(dense_rank first order by id) f4,
  max(f1) keep(dense_rank first order by id) f5,
  max(f1) keep(dense_rank first order by id) f6,
  max(f1) keep(dense_rank first order by id) f7,
  max(f1) keep(dense_rank first order by id) f8,
  max(f1) keep(dense_rank first order by id) f9,
  max(f1) keep(dense_rank first order by id) f10  
from TTT group by idgrp

идентичен по сортировкам тому же:
Код: plsql
1.
2.
3.
select 
  max(f1) keep(dense_rank first order by id) f1
from TTT group by idgrp

а не в 10 раз больше...

2. Вы же понимаете, что сравнивая max(A1)keep(dense_rank... order by A2) c row_number()over() = 1, вы сравниваете разные совершенно запросы - агрегат с фильтром: первый ищет максимум A1 среди строк с максимальным A2, а второй берет лишь одну первую строку среди найденных строк с максимальным А2, не сортируя по А1. То что на ваших данных - это возвращает одно и то же, не означает что запросы идентичны, и потому странно использовать first/last там, где нужен лишь фильтр по row_number() = 1

3. У ТС уже есть агрегаты (SUM,SUM...,SUM) и ему не нужен фильтр, т.к. надо суммировать все записи, поэтому лучше добавить агрегат, а не добавлять лишний WINDOW SORT.
...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39323112
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
drema201Ну и обьемы там на 2-3 порядка поболе:)в продуктиве тоже надо возвращать 10% записей?
...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39323115
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ORA__SQLdrema201
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 ---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |       |       |   253K(100)|          |
|   1 |  SORT GROUP BY     |      |    10M|  5309M|   253K  (3)| 00:50:48 |
|   2 |   TABLE ACCESS FULL| TTT  |    10M|  5309M|   251K  (2)| 00:50:19 |
---------------------------------------------------------------------------
Тормозная штука на больших объемах. Попробуй для сравнения:
Код: plsql
1.
/*+ use_hash_aggregation */

с keep(dense_rank first/last) оракл насколько я знаю всегда делает sort group by
...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39323351
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По моим ощущениям, в "time-slice" запросах (с детерминированной сортировкой внутри группы) KEEP-подход раза в три быстрее подхода с ROW_NUMBER()
...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39324076
drema201
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender,

каюсь, сформулировал очень не аккуратненько.
идея достаточно очевидная при добавлении нового keep dense в SELECT кол_во temp'a растет почти линейно.
Если надо обработать достаточно большую долю колонок из таблицы то аналитика выигрывает.
Чудес конечно не бывает и window sort таскает по сортировкам целиком строку (точнее projection),
несколько keep dense rank ов - видимо таскают все необходимые пары плюс overhead.

ps
фильтрация ТС нужна - case rn=1...
...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39324798
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drema201xtender,
ps
фильтрация ТС нужна - case rn=1...

мне в итоге нужны и sum() всех записей, и спецобработка для case when rn = 1

т.о. хитрый финт с использованием индекса для ускорения отсюда https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:9525275800346255150 не подходит

сравнили на наших объемах row_number vs max() keep dense_rank (нужно для двух полей) - второе чуть быстрее, оставили его
...
Рейтинг: 0 / 0
дают ли разные аналитические функции разную производительность
    #39324800
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по существу темы - дают ли разные аналитические функции разную производительность - тестированием получена информация, что lag(с кляузой ignore nulls) из-за ignore nulls дает сильную просадку производительности (запрос уходит в несколько часов раздумий), и решение на нем можно/нужно заменять другими аналит.функциями (в данном случае на last_value с той же кляузой ignore nulls - что из часов ожидания делает минуты) - подробнее тут 19769749
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / дают ли разные аналитические функции разную производительность
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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