|
|
|
Подзапрос + reg_exp + :bind + or = тормоза
|
|||
|---|---|---|---|
|
#18+
Коллеги, привет. Вкратце: запрос вида " Код: plaintext " Код: plaintext 1. 2. Но как-то криво. Нет ли решения изящнее? Детальнее: Я опять со своими хитрыми запросами, которые тормозят. В этот раз база одна, никаких дб-линков или политик. Имеем таблицу TAB (миллионы записей), в которой есть 2 индекса: по полю FE, и по полю BO. У меня есть одно значение FE (пусть 1), и несколько (обычно 1, но бывает и до 10) значений BO (в строке, через запятую, пусть '2,3,4'). Мне нужно выбрать все записи с такими FE и BO. Надо как-то строку привести в таблицу. Гуглю, нахожу чудесную конструкцию: Код: plaintext В итоге наш АРМ (конструктор запросов) начинает тормозить. Иду от простого: Код: plaintext Усложняю (добавляю разбор строки через regexp): Код: plaintext Гуглю, добавляю хинт PRECOMPUTE_SUBQUERY Код: plaintext Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Код: plaintext Хуже того, достаточно только значение 1 заменить на :FE (без замены '2,3,4' на :BO) - уже дохнем: Код: plaintext Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Но жить как-то надо, поэтому выкручиваемся через union: Код: plaintext 1. 2. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Но нет ли какого-нибудь более изящного решения? И почему оракл так себя ведёт? Если подскажете более-менее точную страницу документации - буду благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2018, 12:56 |
|
||
|
Подзапрос + reg_exp + :bind + or = тормоза
|
|||
|---|---|---|---|
|
#18+
shurka22 Но жить как-то надо, поэтому выкручиваемся через union: правильнее через union ALL ну а для парсинга строк можно например такое попользовать Код: plsql 1. уж не знаю на сколько оно шустрее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2018, 14:03 |
|
||
|
Подзапрос + reg_exp + :bind + or = тормоза
|
|||
|---|---|---|---|
|
#18+
MaximaXXLправильнее через union ALL В моём случае через union all строки дублировались, поэтому был union. MaximaXXLну а для парсинга строк можно например такое попользовать Код: plsql 1. уж не знаю на сколько оно шустрее Спасибо. Завтра проверю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2018, 14:43 |
|
||
|
Подзапрос + reg_exp + :bind + or = тормоза
|
|||
|---|---|---|---|
|
#18+
shurka22MaximaXXLправильнее через union ALL В моём случае через union all строки дублировались, поэтому был union. во втором union all ... and LNNVL(fe=:1 ) ...... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2018, 15:08 |
|
||
|
Подзапрос + reg_exp + :bind + or = тормоза
|
|||
|---|---|---|---|
|
#18+
shurka22 Код: plsql 1. Спасибо. Завтра проверю. Проверил, получилось примерно в 50 раз медленнее, чем мой вариант. Хотя, в моём случае эта скорость не важна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2018, 05:33 |
|
||
|
Подзапрос + reg_exp + :bind + or = тормоза
|
|||
|---|---|---|---|
|
#18+
shurka22, В прошлый раз вроде тоже была проблема с типами биндов вашего ОРМ? Намекать оптимизатору на конкатенацию пробовали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2018, 14:56 |
|
||
|
Подзапрос + reg_exp + :bind + or = тормоза
|
|||
|---|---|---|---|
|
#18+
envНамекать оптимизатору на конкатенацию пробовали? 1) в этом случае включить конкатенацию не так просто, т.к. понадобится полный синтаксис, типа USE_CONCAT(@"SEL$1" 8 OR_PREDICATES(1) PREDICATE_REORDERS((3 2) (2 3))) Код: 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. 2) и в этом нет смысла, т.к. форсировать индексный доступ в ветке с подзапросом не получится. Проще и надежнее использовать UNION ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2018, 15:49 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39666093&tid=1883795]: |
0ms |
get settings: |
5ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
159ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 449ms |

| 0 / 0 |
