|
|
|
Оптимизация запроса (итоги по дереву)
|
|||
|---|---|---|---|
|
#18+
Тестовые исходные данные: Код: plsql 1. 2. 3. 4. 5. 6. 7. Самый простой вариант запроса, который возвращает нужный результат: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. То есть существует дерево кодов, по которому надо посчитать итоги для каждого уровня. В реальности вложенность дерева порядка 8-ми. В изначальном варианте не нравится, что при джойне со справочником фактически замножаем количеств записей и из 10-ков миллионов получаем 100-ни млн. Плюс надо вывести еще и суммы по ID внутри каждой группы (в примере пока без этого), то к изначальному варианту придется еще или юнионом цеплять все исходные записи или немного хитрить с джойном. Пробуем переписать как бы в один проход, без джойна: Код: plsql 1. 2. 3. 4. 5. 6. По времени работает так же. Вполне возможно, что тормоза , из-за regexp_substr. Пробуем просто substr: Код: plsql 1. 2. 3. 4. 5. 6. По времени уже в два раза быстрее чем первый запрос. Только учитывая, что в реальности уровень вложенности будет больше, придется больше мудрить с grouping_sets. Плюс будет не просто substr, а substr + instr т.к. коды могут быть разными (21.1.15; 9.2.13 и т.д.). Вопрос, есть более простой и эффективный вариант? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2018, 13:18 |
|
||
|
|

start [/forum/topic.php?fid=52&fpage=111&tid=1883846]: |
0ms |
get settings: |
9ms |
get forum list: |
21ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
62ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
41ms |
get tp. blocked users: |
2ms |
| others: | 228ms |
| total: | 383ms |

| 0 / 0 |
