|
|
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
Под руками нет доки, поэтому и спрашиваю. Приведите, пжл, пример обновления с использованием выборки из нескольких таблиц, подчиненный запрос тормозит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 11:02 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
Текст запроса совего давай и план выполнения. Посмотрим где тормоза ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 11:05 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
update invent_karta a set a.stoim_bux_id = (select b.analitic_id from v_metapos_saldo b, v_metadoc_saldo c where b.doc_id = c.id and a.obj_id = b.object_code_4 and c.Number like 'X0-%') ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 11:09 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
Я бы посоветовал вначала просто отдельно посмотреть план выполнения подзапроса. Хотя уже и так видно, что используется Like - который никак не оптимизируется, естественно приводит к FULL SCAN. Вобщем жду план вып. подзапроса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 11:16 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
оракл юзаю редко, планы ни разу не смотрел, инструмент PL/SQL Developer 5.0.2.500 построил графический план, а как его взять в тексте догнать не могу, помогите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 11:20 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
Если ты хочешь добиться результатов в написании хороших запросов , без планов запроса тебе не обойтись. Тебе надо почитать литературу для начала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 11:27 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
Спасибо за совет, поддерживаю 100%. Моя таргет БД = MSSQL (там я этим и занимаюсь), а с ораклом меня "попросили" поапдейтить кой-какие данные, мне бы просто пример обновления с запросом из нескольких таблиц или этого оракл не умеет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 11:39 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
Если ты говоришь, что тормозит - значит уже умеет, не так ли? А то что тормозит - это множество причин. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 11:53 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
А ведь в моем примере вложенный запрос, а не джойнед, а мне бы просто синтаксис со словами UPDATE & INNER JOIN ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 11:56 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
А ведь в моем примере вложенный запрос, а не джойнед, а мне бы просто синтаксис со словами UPDATE & INNER JOIN ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 11:56 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
>Моя таргет БД = MSSQL (там я этим и занимаюсь), а с ораклом >меня "попросили" поапдейтить кой-какие данные, мне бы просто пример >обновления с запросом из нескольких таблиц или этого оракл не умеет? Никакой принципиальной разницы в порядке доступа к данным между mssql и oracle нет и быть не может. Если есть предикат в where и селективный индекс, то он будет использоваться. Т.к. у вас не OLAP запрос, обычный для OLTP систем, то создайте необходимые индексы и вставьте для перестраховки в свой подзапрос хинт /*+ rule */ Код: plaintext Что касается плана выполнения в PL/SQL Developer 5.0.2.500, то никакой он не графический (как кстате в mssql EE), а обычный текстовый. Все что надо сделать - это вызвать правое контекстное меню находясь мышью на плане - там только одна опция - "COPY" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 12:07 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
Код: plaintext надо читать: "Т.к. у вас не OLAP запрос, а обычный для OLTP" Код: plaintext надо читать: как кстате в mssql EM ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 12:11 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
Спасиб, признаюсь - поленился проверить. А вот и сам план. Код: plaintext 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. Понимаю, что без индексов не обойтись, но БД не моя ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 12:15 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
Попробуй избавится от соотнесенного запроса, переписав все на pl/sql, к примеру: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Что следует учесть: в данном случае значения invent_karta, для которых не нашлось записей invent_karta.stoim_bux_id = v_metapos_saldo.analitic_id не изменятся, когда как в твоем первоначальном запросе они станут null. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 12:17 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
Через курсор - это вариант. А для invent_karta гарантированно есть запись в v_metapos_saldo удовлетворяющая указанному предикату, и даже, предположим не одна, а вот как это оракл разруливает - непонятно. Но начать запрос запрос с "другой стороны" действительно выгоднее, т.к. выборка из invent_karta легче, чем из v_metapos_saldo в которой записей на порядок больше и еще джойнится с другой таблицей. Одним словом - спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 12:28 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
"А вот и сам план. " Какой ужас :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 12:31 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
Кстати, может в этом и корень твоей проблемы. Насколько помню, в MSSQL и Sybase подобный запрос не требовал бы никакого соотнесения, а выглядел бы примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. В данном случае единожды выполняется запрос на выборку условий, а потом изменяется требуемая таблица. В Оракле такой синтаксис не предусмотрен, по крайней мере пока, вплоть до 9i, если не ошибаюсь. Хотя м.б. есть что-нибудь другое, позволяющее решить данную задачу только на SQL в понимании Oracle:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 12:37 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
Denis Popov, ты попал в самую точку. Именно этого я и хотел, но такой запрос в 8i не проходит, а на MSSQL2K на ура (конечно только на join заменить бы для читабельности) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 12:41 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
to Kreek: Чего-то тебя зациклило на JOIN(INNER JOIN). В Oracle8i нет такой конструкции. Она только в 9i появилась. Используй "+" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 12:49 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
имхо вы правильно подметили проблему, но решение ее не в переписывании sql запроса, а в создании индекса по полям по которым соединяются таблицы: Код: plaintext Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 12:50 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
Денис, в твоем примере в переменную i запихиваются значения двух полей, тогда какой тип у этой переменной (указатель на курсор?? и почему ее заранее объявлять не надо). Вопрос, наверное, ламерский, но у меня мало опыта по работе с pl/sql. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 14:20 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
"в переменную i запихиваются значения двух полей, тогда какой тип у этой переменной" Во-первых в переменную i - не запихиваются значения каких либо полей. В данном случае i - это внутренняя переменная цикла, которая существует только внутри цикла. Во-вторых, её обьявлять не надо потому-что это так предусмотрено синтаксисом PL/SQL. Тип ествественно целый ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 14:34 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
Это такой вот оракловый синтаксис. Можно написать по-другому, более похоже на T-SQL: Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 14:39 |
|
||
|
JOINED UPDATE
|
|||
|---|---|---|---|
|
#18+
С "запихиваются" - погорячился. Т.е. эта внутренняя переменная (не требующая объявления) есть указатель на запись в курсоре (открытом неявно)? я правильно понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2003, 14:40 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32103722&tid=1991863]: |
0ms |
get settings: |
7ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
159ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
87ms |
get tp. blocked users: |
2ms |
| others: | 211ms |
| total: | 507ms |

| 0 / 0 |
