Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
11.05.2021, 14:38
|
|||
---|---|---|---|
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
По крайней мере в некоторых случаях. Это видно в trace 10053 - там видно что статистика по колонкам сдвинута. Из-за этого он выдает бредовую cardinality и cost. Вероятно, дело в виртуальной колонке - cдвиг начинается с нее. Скрипт чтобы воспроизвести проблему ( спасибо Dominic Brooks ): Код: plsql 1. 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. 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. 49. 50. 51. 52. 53. 54. 55.
Как видите - итоговая кардиналити получилась 1 вместо 1000. Кто-нибудь с таким сталкивался и знает как пофиксить? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.05.2021, 14:48
|
|||
---|---|---|---|
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
Valergrad Код: plsql 1.
как пофиксить? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.05.2021, 15:13
|
|||
---|---|---|---|
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
Elic, не пробовал. Это же не от меня зависит. Но та же самая фигня сохраняется если сделать OPTIMIZER_FEATURES_ENABLE другие версии - 11g, 12c и т.п. вплоть до 9ки. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.05.2021, 17:09
|
|||
---|---|---|---|
|
|||
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
Valergrad, Что ж ни ты ни Дом Брукс (он в oracle-L написал об этом) не выложите сам трейс? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.05.2021, 17:52
|
|||
---|---|---|---|
|
|||
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
ok, повторяется и на 12.1.0.2 и на 19.9. из 10053: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.05.2021, 17:54
|
|||
---|---|---|---|
|
|||
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
это было на более упрощенный тест: vcol2.sql Код: 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.
vcol3.sql Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.05.2021, 17:56
|
|||
---|---|---|---|
|
|||
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
и на 11.2.0.4 повторяется: test Код: 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.
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.05.2021, 18:07
|
|||
---|---|---|---|
|
|||
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
По идее это Bug 23249829 - Incorrect cardinality estimate for join involving union all view (Doc ID 23249829.8) Который по идее fixed в 18.1.0 12.2.0.1.180116 (Jan 2018) Database Release Update (DB RU) 12.2.0.1.180116 (Jan 2018) Bundle Patch for Windows Platform но, видимо, как-то не до конца. Замена UNION ALL на UNION решает проблему: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.05.2021, 18:18
|
|||
---|---|---|---|
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
Sayan Malakshinov, спасибо! в моем случае я UNION не могу использовать - у меня по миллиарду строк в каждой секции UNION ALL ... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.05.2021, 18:36
|
|||
---|---|---|---|
|
|||
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
Valergrad, ну я полагаю у вас таких запросов не так уж много, так прибейте профилем с cardinality(X 1000) или opt_estimate: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.05.2021, 19:00
|
|||
---|---|---|---|
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
Sayan Malakshinov Valergrad, ну я полагаю у вас таких запросов не так уж много Да если бы! Фактически я добавил union all в ключевую факт вьюху в проекте. А BI-тул автоматически генерит запросы к ней - джойнит ее с дименшенами и т.п. У него есть возможность добавить хинт - но только во все запросы сразу. Т.е. если добавлять хинт, то только во все запросы сразу. Я подумаю над этим если не найдется другого решения, но пока что выглядит нежелательно... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.05.2021, 19:01
|
|||
---|---|---|---|
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.05.2021, 19:03
|
|||
---|---|---|---|
|
|||
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
Хах, нашел смешное решение: Код: plsql 1. 2.
test-case Код: 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.
Results: Код: 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. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.05.2021, 19:12
|
|||
---|---|---|---|
|
|||
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
Полный пример: https://gist.github.com/xtender/e385961ed4ded3e5a9dda80520eeafb9 Из 10053 видно, что неправильно рассчитывает Rounded cardinality: Код: plsql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.05.2021, 19:14
|
|||
---|---|---|---|
|
|||
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
Valergrad, я надеюсь измененный порядок столбцов не сломает вам систему? на самом деле же, надеюсь, вы не используете * или хотя бы используете ее с динамическим определением столбцов для фетча? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.05.2021, 19:33
|
|||
---|---|---|---|
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
Sayan Malakshinov Valergrad, я надеюсь измененный порядок столбцов не сломает вам систему? на самом деле же, надеюсь, вы не используете * или хотя бы используете ее с динамическим определением столбцов для фетча? Ты не поверишь, в этой вьюхе и правда изначально была *. Так показалось удобней - чтобы меньше менять при добавлении колонки. И еще вчера заметили, что если вместо звездочки перечислить список колонок - то в некоторых случаях работает норм. А что насчет звездочки? Чем она еще плоха? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.05.2021, 19:40
|
|||
---|---|---|---|
|
|||
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
Valergrad, Tanel хорошо постарался свести все причины в один короткий пост: https://tanelpoder.com/posts/reasons-why-select-star-is-bad-for-sql-performance/ но насколько помню и я, и другие люди еще много добавляли в твиттере в ответах ... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.05.2021, 21:20
|
|||
---|---|---|---|
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
Valergrad в этой вьюхе и правда изначально была *. Так показалось удобней - чтобы меньше менять при добавлении колонки. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.05.2021, 13:58
|
|||
---|---|---|---|
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
Спасибо, Саян за помощь и предложенное решение! Доминик запостил пост об этом: https://orastory.wordpress.com/2021/05/12/performance-issue-with-inline-view-union-all-and-virtual-column/ и мы создали SR для Оракла. К сожалению, виртуальные колонки - это не единственная проблема с inline view с union all. Даже пофиксив ее, Оракл продолжает шутить и выдавать бред в более сложных запросах. Первое что пока уже понятно: это для верхней вьюхи используется статистика уровня таблицы ( т.е. не работает partition pruning ). Т..е грубо говоря если у тебя есть with x as ( select * from a union all select * from a ) select * from x where part_key = :p1; То оракл для оценки кардиналити не берет инфу из статистики по партиции P1. ( Что он делает для каждого из внутренних блоков ). Он берет статистику уровня таблицы. А так как ключ :p1 свежий, только что вставленный, то он получается больше чем high_value для этой колонки в статистике - и привет , опять кардиналити 1 из-за несоответствия диапазонов. Но и это еще не все - похоже есть и другие проблемы. Расследование продолжается... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.05.2021, 14:09
|
|||
---|---|---|---|
|
|||
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
Valergrad Доминик запостил пост об этом: https://orastory.wordpress.com/2021/05/12/performance-issue-with-inline-view-union-all-and-virtual-column/ Я видел, но тут не надо путать: перепутанная статистика столбцов и ошибочный расчет Rounded cardinality для UNION ALL views - разные вещи, разные проблемы. Для расчета ROUNDED CARDINALITY не используется статистика всех столбцов. Cardinality у вас рассчитался правильно, а Rounded cardinality - нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.05.2021, 14:25
|
|||
---|---|---|---|
|
|||
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
Valergrad это для верхней вьюхи используется статистика уровня таблицы не могу найти где в меня в твиттере это было... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.05.2021, 15:05
|
|||
---|---|---|---|
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
Sayan Malakshinov Valergrad Доминик запостил пост об этом: https://orastory.wordpress.com/2021/05/12/performance-issue-with-inline-view-union-all-and-virtual-column/ Я видел, но тут не надо путать: перепутанная статистика столбцов и ошибочный расчет Rounded cardinality для UNION ALL views - разные вещи, разные проблемы. Для расчета ROUNDED CARDINALITY не используется статистика всех столбцов. Cardinality у вас рассчитался правильно, а Rounded cardinality - нет. Боюсь я мало трейсов смотрел чтобы знать отличия между ними. Вот скажем, кусок из вашего трейса: Код: plsql 1. 2. 3.
У меня выглядит примерно так же. С чего я сделал вывод что Original - это без учета предикатов. Computed - c учетом предикатов. Rounded - округленная Computed Non Adjusted - хз, возможно это апдейты 0 в 1. Не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.05.2021, 15:11
|
|||
---|---|---|---|
|
|||
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
Valergrad, в примере нет предикатов ни в 0 ни в 1-й строке. Да, в данном случае непосредственно поплывшая статистика столбцов приводит к проблеме, но вообще она не должна никак влиять, а должна просто суммироваться кардинальность дочерних row-sources ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.05.2021, 15:12
|
|||
---|---|---|---|
|
|||
Оракл 19.6 путает колонки при подсчете cardinality/cost |
|||
#18+
как будет время, я еще поковыряю как и откуда она высчитывается именно для union all (перечисленные в письме в Oracle-L баги и их fix_control дают некоторые намеки) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=52&mobile=1&tid=1880205]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
156ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 249ms |
total: | 503ms |
0 / 0 |