|
|
|
Рассыпается план
|
|||
|---|---|---|---|
|
#18+
Упрощенно, есть таблица Код: plsql 1. есть индексы на таблицу: ...on mtable(f1, f10, f20); ...on mtable(f2, f10, f20); ...on mtable(f3, f10, f20); Делаешь к ней запросы вида: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Каждый из них по отдельности отрабатывает быстро по index range scan соответствующего индекса, не обращаясь к таблице. Теперь объединяем эти запросы: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. План показывает, что по каждому запросу теперь кроме обращения к индексу идет и обращение к таблице по rowid (при этом время выполнения запроса увеличивается минимум, на порядок) Собственно вопрос, как дальше жить :) Можно конечно попытаться разбить этот общий запрос на отдельные мелкие, забивай например временную таблицу или коллекцию, но дальше с этими данными надо тоже работать запросом, т.е. не хотелось бы кастовать в table и тем более писать в темповую таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 18:01 |
|
||
|
Рассыпается план
|
|||
|---|---|---|---|
|
#18+
Avotge, union без all - пробовали? Не прокатит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2016, 04:36 |
|
||
|
Рассыпается план
|
|||
|---|---|---|---|
|
#18+
Avotge, на 11.2.0.4 и 12.1.0.2 не воспроизводится. Какая у тебя версия? Покажи план через select * from table(dbms_xplan.display_cursor('&sqlid',null,'advanced'). Еще лучше будет, если приложишь 10053 трассу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2016, 05:05 |
|
||
|
Рассыпается план
|
|||
|---|---|---|---|
|
#18+
Makar4ik, xtender, спасибо, что откликнулись. Оракл 11.2 К сожалению долго разбираться нет времени. Позже попробую смоделировать (дома тоже не получилось воспроизвести, но делал не совсем точно), но пока стабильной работы запроса нет: - или подхватывается не тот индекс, в котором есть все поля запроса, а тот который поменьше размером, то есть просто index(f1) например - или подхватывается нужный индекс На трассировку нет прав, беда. Поэтому разбил на пять отдельных меленьких запросов, каждый из которых достает свои записи в коллекцию (условно rowid). Потом объединяем эту коллекцию в одну. И дальше делаем оставшуюся часть запроса. Так вот часть разбитая на маленькие запросы работает теперь быстро, меньше секунды. А оставшаяся же часть вообще врубает фулскан, хотя выборка идет по rowid из коллекции добытой на первом этапе. Вот это вообще не понял ) То есть условно запрос вида: Код: plsql 1. 2. 3. Врубает фулскан по таблицам вьюшки v_my_view. Вьюшка v_my_view имеет вид: Код: plsql 1. 2. 3. 4. 5. Подзапрос with t возвращает порядка 30строк. В table1 и table2 50млн строк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2016, 12:40 |
|
||
|
Рассыпается план
|
|||
|---|---|---|---|
|
#18+
Если делать этот же запрос не к вьюшке из двух таблиц, а к каждой таблице отдельно: Код: plsql 1. 2. 3. или Код: plsql 1. 2. 3. то идет нормальное обращение по rowid Если идем через вьюшку объединяющую эти две таблицы, обе эти таблицы фулсканятся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2016, 12:45 |
|
||
|
Рассыпается план
|
|||
|---|---|---|---|
|
#18+
В итоге пришлось взять весь запрос с union all засунуть в требуемый запрос и к каждой таблице прицепиться по rowid. В итоге запрос отрабатывает в районе секунды, к чему и стремился. Плохо, что нет времени разобрать в чем засада-то, что уж и по rowid начинает фулсканить, это надо уметь ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2016, 13:11 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39346778&tid=1887027]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
167ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 265ms |
| total: | 531ms |

| 0 / 0 |
