|
|
|
функция и в select-листе и в where
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток, уважаемый All! Вот пример Код: plsql 1. 2. Скажите, Oracle отложит вычисление функции до шага filter в плане запроса, или же в момент размещения блока данных в кэше? Ведь не будет же он ее вычислять дважды? Заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2018, 02:57 |
|
||
|
функция и в select-листе и в where
|
|||
|---|---|---|---|
|
#18+
Teaser_for_newbieВедь не будет же он ее вычислять дважды?Легко. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2018, 07:51 |
|
||
|
функция и в select-листе и в where
|
|||
|---|---|---|---|
|
#18+
Я Вам больше скажу, он с нее НАЧНЕТ. В шаге filter ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2018, 18:16 |
|
||
|
функция и в select-листе и в where
|
|||
|---|---|---|---|
|
#18+
Teaser_for_newbieСкажите, Oracle отложит вычисление функции до шага filter в плане запроса, Как ты думаешь, что Oracle должен сделать с каждой строкой таблицы some_table чтобы понять подходит ли строка под запрос или нет? Правильно, Oracle выполнит ф-цию func(colC) для каждой строки. Это в общeм случае. Но если func определена как deterministic и есть FBI на func(colC), то func(colC) при запросе вообще не будет вычисляться. А если func определена как deterministic и result_cache то число выполнений func(colC) будет меньше или равно числу строк таблицы some_table. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2018, 22:00 |
|
||
|
функция и в select-листе и в where
|
|||
|---|---|---|---|
|
#18+
Я так понимаю, что у Oracle проблема. что у него только один шаг filter. Поэтому если в filter на таблице попадают и "нормальные операции" ))) и функции, программист надеется, что "Oracle умный" и вычислив обычные выражения, функцию и трогать не будет. А для оптимизатора, это просто filter... и он его как попросили, так и обрабатывает... а строк в таблице может быть много. Как вариант, можно сделать подселект который выбирает данные, добавить туда rownum (что бы сматериализовать), а во внешнем селекте дополнительно отфильтровать по функции. Иногда помогает. select * from (select .., rownum r from ... where .... ) tt where ...=my_func() Недавно коллеги тоже с функцией мучились (добавить rownum забыли) IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2018, 15:52 |
|
||
|
функция и в select-листе и в where
|
|||
|---|---|---|---|
|
#18+
SY А если func определена как deterministic и result_cache то число выполнений func(colC) будет меньше или равно числу строк таблицы some_table. SY. Спасибо за совет! А может только result_cache хватит для того, чтобы число выполнений функции не превышало числа строк таблицы? Без deterinistic? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2018, 18:27 |
|
||
|
функция и в select-листе и в where
|
|||
|---|---|---|---|
|
#18+
Teaser_for_newbieА может только result_cache хватит для того, Ну тут ситуация двоякая. Да result_cache не требует deterministic но подразумевает(правда частично). В древних версиях необходимо было указывать RELIES_ON теперь ORACLE автоматом их определяет. Но это только SQL data sources, a вот PL/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. 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. Так-что хочешь-не-хочешь а лучше удостовериться ф-ция детерминистик (в действительности). SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2018, 20:56 |
|
||
|
функция и в select-листе и в where
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev"Oracle умный" и вычислив обычные выражения, функцию и трогать не будетобычно по дефолту так и будет, т.к. оракл старается предикаты с функциями перемещать в конец всего FILTER: Код: 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. Но по-хорошему, ораклу надо дать статистику функции с помощью associate statistics ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2018, 23:39 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39596345&tid=1884486]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
41ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
2ms |
| others: | 248ms |
| total: | 362ms |

| 0 / 0 |
