|
|
|
Переписать запрос
|
|||
|---|---|---|---|
|
#18+
Тестовые данные: Код: plsql 1. 2. 3. 4. 5. 6. 7. Запрос: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. На тестовых данных выполнялся более 5 минут, не дождался. План: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. При том, что первый подзапрос возвращает 3 записи, второй 2 и каждый отрабатывает очень быстро хоть и с фулсканом за секунду. Но итоговый запрос сваливается в какой-то бесконечный фулскан. Можно разбить запрос на две части с union all: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Запрос выполнился за 2сек. План: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Попробовал через аналитику: Код: plsql 1. 2. 3. 4. 5. 6. 7. Около 5сек с последующим бодрым фетчем. План: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 1. Индексы для группировки выходит, совсем не нужны? А если объем будет например 30миллионов? 2. Пока не понял, почему жутко тормозит первый вариант (хотя вроде бы не сильно отличается по сути от второго, только разнесли группировки) 3. Возможно ли переписать более эффективно? 4. Можно ли в плскл девелопере быстро достать в буфер план в человеческом виде (по F5 при копировании в буфер результат не читабелен, а использовать explain plan for или gather_plan_statistics долго и потому не удобно по-моему)? (не говорим о том, что реальный план может отличаться). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 21:27:50 |
|
||
|
Переписать запрос
|
|||
|---|---|---|---|
|
#18+
field4 в запросах лишнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 21:30:07 |
|
||
|
Переписать запрос
|
|||
|---|---|---|---|
|
#18+
Переписчик, Аналитика вполне себе вариант для такого кейса, по поводу индексов при группировке - ну разве что если можно прочитать через IFFS, но сильно уж лучше от этого не будет, ввиду что 1 FULL SCAN с аналитикой > 3 хоть и оптимизированных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 00:34:09 |
|
||
|
Переписать запрос
|
|||
|---|---|---|---|
|
#18+
Переписчик1. Индексы для группировки выходит, совсем не нужны? А если объем будет например 30миллионов? 2. Пока не понял, почему жутко тормозит первый вариант (хотя вроде бы не сильно отличается по сути от второго, только разнесли группировки) 3. Возможно ли переписать более эффективно? 4. Можно ли в плскл девелопере быстро достать в буфер план в человеческом виде (по F5 при копировании в буфер результат не читабелен, а использовать explain plan for или gather_plan_statistics долго и потому не удобно по-моему)? (не говорим о том, что реальный план может отличаться). 1. В данном случае трудно придумать эффективную схему индексирования. По итогу в выборку выбираются все поля. Стало быть, либо индекс должен быть составным (а в этом случае его размеры будут приближаться к размерам таблицы), либо придется читать не только индекс, но и таблицу (и в этом случае есть сильные сомнения, что оптимизатор "подпишется" на такое) 2. Смотреть план, много думать. 3. Более эффективно или нет - сказать трудно, но как вариант - можно сделать через LEFT JOIN SEMI: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 4. Я бы не сочел за труд делать через explain plan + dbms_xplan. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 06:34:10 |
|
||
|
|

start [/forum/topic.php?fid=52&fpage=214&tid=1887963]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
55ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 324ms |

| 0 / 0 |
