Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > оптимизировать запрос mssql


Автор: lBugl 7.9.2010, 11:29
идея примерно такая:
обновлять данные в таблице если они существуют и добавлять если нет (table1)

запрос:
Код

update table1
    
  set table1.kol = table1.kol + t2.kol 

  from table1 

  inner join (select kod_izd, sum(kol), ncw from vn2 where d_id in (select i_id from inserted where st = 0 and [if1] )group by kod_izd, ncw) as t2
    
  on table1.kod_izd = t2.kod_izd and table1.c = t2.ncw
                
    

insert into table1 (kod_izd, kol, c)
  select  t2.kod_izd, t2.kol, t2.ncw from (select kod_izd, sum(kol), ncw from vn2 where d_id in (select i_id from inserted where st = 0 and [if1]) )group by kod_izd, ncw) as t2
  left join table1 on table1.kod_izd = t2.kod_izd and table1.c = t2.ncw
    
  where table1.kod_izd is null and table1.c is null


как это можно оптимизировать? (вроде слышал что left join медленный)

Автор: Zloxa 7.9.2010, 11:45
Цитата(lBugl @  7.9.2010,  11:29 Найти цитируемый пост)
обновлять данные в таблице если они существуют и добавлять если нет

http://msdn.microsoft.com/ru-ru/library/bb510625(v=SQL.100).aspx
Цитата(lBugl @  7.9.2010,  11:29 Найти цитируемый пост)
вроде слышал 

 smile
А если попробовать попробовать, как оно ощущается?

Автор: lBugl 7.9.2010, 16:14
спасибо за предложение. почитал
переделал вот так:

Код

merge  table1 as Target
    
using (select kod_izd, sum(kol), ncw from vn2 where d_id in (select i_id from inserted where [if1])group by kod_izd, ncw) as Source(kod_izd, kol, ncw)

on (Target.kod_izd = Source.kod_izd and Target.color = Source.ncw)
    
when MATCHED then  update set Target.kol = Target.kol + Source.kol
    
when not MATCHED BY TARGET then insert (kod_izd, color, kol)  VALUES (Source.kod_izd, Source.ncw, Source.kol)


получаю такие ошибки:
Server: Msg 170, Level 15, State 1, Line 22

Line 22: Incorrect syntax near 'merge'.


Server: Msg 156, Level 15, State 1, Line 23

Incorrect syntax near the keyword 'as'.

а вот из-за чего уже не знаю...
зы: сервер ms sql server 2000

Автор: Zloxa 7.9.2010, 16:17
Цитата(lBugl @  7.9.2010,  16:14 Найти цитируемый пост)
сервер ms sql server 2000 

вот поэтому.

Автор: lBugl 7.9.2010, 16:20
ну тогда вопрос прежний... 
можно ли оптимизировать код в 1-м посте? если да, жду совета или намёка =)

Автор: lBugl 8.9.2010, 14:40
 вот этот подзапрос используется в обоих запросах
Код

select kod_izd, sum(kol), ncw from vn2 where d_id in (select i_id from inserted where st = 0 and [if1] )group by kod_izd, ncw

решил его вынести... почитал про курсоры, временные таблица наткнулся на тип table...
курсоры как понял медленней поэтому с ними даже не пробовал делать, а вот через временную таблицу и переменную время выполнения примерно одинаковое
правда вот для ВТ смог указать состовной pk, а для переменной типа table нет =\ мб это тоже бы повлияло на скорость.
делал вот так: 
alter table @tmp add primary key(t1, t2) //error
alter table #tmp add primary key(t1, t2) //good

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

зы: что б это не напоминало блог, я всё так делаю? =)

Автор: Zloxa 8.9.2010, 19:02
lBugl, с чего Вы вообще взяли, что приведенный вами фрагмент кода следует оптимизировать?
Ранее озвученные Вами предпосылки лишь подчеркивают сомнительность этой затеи.

Автор: lBugl 9.9.2010, 11:22
Цитата
lBugl, с чего Вы вообще взяли, что приведенный вами фрагмент кода следует оптимизировать?

фрагмент кода в посте перед вашим или в 1-м?
если в первом, то меня не устраивает его время выполнения: долго.
если в предпоследнем моём, то этот подзапрос встречается в обоих запросах и я подумал что было бы оптимальней если он просчитается один раз + затраты на таблицу...

Цитата
Ранее озвученные Вами предпосылки лишь подчеркивают сомнительность этой затеи.

какие предпосылки и какому коду мешают? =) немножко не понимаю

зы: в результате сделал временную таблицу, добавил индексы в базовую и код стал выполняться в 2-3 раза быстрее... причём существенную роль сыграла именно таблица, а не индексы. но наверное это конкретно мой случай

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)