|
|
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
Приветствую! Далее представленный запрос выполняется непозволительно долго, ищу возможность ускорить. В запросе два условия соединенные через "OR" Если оставить любое из этих условий, запрос летает. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Буду благодарен за советы, заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2016, 17:09:42 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
P.S. Oracle 9.2, если это важно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2016, 17:13:45 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
Кроик Семён, Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2016, 17:29:45 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
спасибо, идея понятна но мне нужен редактируемый запрос. Написал такое: Код: 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. стало еще хуже (раз в 5) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2016, 17:43:06 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
P.S. а вообще, есть ли возможность создать индекс , который бы работал на условии "OR"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2016, 17:44:52 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
Кроик СемёнПриветствую! Далее представленный запрос выполняется непозволительно долго, ищу возможность ускорить. В запросе два условия соединенные через "OR" Если оставить любое из этих условий, запрос летает. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Буду благодарен за советы, заранее спасибо. План покажи для медленного и быстрого? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2016, 17:45:33 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
оригинальный запрос ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2016, 17:58:53 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
быстрый 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2016, 17:59:19 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
быстрый 2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2016, 17:59:30 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
Кроик Семёна вообще, есть ли возможность создать индекс , который бы работал на условии "OR"? Кроик Семёнбыстрый 2 вот or на котором работают индексы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2016, 18:06:28 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
pihelКроик Семёнбыстрый 2 вот or на котором работают индексы вобщем то да.... проверил, индексы перестают работать из-за подзапроса "IN" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2016, 18:25:07 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
Какие индексы существуют у таблицы transponder ? Как минимум нужна ДВА индекса, на поля FK_Objekt - наблюдается и на поле FK_Auftrag - не наблюдается Статистика собрана? AFAIK: 1) Вообще-то Oracle оптимизатор сам IN может превратить в Union (The USE_CONCAT hint instructs the optimizer to transform combined OR-conditions in the WHERE clause of a query into a compound query using the UNION ALL set operator). 2) Все эти Intex to bitmap - от лукавого. Я бы лично тому, кто их придумал, руки бы из задницы оторвал. Они чисто для недоделанных кривых говнокодных OLAP (т.к. в нормальном OLAP и индекс был бы bitmap и Btree to bitmap делать бы не понадобилось). Но когда они в OLTP системах начинают вылезать - тушите свет. IMHO & AFAIK Конечно статистика данных у автора не известно, но на мой взгляд Nested Loop + Concat, Nested Loop + Concat и нефиг извращаться. IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2016, 18:50:37 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
переписал запрос, отделив дру от друга части с разными bind - переменными, разнеся их в стороны, и запрос резко (раза в 3-4) ускорился. но самое непонятное: план запроса остался как у оригинального "медленного" Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2016, 18:54:32 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
А правильно понимаю, что в целом это эквивалентно следующему запросу? (запросы не эквивалентны по SQL, но подозреваю по бизнесу одно и то же). Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2016, 19:05:59 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, в точку (даже порядок условий тот же, я очень удивлен) это был мой самый первый запрос, который я сел ускорять ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2016, 19:21:33 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
Покажи его план (с хинтом) и какие индексы существуют на табличке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2016, 19:26:16 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, спасибо за участие. Сейчас не могу ответить, завтра как доберусь до компа все выложу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 01:47:19 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
Код: plsql 1. может выдать данные, отличные от основного запроса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 07:52:31 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
скрипт для создания таблицы transponder Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 11:43:04 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
P.S. сорри, запостилось раньше времени, продолжаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 11:47:45 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
Кроик Семён, А советник в OEM ничего по этому поводу не советует? (Если Oracle Enterprise конечно) В SQL Monitor зайди найди свой запрос и там вызови советника. Он там сам иногда планы интересные составляет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 12:06:54 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
1) Индексы на поля есть, IMHO хинтовать до посинения, пока Oracle не станет делать CONCAT + использовать индексы. Ну и параллельно разбираться, почему он сейчас вместо индексов и CONCAT уходить в Full Table Scan. 2) В общем, правильное решение сказал Элементарно Ватсон: Запрос должен разложиться на 3-и простейших части + union all. Это можно сделать или руками или хинтами. 3) Ну и последний вариант, поиск по индексу ДЕЙСТВИТЕЛЬНО дороже (медленнее), чем full table scan. Oracle прав. Бороться бессмысленно ))) IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 12:53:59 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevБороться бессмысленно ))) спасибо остановился тогда на этом варианте 19351570 , который по непонятным причинам в 4 раза быстрее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 13:12:03 |
|
||
|
Как ускорить выборку по условию "OR"?
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsevхинтовать до посиненияВместо хинтования до посинения иногда полезно включать мозг. Трансформации запросов в Оракле тоже имеют свои границы и он не может развернуть в concat когда в одном из OR фигурирует in. Так же concatenation работает проблемно когда больше двух альтернатив в OR - не забываем что при увеличении числа альтернатив - число веток в плане растет как степень двойки. Для желающих смотреть что проиходит - прямая дорога в раздел transformation in 10053. Если просто цель добиться исключительно индексного доступа, то очевидных варианта два - развернуть в union all вручную - добиться соединения индексов, но это извращение. 2ТС: Заглядывай иногда в раздел final query в 10053, чтоб видеть итоговый запрос. В 90% "переписывания" не имеют никакого смысла когда человек оптимизирует методом тыка без желания понять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.06.2016, 13:27:38 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39265368&tid=1887988]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
155ms |
get topic data: |
15ms |
get forum data: |
2ms |
get page messages: |
77ms |
get tp. blocked users: |
1ms |
| others: | 190ms |
| total: | 463ms |

| 0 / 0 |
