2014-05-29 2 views
0

Предположим, у меня есть таблицы перекодировки mylookup (lkid, lkname, ...)Как повысить производительность для оператора обновления?

Тогда у меня есть другие 2 таблицы:

mytab(id, parentid, name, lookname, ...) 
yourtab(id, parentid, ...) --id, parentid coming from mytab 

Тогда я попробовать обновление, чтобы получить lkid и его родителей lkid, sql like:

update yourtab set columnx = 
    case 
    when (select lkid from mylookup a join mytab b on a.lkname = b.lkname where b.id = c.parentid) > 3 
     and (select lkid from mylookup a join mytab b on a.lkname = b.lkname where b.id = c.parentid) > 
      (select lkid from mylookup where lkname = c.lkname) 
    then 1 
    else 0 
    end 
    from yourtab c 

этот продукт не работает. (выберите lkid из mylookup, присоедините mytab b к a.lkname = b.lkname, где b.id = c.parentid) вызывается 2 раза для каждой строки в вашем тбайте.

как переписать sql для повышения производительности для этого случая?

+0

Вы используете этот запрос в магазине прок? , если да, вы можете поместить его в переменную temp и использовать ее при условии. –

+0

Как установить переменную temp? он отличается для каждой строки. – KentZhou

ответ

0

Может быть что-то вроде этого ..

Это непроверенных бы нужно SQLFiddle с некоторыми образцами данных, чтобы действительно понять внутреннюю работу.

Update yourtab set columnx = 
case when not null (
    SELECT lkid 
    FROM mylookup a 
    INNER join mytab b 
    on a.lkname = b.lkname 
    WHERE b.id = c.parentid 
    and a.lkid > 3 
    and a.lkname > c.lkname) then 1 
    else 0 
end 
FROM yourtab c 
+0

изменить его как: update yourtab установить columnx = 1 из yourtab, где не null (...) – KentZhou

0
update yourtab 
    set columnx = 1 
    FROM yourtab c 
    join mylookup a 
    on a.lkname > c.lkname 
    and a.lkid > 3 
    join mytab b 
    on a.lkname = b.lkname 
    and b.id = c.parentid 
where columnx <> 1 


update yourtab 
    set columnx = 0 
    FROM yourtab c 
    left join mylookup a 
    on a.lkname > c.lkname 
    and a.lkid > 3 
    left join mytab b 
    on a.lkname = b.lkname 
    and b.id = c.parentid 
where columnx <> 0 
    and (a.lkname is null or b.id is null) 

Два заявления, но сейвы принимает блокировку, если значение уже правильно

Смежные вопросы