powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / проверять ли наличие записи перед ее UPDATE
17 сообщений из 17, страница 1 из 1
проверять ли наличие записи перед ее UPDATE
    #33329032
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASA9.0.2
С точки зрения произовдительности, как лучше делать:
Код: plaintext
1.
2.
3.
4.
5.
6.
if exists(select  1  from t1 where pk=var) then
   update t1
   set data=data+var2
   where pk=var;
else
   insert into t1 values(var,var2);
end if

или

Код: plaintext
1.
2.
3.
4.
5.
update t1
set data=data+var2
where pk=var;
if @@rowcount= 0  then
   insert into t1 values(var,var2);
end if;
?
Даже не так, "не как лучше делать", а будет ли первый вариант тормознее второго?
...
Рейтинг: 0 / 0
проверять ли наличие записи перед ее UPDATE
    #33329147
Фотография Ramin Hashimzade
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLerASA9.0.2
С точки зрения произовдительности, как лучше делать:
Код: plaintext
1.
2.
3.
4.
5.
6.
if exists(select  1  from t1 where pk=var) then
   update t1
   set data=data+var2
   where pk=var;
else
   insert into t1 values(var,var2);
end if

или

Код: plaintext
1.
2.
3.
4.
5.
update t1
set data=data+var2
where pk=var;
if @@rowcount= 0  then
   insert into t1 values(var,var2);
end if;
?
Даже не так, "не как лучше делать", а будет ли первый вариант тормознее второго?
в первом варианте если запис есть тогда сервер ехесуте 2 запроса если нету тогда 1 запрос... а во втором сервер сервер ехесуте 1 запрос если апдейт не прошел успешно тогда добавит новый запис....
суди сам...
...
Рейтинг: 0 / 0
проверять ли наличие записи перед ее UPDATE
    #33329234
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLer пишет:

> С точки зрения произовдительности, как лучше делать:

Раз этот вопрос задается, значит он критичен. Если критичен, то в нужных
тебе условиях можно просто запустить оба варианта и сравнить. Если лень
- значит не критично.

Еще вариант:

update t1 set data=data+var2
where pk=var;

insert into t1
ON EXISTING SKIP
values(var,var2);
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
проверять ли наличие записи перед ее UPDATE
    #33329264
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По идее INSERT ON EXISTING UPDATE как раз и сделан для таких случаев.
...
Рейтинг: 0 / 0
проверять ли наличие записи перед ее UPDATE
    #33329265
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Гoлдун
Раз этот вопрос задается, значит он критичен. Если критичен, то в нужных
тебе условиях можно просто запустить оба варианта и сравнить. Если лень
- значит не критично.

)))) И как же есть на самом деле? Критично или нет?
А если серьезно, то экспериментировать в данное время достаточно сложно и долго, ибо собрать макет и воспроизвести рабочую нагрузку в течение длительного времени ради одного пунктика не вижу особого смысла. Проще спросить людей, вдруг кто-то уже проверял данный момент.
Если у кого-то возникнет какой-то спорный вопрос, который я проверял, я обязательно поделюсь своим опытом. На то тут и форум...
...
Рейтинг: 0 / 0
проверять ли наличие записи перед ее UPDATE
    #33329267
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSПо идее INSERT ON EXISTING UPDATE как раз и сделан для таких случаев.
Вся проблема в этом:
update t1
set data= data+var2
where pk=var;
...
Рейтинг: 0 / 0
проверять ли наличие записи перед ее UPDATE
    #33330448
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLer ASCRUSПо идее INSERT ON EXISTING UPDATE как раз и сделан для таких случаев.
Вся проблема в этом:
update t1
set data= data+var2
where pk=var;
Не вижу здесь проблемы:
Код: plaintext
1.
2.
3.
insert into t1 (pk, data) on existing update
  select var, var2 + IsNull(t1.data,  0 )
  from dummy
    left join t1 on t1.pk = var;
...
Рейтинг: 0 / 0
проверять ли наличие записи перед ее UPDATE
    #33330878
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS пишет:

> Не вижу здесь проблемы:
>
> insert into t1 (pk, data) on existing update
> select var, var2 + IsNull(t1.data, 0)
> from dummy
> left join t1 on t1.pk = var;

В FAQ сей шедевр. Я не додумался до такого ;)
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
проверять ли наличие записи перед ее UPDATE
    #33331120
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL может все, если правильно готовить :) Я уже давно от циклов отошел, как только RowGenerator появилась в ASA - удобно и вкусно.
...
Рейтинг: 0 / 0
проверять ли наличие записи перед ее UPDATE
    #33331829
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Второе. На одно чтение меньше.
...
Рейтинг: 0 / 0
проверять ли наличие записи перед ее UPDATE
    #33331899
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, такой финт с джойном я и сам придумал)) И наткнулся на такой глюк, что
lateral с dummy работает не как outer а как inner!!!
Т.е. вот это:
select *
from (select 1000) as v(k),lateral(select data from aaa where id=k) as vv(g)
выдает пустой набор, если в таблице aaa нет записи, у которой id=1000. С
dummy та же бодяга. А должен выдать по-любому хотя бы одну запись!


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
проверять ли наличие записи перед ее UPDATE
    #33331917
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lateral тут не виноват. Даже если его убрать получишь тоже самое. Похоже на глюк с dummy таблицей.
...
Рейтинг: 0 / 0
проверять ли наличие записи перед ее UPDATE
    #33331984
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLer
Да, такой финт с джойном я и сам придумал)) И наткнулся на такой глюк, что
lateral с dummy работает не как outer а как inner!!!
Т.е. вот это:
select *
from (select 1000) as v(k),lateral(select data from aaa where id=k) as vv(g)
выдает пустой набор, если в таблице aaa нет записи, у которой id=1000. С
dummy та же бодяга. А должен выдать по-любому хотя бы одну запись!


Posted via ActualForum NNTP Server 1.3
А зачем LATERAL, когда через LEFT JOIN в моем примере все замечательно работает ?

P.S. Кстати LATERAL не только с Dummy работает как INNER JOIN, но и с обычными таблицами. Только не понятно - это правильное его поведение или баг.
...
Рейтинг: 0 / 0
проверять ли наличие записи перед ее UPDATE
    #33332194
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, производительность EXISTS здесь ни при чем.
Я предлагаю переименовать топик в "проверять ли наличие записи перед ее UPDATE". Но я не знаю, как это делать, если честно, и хотел посоветоваться с вами (о целесообразности переименования).

Да, кстати еще о теме -- хотел отметить, что это -- один из стандартных
трюков или финтов, которые предлагается делать во всех рекомендациях по повышению производительности, причем для всех серверов, поскольку тут особенно ничего специфичного для конкретной СУБД нет. Т.е. рекомендуется не проверять, а попытаться сделать UPDATE, и если он не нашел записи, сделать INSERT.
...
Рейтинг: 0 / 0
проверять ли наличие записи перед ее UPDATE
    #33333575
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSКстати LATERAL не только с Dummy работает как INNER JOIN, но и с обычными таблицами. Только не понятно - это правильное его поведение или баг.
А у меня с таблицами работает как outer, только с dummy(или его пустым аналогом) глючит. Да и в доках написано, что внешнее соединение это.
...
Рейтинг: 0 / 0
проверять ли наличие записи перед ее UPDATE
    #33333659
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLer ASCRUSКстати LATERAL не только с Dummy работает как INNER JOIN, но и с обычными таблицами. Только не понятно - это правильное его поведение или баг.
А у меня с таблицами работает как outer, только с dummy(или его пустым аналогом) глючит. Да и в доках написано, что внешнее соединение это.
Код: plaintext
1.
2.
3.
4.
5.
SELECT *
FROM t1,
  LATERAL(
    SELECT *
    FROM t1 AS t2
    WHERE t2.pk = t1.pk +  1 );
если у нас в таблице 2 записи с pk 1 и 2 - то этот запрос вернет только запись с id=1 и в плане запросов будет стоять t1 INNER JOIN t2. Билд 3198. На ранних билдах LATERAL действительно работал как OUTER, сейчас не понятно, как на самом деле он работает, хотя по BOL действительно должен стоять как OUTER.
...
Рейтинг: 0 / 0
проверять ли наличие записи перед ее UPDATE
    #33333854
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSБилд 3198.
Вот, а у меня 3182)))) Видимо они что-то зацепили.
Кстати, в этом же билде у меня бэкап подвисал. Выяснилось, что поскольку бэкап у меня идет 40 минут(база 40 гиг), то при наложении checkpointa на backup с указанными wait'ами в бэкапе они держат друг-друга неопределенное время.
А второй системный коннект с номером за 1000000000 как раз и есть checkpoint. Не в тему, но зато про этот билд)
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / проверять ли наличие записи перед ее UPDATE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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