Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / проверять ли наличие записи перед ее UPDATE / 17 сообщений из 17, страница 1 из 1
17.10.2005, 19:19
    #33329032
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверять ли наличие записи перед ее UPDATE
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
17.10.2005, 21:02
    #33329147
Ramin Hashimzade
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверять ли наличие записи перед ее UPDATE
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
17.10.2005, 22:37
    #33329234
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверять ли наличие записи перед ее UPDATE
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
17.10.2005, 23:00
    #33329264
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверять ли наличие записи перед ее UPDATE
По идее INSERT ON EXISTING UPDATE как раз и сделан для таких случаев.
...
Рейтинг: 0 / 0
17.10.2005, 23:01
    #33329265
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверять ли наличие записи перед ее UPDATE
Александр Гoлдун
Раз этот вопрос задается, значит он критичен. Если критичен, то в нужных
тебе условиях можно просто запустить оба варианта и сравнить. Если лень
- значит не критично.

)))) И как же есть на самом деле? Критично или нет?
А если серьезно, то экспериментировать в данное время достаточно сложно и долго, ибо собрать макет и воспроизвести рабочую нагрузку в течение длительного времени ради одного пунктика не вижу особого смысла. Проще спросить людей, вдруг кто-то уже проверял данный момент.
Если у кого-то возникнет какой-то спорный вопрос, который я проверял, я обязательно поделюсь своим опытом. На то тут и форум...
...
Рейтинг: 0 / 0
17.10.2005, 23:02
    #33329267
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверять ли наличие записи перед ее UPDATE
ASCRUSПо идее INSERT ON EXISTING UPDATE как раз и сделан для таких случаев.
Вся проблема в этом:
update t1
set data= data+var2
where pk=var;
...
Рейтинг: 0 / 0
18.10.2005, 14:08
    #33330448
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверять ли наличие записи перед ее UPDATE
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
18.10.2005, 15:42
    #33330878
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверять ли наличие записи перед ее UPDATE
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
18.10.2005, 16:44
    #33331120
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверять ли наличие записи перед ее UPDATE
SQL может все, если правильно готовить :) Я уже давно от циклов отошел, как только RowGenerator появилась в ASA - удобно и вкусно.
...
Рейтинг: 0 / 0
18.10.2005, 22:32
    #33331829
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверять ли наличие записи перед ее UPDATE
Второе. На одно чтение меньше.
...
Рейтинг: 0 / 0
19.10.2005, 00:54
    #33331899
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверять ли наличие записи перед ее UPDATE
Да, такой финт с джойном я и сам придумал)) И наткнулся на такой глюк, что
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
19.10.2005, 01:27
    #33331917
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверять ли наличие записи перед ее UPDATE
Lateral тут не виноват. Даже если его убрать получишь тоже самое. Похоже на глюк с dummy таблицей.
...
Рейтинг: 0 / 0
19.10.2005, 07:13
    #33331984
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверять ли наличие записи перед ее UPDATE
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
19.10.2005, 09:51
    #33332194
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверять ли наличие записи перед ее UPDATE
Кстати, производительность EXISTS здесь ни при чем.
Я предлагаю переименовать топик в "проверять ли наличие записи перед ее UPDATE". Но я не знаю, как это делать, если честно, и хотел посоветоваться с вами (о целесообразности переименования).

Да, кстати еще о теме -- хотел отметить, что это -- один из стандартных
трюков или финтов, которые предлагается делать во всех рекомендациях по повышению производительности, причем для всех серверов, поскольку тут особенно ничего специфичного для конкретной СУБД нет. Т.е. рекомендуется не проверять, а попытаться сделать UPDATE, и если он не нашел записи, сделать INSERT.
...
Рейтинг: 0 / 0
19.10.2005, 16:42
    #33333575
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверять ли наличие записи перед ее UPDATE
ASCRUSКстати LATERAL не только с Dummy работает как INNER JOIN, но и с обычными таблицами. Только не понятно - это правильное его поведение или баг.
А у меня с таблицами работает как outer, только с dummy(или его пустым аналогом) глючит. Да и в доках написано, что внешнее соединение это.
...
Рейтинг: 0 / 0
19.10.2005, 17:07
    #33333659
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверять ли наличие записи перед ее UPDATE
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
19.10.2005, 18:45
    #33333854
iLLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
проверять ли наличие записи перед ее UPDATE
ASCRUSБилд 3198.
Вот, а у меня 3182)))) Видимо они что-то зацепили.
Кстати, в этом же билде у меня бэкап подвисал. Выяснилось, что поскольку бэкап у меня идет 40 минут(база 40 гиг), то при наложении checkpointa на backup с указанными wait'ами в бэкапе они держат друг-друга неопределенное время.
А второй системный коннект с номером за 1000000000 как раз и есть checkpoint. Не в тему, но зато про этот билд)
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / проверять ли наличие записи перед ее UPDATE / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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