|
|
|
многократный вызов функции
|
|||
|---|---|---|---|
|
#18+
Всем привет! Не могу понять, зачем при выборе данных из вложенного запроса оракл пересчитывает функцию... Тот же самый запрос на PostgreSQL по приколу написал - там лишь 1 раз функция вызывается. Вот сам запрос: Код: 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. p.s. Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2015, 19:38:57 |
|
||
|
многократный вызов функции
|
|||
|---|---|---|---|
|
#18+
shtirlitz56зачем при выборе данных из вложенного запроса оракл пересчитывает функцию...Потому что нигде не обещал обратного. Считай, что совершенно в разны кусках SQL-движка нужно сперва проверить условие, а потом сформировать актуальные значения select-list-а. Никогда не следует закладываться на количество вызовов. shtirlitz56Тот же самый запрос на PostgreSQLработает неправильно, не так ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2015, 19:55:17 |
|
||
|
многократный вызов функции
|
|||
|---|---|---|---|
|
#18+
Elic, ХЗ вроде честно постгрес отработал, но и с такой функцией то грех конечно неправильный ответ дать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2015, 20:16:06 |
|
||
|
многократный вызов функции
|
|||
|---|---|---|---|
|
#18+
shtirlitz56, Твой случай: http://orasql.org/2013/06/10/too-many-function-executions/ И объявляй функции deterministic - кеширование поможет снизить количество вызовов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2015, 21:52:35 |
|
||
|
многократный вызов функции
|
|||
|---|---|---|---|
|
#18+
xtender, Спасибо! Интересная статья! Почерпнул из неё пару способов избавиться от многократного вызова функции. 1-й способ (не требует переписывания запроса и функции): Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 2й способ (просто добавляем в селект rownum, и deterministic в объявление функции) : Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2015, 06:38:13 |
|
||
|
многократный вызов функции
|
|||
|---|---|---|---|
|
#18+
shtirlitz561-й способ Код: 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. Deterministic тоже не дает гарантиии. Ну и DUAL с его оптимизациями в последних версиях дeлает все это as clear as mud. Посему нужен реальный join и stopkey чтобы предотвратить push_pred. Но это ещё не все: Код: 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. Т.е. число выполнений функции зависит от порядка MERGE. Значит понадобится хинт LEADING: Код: 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. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2015, 15:25:33 |
|
||
|
многократный вызов функции
|
|||
|---|---|---|---|
|
#18+
SY, вроде бы все понятно, но по 1-му способу у меня план выполнения такой же, однако же функция лишь 1 раз каждый раз вызывается: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2015, 19:20:03 |
|
||
|
многократный вызов функции
|
|||
|---|---|---|---|
|
#18+
SY Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Это характерное поведение SQL*Plus. если вызвать в другом клиенте или обернуть в Код: plsql 1. 2. 3. 4. то будет один вызов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2015, 20:18:17 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=38879906&tid=1891890]: |
0ms |
get settings: |
5ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
336ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 603ms |

| 0 / 0 |
