|
|
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
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. понятно, что такое решение не единственное - как минимум напрашиваются: а) max() keep dense_rank last over (partition by б) Last_value() over (partition by вопросы: 1) что можете предложить эффективнее (править таблицу-источник или предрассчитать что-то нельзя) 2) есть ли смысл выписывать варианты а и б для сравнения производительности, или производительность будет варьироваться в пределах погрешности измерения? или так: дают ли разные аналитические функции реально разную производительность? спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2016, 15:42 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
Alexus12дают ли разные аналитические функции реально разную производительность? Зависит от того есть ли сортировка в них, если сортировка одинакова то вообщем то разницы нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2016, 15:45 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
Alexus12, есть ли признак последней проводки по счету (ид,тм)? ...... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2016, 20:27 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
ora601, Насколько помню keep dense rank сделает сортировку для каждого выражения (c keep dense rank) в SELECTе, вне зависимости таже эта сортировка или другая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2016, 23:13 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
stax..Alexus12, есть ли признак последней проводки по счету (ид,тм)? ...... stax нет, поэтому и идет ее вычисление в коде ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2016, 14:40 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
drema201ora601, Насколько помню keep dense rank сделает сортировку для каждого выражения (c keep dense rank) в SELECTе, вне зависимости таже эта сортировка или другая. Если точнее то он делает сортирвку по выражению указанному в order by ... То же самое касаеться row_number , lead/lag , sum over() и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2016, 16:02 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
ora601, Да целиком и полностью согласен, просто с "обычной" аналитикой зачастую проще обойтись одной сортировкой, с keep dense rank иногда использовал трюк с max(rowid) keep dense ... , но это приводит к одноблочному чтению на соответствуещем шаге плана, что было довольно затратно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2016, 22:56 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
drema201ora601, Насколько помню keep dense rank сделает сортировку для каждого выражения (c keep dense rank) в SELECTе, вне зависимости таже эта сортировка или другая.Примерчик можно? Желательно с планом и трассой 10032. Мой примерчик в вложении ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 00:59 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
Уважаемые, найдена информация по теме у Кайта: 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. 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. 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 13:43 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
Alexus12Уважаемые, найдена информация по теме у Кайта: Бинго, Вы сделали это! Теперь Вы тоже в курсе разницы между агрегатными и аналитическими функциями, ура! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 13:56 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous, спасибо - действительно, не обратил внимания на то, что max() keep dense_rank last в данном случае теряет аналитический хвост "over (partition by" и становится агрегатной функцией ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 11:34 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
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. ну и разные варианты исполнения: 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. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2016, 14:44 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
Для полноты картины попробуйте /*+ parallel(TTT, 32)*/. Жесткий parallel помогает скушать больше оперативки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2016, 15:53 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
drema201 Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2016, 16:02 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
ORA__SQL, Оопс, Спасибо незаметил, тестовый наборчик получился сортированный, возможно оптимайзер его и выбрал. Переделаю (В реальной жизни конечно HASH GROUP BY) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2016, 18:07 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous, это да помогает, спасибо. В продуктиве PARALLEL 16 ну и WORKAREA_SIZE_POLICY мануальная ~1 GB на slave (выше баги лезут) PS Ну и обьемы там на 2-3 порядка поболе:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2016, 18:11 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2016, 18:14 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
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. идентичен по сортировкам тому же: Код: plsql 1. 2. 3. а не в 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2016, 23:55 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
drema201Ну и обьемы там на 2-3 порядка поболе:)в продуктиве тоже надо возвращать 10% записей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2016, 23:55 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
ORA__SQLdrema201 Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plsql 1. с keep(dense_rank first/last) оракл насколько я знаю всегда делает sort group by ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2016, 23:59 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
По моим ощущениям, в "time-slice" запросах (с детерминированной сортировкой внутри группы) KEEP-подход раза в три быстрее подхода с ROW_NUMBER() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2016, 00:24 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
xtender, каюсь, сформулировал очень не аккуратненько. идея достаточно очевидная при добавлении нового keep dense в SELECT кол_во temp'a растет почти линейно. Если надо обработать достаточно большую долю колонок из таблицы то аналитика выигрывает. Чудес конечно не бывает и window sort таскает по сортировкам целиком строку (точнее projection), несколько keep dense rank ов - видимо таскают все необходимые пары плюс overhead. ps фильтрация ТС нужна - case rn=1... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2016, 21:53 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
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 (нужно для двух полей) - второе чуть быстрее, оставили его ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2016, 18:21 |
|
||
|
дают ли разные аналитические функции разную производительность
|
|||
|---|---|---|---|
|
#18+
по существу темы - дают ли разные аналитические функции разную производительность - тестированием получена информация, что lag(с кляузой ignore nulls) из-за ignore nulls дает сильную просадку производительности (запрос уходит в несколько часов раздумий), и решение на нем можно/нужно заменять другими аналит.функциями (в данном случае на last_value с той же кляузой ignore nulls - что из часов ожидания делает минуты) - подробнее тут 19769749 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2016, 18:22 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39322993&tid=1887263]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
69ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
| others: | 245ms |
| total: | 416ms |

| 0 / 0 |
