Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> оптимизировать запрос mssql, оптимизировать запрос в тирегере 
:(
    Опции темы
lBugl
Дата 7.9.2010, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 18.8.2009

Репутация: нет
Всего: 2



идея примерно такая:
обновлять данные в таблице если они существуют и добавлять если нет (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 медленный)
PM MAIL   Вверх
Zloxa
Дата 7.9.2010, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



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

MERGE
Цитата(lBugl @  7.9.2010,  11:29 Найти цитируемый пост)
вроде слышал 

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


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
lBugl
Дата 7.9.2010, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 18.8.2009

Репутация: нет
Всего: 2



спасибо за предложение. почитал
переделал вот так:

Код

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
PM MAIL   Вверх
Zloxa
Дата 7.9.2010, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



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

вот поэтому.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
lBugl
Дата 7.9.2010, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 18.8.2009

Репутация: нет
Всего: 2



ну тогда вопрос прежний... 
можно ли оптимизировать код в 1-м посте? если да, жду совета или намёка =)
PM MAIL   Вверх
lBugl
Дата 8.9.2010, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 18.8.2009

Репутация: нет
Всего: 2



 вот этот подзапрос используется в обоих запросах
Код

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

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

зы: что б это не напоминало блог, я всё так делаю? =)
PM MAIL   Вверх
Zloxa
Дата 8.9.2010, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



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

Это сообщение отредактировал(а) Zloxa - 8.9.2010, 19:07


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
lBugl
Дата 9.9.2010, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 18.8.2009

Репутация: нет
Всего: 2



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

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

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

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

зы: в результате сделал временную таблицу, добавил индексы в базовую и код стал выполняться в 2-3 раза быстрее... причём существенную роль сыграла именно таблица, а не индексы. но наверное это конкретно мой случай
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0639 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.