|
Oracle не понимает как считать кардиналити для OR и AND
|
|||
---|---|---|---|
#18+
Вместо тысячи слов: (oracle 11.2.0.4) Код: 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. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129.
Обратите внимание на предикаты у последнего запроса. Оракл тупо потерял скобки, и оценивает совсем другой предикат. Правда результат запроса правильный, но кардиналити во многих случаях будет совершенно неправильная. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2020, 11:51 |
|
Oracle не понимает как считать кардиналити для OR и AND
|
|||
---|---|---|---|
#18+
Valergrad, Так ведь скобки вроде здесь избыточны - https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/About-SQL-Conditions.html#GUID-65B103FE-C00C-46A3-8173-А731ДБФш2Ч80 - или я туплю ? Regards Maxim ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2020, 12:19 |
|
Oracle не понимает как считать кардиналити для OR и AND
|
|||
---|---|---|---|
#18+
Valergrad, "Логическое И" выполняется до "Логического ИЛИ" (скобки для красоты по сути). ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2020, 12:23 |
|
Oracle не понимает как считать кардиналити для OR и AND
|
|||
---|---|---|---|
#18+
Asmodeus, вы правы насчет скобок. Но кардиналити все равно считается неправильно. Оно должно складываться из двух случаев ( за минусом их объединения ). Например, если переписать запрос через union all мы видим что это происходит: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2020, 12:31 |
|
Oracle не понимает как считать кардиналити для OR и AND
|
|||
---|---|---|---|
#18+
Причем проблема судя по всему именно в dynamic_sampling. Если мы соберем статистику, то оракл начинает применять формулы сложения вероятностей корректно. Код: 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.
В этом случае для OR формула правильная. 1000 для первого условия + 999 для второго условия и вычесть 1 для их объединения = получится 1998. С Dynamic_sampling у него должно было получиться 481 для первого условия + 111 для второго условия и вычесть 1 для их объединения = 591. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2020, 12:38 |
|
Oracle не понимает как считать кардиналити для OR и AND
|
|||
---|---|---|---|
#18+
Valergrad Причем проблема судя по всему именно в dynamic_sampling. Что получается после удаления статистики и Код: plsql 1.
? Да и вообще с уровнями поиграться. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2020, 14:26 |
|
Oracle не понимает как считать кардиналити для OR и AND
|
|||
---|---|---|---|
#18+
Valergrad, Dynamic sampling не оценивает предикаты по отдельности, только вместе(исключая крайние условия типа разных access paths) , поэтому ему и складывать нечего. Всё ок ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2020, 15:27 |
|
Oracle не понимает как считать кардиналити для OR и AND
|
|||
---|---|---|---|
#18+
xtender Valergrad, Dynamic sampling не оценивает предикаты по отдельности, только вместе(исключая крайние условия типа разных access paths) , поэтому ему и складывать нечего. Всё ок Все равно какая-то странная фигня. У меня есть табличка на 26 миллионов строк. И набор сложных фильтров. В реальности фильтр проходит 24 миллиона из 26. Динамик сэмплинг ( дефолтный, второго левела ) выдает по ним бред в виде 800 строк удовлетворяющих условию. При этом если убрать OR и рассматривать условия по отдельности - все норм, оценка в миллионы строк, скажем 6 млн или 13 млн. Казалось бы с OR должны получаться тоже миллионы - но там получаются вот такие бредовые цифры как будто вероятности перемножаются вместо того чтобы складываться. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2020, 19:53 |
|
Oracle не понимает как считать кардиналити для OR и AND
|
|||
---|---|---|---|
#18+
Как вариант можешь включить трассиовку SQL и оптимизатора, в SQL трассировке можно будет посмотреть конкретные запросы от dynamic sampling, в трассировке оптимизатора более детальные рассчёты. Особенно интересно посмотреть что конкретно возвращают запросы dynamic sampling. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2020, 21:39 |
|
|
start [/forum/topic.php?fid=52&msg=39993480&tid=1880934]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
62ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 314ms |
total: | 472ms |
0 / 0 |