|
|
|
Как оптимизировать запрос обновления
|
|||
|---|---|---|---|
|
#18+
Привет, что-то затруднился. Требуется выполнить обновление, установив некоторые поля в значения, возвращаемые одной функцией: Код: plsql 1. 2. 3. 4. Смущает что приходится одну и ту же функцию вызывать дважды с одними и теми же параметрами на входе. Нельзя ли здесь как-то оптимизировать запрос? t.field2 = t.field1 понятно не прокатит. Курсор не вариант, так как выполняться будет дольше и нет полей чтбы однозначно идентифицировать отдельную запись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2017, 12:39 |
|
||
|
Как оптимизировать запрос обновления
|
|||
|---|---|---|---|
|
#18+
t.field2 = t.field1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2017, 12:50 |
|
||
|
Как оптимизировать запрос обновления
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров, t.field2 = t.field1 не сработает, так как возмётся не изменённое значение t.field1 из таблицы и запишется в t.field2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2017, 12:55 |
|
||
|
Как оптимизировать запрос обновления
|
|||
|---|---|---|---|
|
#18+
rigor mortisПривет, что-то затруднился. Требуется выполнить обновление, установив некоторые поля в значения, возвращаемые одной функцией: Код: plsql 1. 2. 3. 4. Смущает что приходится одну и ту же функцию вызывать дважды с одними и теми же параметрами на входе. Нельзя ли здесь как-то оптимизировать запрос? t.field2 = t.field1 понятно не прокатит. Курсор не вариант, так как выполняться будет дольше и нет полей чтбы однозначно идентифицировать отдельную запись.У меня есть подобная задача. Вызов моей функции действительно стоит дорого (в ней множество точечных индексных обращений) - поэтому вместо функции я сделал вызов процедуры с out-параметрами, и решаю данную задачу в PL/SQL с помощью циклов + bulk fetch + коллекций + forall update. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2017, 12:59 |
|
||
|
Как оптимизировать запрос обновления
|
|||
|---|---|---|---|
|
#18+
rigor mortisВячеслав Любомудров, t.field2 = t.field1 не сработает, так как возмётся не изменённое значение t.field1 из таблицы и запишется в t.field2.Гоню, конечно update (select field1, field2, f_function_1(param1 => t.field3) a where ...) set field1=a, field2=a ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2017, 13:03 |
|
||
|
Как оптимизировать запрос обновления
|
|||
|---|---|---|---|
|
#18+
rigor mortis, result cache, deterministic ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2017, 13:03 |
|
||
|
Как оптимизировать запрос обновления
|
|||
|---|---|---|---|
|
#18+
AmKadrigor mortisПривет, что-то затруднился. Требуется выполнить обновление, установив некоторые поля в значения, возвращаемые одной функцией: Код: plsql 1. 2. 3. 4. Смущает что приходится одну и ту же функцию вызывать дважды с одними и теми же параметрами на входе. Нельзя ли здесь как-то оптимизировать запрос? t.field2 = t.field1 понятно не прокатит. Курсор не вариант, так как выполняться будет дольше и нет полей чтбы однозначно идентифицировать отдельную запись.У меня есть подобная задача. Вызов моей функции действительно стоит дорого (в ней множество точечных индексных обращений) - поэтому вместо функции я сделал вызов процедуры с out-параметрами, и решаю данную задачу в PL/SQL с помощью циклов + bulk fetch + коллекций + forall update.Хотя у меня поля апдейтятся разными значениями, а у тебя одним. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2017, 13:10 |
|
||
|
Как оптимизировать запрос обновления
|
|||
|---|---|---|---|
|
#18+
Не, updatable view, оказывается, тоже разложится на 2 вызова Но ведь есть еще Scalar Subquery Expression Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2017, 14:24 |
|
||
|
Как оптимизировать запрос обновления
|
|||
|---|---|---|---|
|
#18+
rigor mortis, Насколько я помню лучше всего отрабатывает связка result_cache + Scalar SQ, Т.к. result_cache еще и cross-session. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2017, 14:40 |
|
||
|
Как оптимизировать запрос обновления
|
|||
|---|---|---|---|
|
#18+
что-то затруднилсяrigor mortis, result cache, deterministic ? Спасибо, deterministic подходит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2017, 16:14 |
|
||
|
Как оптимизировать запрос обновления
|
|||
|---|---|---|---|
|
#18+
Используй MERGE: Код: 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. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2017, 16:35 |
|
||
|
Как оптимизировать запрос обновления
|
|||
|---|---|---|---|
|
#18+
SYИспользуй MERGE: Код: 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. SY. Этот вариант что-то вообще дольше получился на порядок. А с deterministic время выполнения сократилось на 20%. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2017, 17:43 |
|
||
|
Как оптимизировать запрос обновления
|
|||
|---|---|---|---|
|
#18+
rigor mortisЭтот вариант что-то вообще дольше получился на порядок. А с deterministic время выполнения сократилось на 20%. Вeрсия? 11G Код: 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. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. Так что смотри планы и ищи в чем дело. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2017, 18:53 |
|
||
|
Как оптимизировать запрос обновления
|
|||
|---|---|---|---|
|
#18+
SYrigor mortisЭтот вариант что-то вообще дольше получился на порядок. А с deterministic время выполнения сократилось на 20%. Вeрсия? 11G Код: 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. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. Так что смотри планы и ищи в чем дело. SY. Переписал всё заново, вроде ок, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2017, 13:23 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39390417&tid=1886566]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
175ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 488ms |

| 0 / 0 |
