powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Есть ли разница, как делать соединение merge?
7 сообщений из 7, страница 1 из 1
Есть ли разница, как делать соединение merge?
    #39760559
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица tbl (tbl_id, client_id, attr_id, value, ...). tbl_id это PK, по (client_id,attr_id) есть уникальный индекс.
Мне нужно обновить данные в этой таблице.
Есть ли разница, как это сделать?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
merge into tbl
using (
  select ... as client_id, ... as attr_id, ...
  from ...
  ...
) rs on (tbl.client_id = rs.client_id and tbl.attr_id = rs.attr_id)
...


и
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
merge into tbl
using (
  select tbl.tbl_id, ...
  from ...
  ...
  left join tbl on (tbl.client_id = rs.client_id and tbl.attr_id = rs.attr_id)
) rs on (rs.tbl_id = tbl.tbl_id)
...



Реальный пример более громоздкий и мне второй вариант более удобен просто потому, что для меня он более читаем.
Как можно оценить, насколько лишнее соединение по PK усложняет запрос для сервера?
Мне не совсем понятно, как в данном случае получить план выполнения, ведь в merge у меня используются и when matched, и when not matched.
Если сравнивать просто план выполнения запроса внутри using, он ведь не покажет наружнего соединения.
...
Рейтинг: 0 / 0
Есть ли разница, как делать соединение merge?
    #39760606
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Мне не совсем понятно, как в данном случае получить план выполненияТ.е. ты не знаешь, как получать план, или считаешь, что для особо одарённых припрятана особая команда?
...
Рейтинг: 0 / 0
Есть ли разница, как делать соединение merge?
    #39760703
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

для меня более читаемий первый вариант

.....
stax
...
Рейтинг: 0 / 0
Есть ли разница, как делать соединение merge?
    #39760713
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicТ.е. ты не знаешь, как получать план
Я не уверен, как это делать правильно.
Я выполнил explain plain для обоих вариантов, но в полученном плане не заметил внешнего соединения по PK (для using во втором варианте).

Staxдля меня более читаемий первый вариант
В какой-то степени это дело вкуса.
Но в условиях соединения иногда встречаются достаточно сложные выражения.
Кроме того, во втором варианте легко выполнить внутренний запрос, чтобы визуально проверить его правильность.
...
Рейтинг: 0 / 0
Есть ли разница, как делать соединение merge?
    #39760724
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Я выполнил explain plain для обоих вариантов, но в полученном плане не заметил внешнего соединения по PK (для using во втором варианте).


мож оракля что-то cоптимизировал (хотя я сомневаюсь)
имхо
должно появится два соединения аля
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
|   0 | MERGE STATEMENT
|   1 |  MERGE
|   2 |   VIEW
|*  3 |    HASH JOIN OUTER
|*  4 |     HASH JOIN OUTER
|   5 |      TABLE ACCESS FULL
|   6 |      TABLE ACCESS FULL
|   7 |     TABLE ACCESS FULL



.....
stax
...
Рейтинг: 0 / 0
Есть ли разница, как делать соединение merge?
    #39760731
MazoHist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во втором случае мы будем лишний раз читать tbl, не?
PS: зависит от объемов. На частой операции и больших объемах (репликация-самописка) в итоге отказались от merge в пользу forall insert save exceptions /update .
...
Рейтинг: 0 / 0
Есть ли разница, как делать соединение merge?
    #39760750
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MazoHistВо втором случае мы будем лишний раз читать tbl, не?
Да, вопрос как раз в том, насколько это трудоемко для сервера.
Поскольку используется PK, то возможно что оверхед совсем небольшой.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Есть ли разница, как делать соединение merge?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]