powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по MERGE
13 сообщений из 13, страница 1 из 1
Вопрос по MERGE
    #39394452
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем.

Оправдано ли для параметров в хранимой процедуре применение MERGE вместо UPDATE OR INSERT?
Ну, что-то типа такого:
Код: sql
1.
2.
3.
4.
5.
6.
7.
merge into SOME_TABLE as tbl
using ( select :PARAM_1 as KEY_FIELD,
               :PARAM_2 as FIELD_2,
               :PARAM_3 as FIELD_3
          from RDB$DATABASE ) as src
on ( tbl.KEY_FIELD = src.KEY_FIELD )
when not matched then ...



В MERGE в ветке WHEN MATCHED THEN можно исключить холостой апдейт ключевых полей. Что-то еще?

С уважением, Polesov.
...
Рейтинг: 0 / 0
Вопрос по MERGE
    #39394490
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

ключевые поля не надо апдейтить вовсе. А вот холостой апдейт неключевых полей можно исключить с помощью дополнительных условий в предложении WHEN MATCHED THEN, но только начиная с Firebird 3.0

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
merge into SOME_TABLE as tbl
using ( select :PARAM_1 as KEY_FIELD,
               :PARAM_2 as FIELD_2,
               :PARAM_3 as FIELD_3
          from RDB$DATABASE ) as src
on ( tbl.KEY_FIELD = src.KEY_FIELD )
when not matched then
  INSERT INTO (KEY_FIELD, FIELD_2, FIELD_3)
  VALUES (src.KEY_FIELD, src.FIELD_2, src.FIELD_3)
when matched and (tbl.FIELD_2 IS DISTINCT FROM src.FIELD_2 OR tbl.FIELD_3 IS DISTINCT FROM src.FIELD_3)  then 
  update set 
     FIELD_2 = src.FIELD_2,
     FIELD_3 = src.FIELD_3



можно пойти дальше и сделать несколько веток when matched
...
Рейтинг: 0 / 0
Вопрос по MERGE
    #39394504
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисключевые поля не надо апдейтить вовсе
Я имел ввиду апдейт ключевых полей при использовании UPDATE OR INSERT
...
Рейтинг: 0 / 0
Вопрос по MERGE
    #39394529
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PolesovЯ имел ввиду апдейт ключевых полей при использовании UPDATE OR INSERTА где там апдейт ключевых полей ?
...
Рейтинг: 0 / 0
Вопрос по MERGE
    #39394552
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PolesovОправдано ли для параметров в хранимой процедуре применение MERGE вместо UPDATE OR INSERT?

Нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вопрос по MERGE
    #39394555
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladА где там апдейт ключевых полей ?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
update or insert into SOME_TABLE (
    KEY_FIELD,
    FIELD_2,
    FIELD_3 )
values (
    :PARAM_1,
    :PARAM_2,
    :PARAM_3 )
matching ( KEY_FIELD )



Правильно ли я понимаю, что при использовании UPDATE OR INSERT в случае выполнения условия MATCHING апдейт поля KEY_FIELD производиться не будет?
...
Рейтинг: 0 / 0
Вопрос по MERGE
    #39394564
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PolesovПравильно ли я понимаю, что при использовании UPDATE OR INSERT в случае выполнения условия
MATCHING апдейт поля KEY_FIELD производиться не будет?

Атебенепох? Новая версия записи всё равно создаётся со всеми полями. Дельта-версия -
только из различий байт, она даже на поля не делит. В чём твой интерес?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вопрос по MERGE
    #39394568
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PolesovПравильно ли я понимаю, что при использовании UPDATE OR INSERT в случае выполнения условия MATCHING апдейт поля KEY_FIELD производиться не будет?По идее- не будет, но проверить не помешает.
С другой стороны - на что это влияет ?
...
Рейтинг: 0 / 0
Вопрос по MERGE
    #39394569
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovВ чём твой интерес?

Интерес - оптимизация по скорости.
Насколько я помню, апдейт ключевых полей вызывает пересчет индекса.
...
Рейтинг: 0 / 0
Вопрос по MERGE
    #39394570
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov, или холостой апдейт ключевого поля не вызывает пересчет индекса?
...
Рейтинг: 0 / 0
Вопрос по MERGE
    #39394578
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

если поле не меняется, то индекс тоже не меняется. И ключ тут пофигу.
Это не PG :)
...
Рейтинг: 0 / 0
Вопрос по MERGE
    #39394667
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, седлал небольшой тест:

Код: sql
1.
2.
3.
4.
5.
create table T (
    ID   integer not null,
    VAL  varchar(16),
    FIX  timestamp
);



В таблицу залил 1 млн записей. Далее 1 млн раз апдейтил одну и ту же запись:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
execute block
as
  declare variable CNT integer;
begin
  CNT = 0;
  while ( CNT < 1000000 ) do
  begin
    merge into T as tbl
    using ( select 777000 as ID,
                   'NEW FIELD VALUE!' as VAL
              from RDB$DATABASE ) as src
    on ( tbl.ID = src.ID )
    when not matched then
      insert ( VAL ) values ( src.VAL )
    when matched then
      update
         set VAL = src.VAL;
    CNT = :CNT + 1;
  end
end

Execute time = 6s 16ms


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
execute block
as
  declare variable CNT integer;
begin
  CNT = 0;
  while ( CNT < 1000000 ) do
  begin
    update or insert into T (
        ID,
        VAL )
    values (
        777000,
        'NEW FIELD VALUE!' )
    matching ( ID );

    CNT = :CNT + 1;
  end
end

Execute time = 5s 437ms


Получается, MERGE несколько медленее, чем UPDATE OR INSERT

P.S. Все манипуляции производил в IBE
...
Рейтинг: 0 / 0
Вопрос по MERGE
    #39394719
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

ясен пень ты же фетчи дополнительные из RDB$DATABASE делаешь
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по MERGE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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