|
|
|
Оптимизация start_of_group. Или вообще не start_of_group...
|
|||
|---|---|---|---|
|
#18+
Приветствую! Есть таблица истории операций – дата, место, операция, надо вытащить оттуда с какой операции началась последняя серия по месту. Сделал с помощью start_of_group: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Всё работает, для места 1 выдаёт 20, для 2 – 30, всё верно. Проблема в том, что Tbl на самом деле содержит более 2 млрд записей, поиск идёт по некоей сущности, над которой делались операции, но это всё равно десятки тысяч. И внутренний select просматривает их все. А надо-то всего-то самую последнюю по времени группу, а в ней самую первую по времени запись. Может быть есть какой-то финт ушами? План там такой: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Я уж думаю, может PL/SQL лучше будет? У таблички есть индекс на ID и время, выбрать всё по ID order by op_date desc и в цикле найти начало группы. По идее, хоть на окно столько не отожрёт. Да и вызывается оно всё равно в пакете… Код: plsql 1. 2. 3. 4. 5. 6. 7. Или вообще можно без start_of_group? Скажем, если не завязываться на op_place, а просто брать самую последнюю серию? Это не совсем то, но это можно будет снаружи поправить. Упёрся в start_of_group, уже не вижу других решений) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2018, 21:42 |
|
||
|
Оптимизация start_of_group. Или вообще не start_of_group...
|
|||
|---|---|---|---|
|
#18+
При условии op_date меняется при переходе на новый op_place и есть индекс на op_lace,op_date а лучше на op_lace,op_date,oper: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2018, 22:43 |
|
||
|
Оптимизация start_of_group. Или вообще не start_of_group...
|
|||
|---|---|---|---|
|
#18+
IAmAllanЯ уж думаю, может PL/SQL лучше будет? У таблички есть индекс на ID и время, выбрать всё по ID order by op_date desc и в цикле найти начало группы.да, конечно, так будет лучше, если группы действительно маленькие, а всего записей IAmAllanдесятки тысяч Только не надо for loop in (select ... ), т.к. он по 100 записей фетчить будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2018, 23:29 |
|
||
|
Оптимизация start_of_group. Или вообще не start_of_group...
|
|||
|---|---|---|---|
|
#18+
IAmAllanИли вообще можно без start_of_group?Я бы сказал здесь фишка не в SOG, а в чтении таблицы [по индексу] до наступления определенного условия. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. В общем случае как-то так (должен быть селективный индекс, содержащий op_place) Код: 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. При некоторых особенностях можно без rec with как показал SY. Решение с фетчем в PL/SQL самое простое и поддерживаемое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2018, 10:28 |
|
||
|
Оптимизация start_of_group. Или вообще не start_of_group...
|
|||
|---|---|---|---|
|
#18+
Спасибо откликнувшимся! По op_place индекса нет и не предвидится( Сделал на PL/SQL, будем надеяться, оно не ляжет) Отдельное спасибо за напоминание про for... select, голова уже вообще не варила. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2018, 00:34 |
|
||
|
Оптимизация start_of_group. Или вообще не start_of_group...
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, Я всё спросить хотел и стеснялся, про cross, apply, set etc помимо родной документации не посоветуете, что почитать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2018, 05:27 |
|
||
|
Оптимизация start_of_group. Или вообще не start_of_group...
|
|||
|---|---|---|---|
|
#18+
Он, наверное, тоже стесняется The Power of Oracle SQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2018, 07:38 |
|
||
|
Оптимизация start_of_group. Или вообще не start_of_group...
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров, Ого! Спасибо! И dbms_photoshop, конечно, спасибо) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2018, 11:40 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39710185&tid=1883125]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
40ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
| others: | 278ms |
| total: | 427ms |

| 0 / 0 |
