Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Оптимизация запроса на обновление  [new]
M0us
Member

Откуда: Moscow
Сообщений: 883
есть запрос на обновление.
в табличке tTest нужно у всех записей поставить SubjectID, соответствующее SubjectName='неизвестно' из справочника tSubject

UPDATE tTest
SET SubjectID=(SELECT SubjectID FROM tSubject WHERE SubjectName='неизвестно')
FROM tTest Ts
INNER JOIN tSubject Sb ON Ts.SubjectID=Sb.SubjectID
WHERE Sb.SubjectName<>'неизвестно'


как сделать этоже самое но без использования подзапросов?
3 июн 05, 16:37    [1595821]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса на обновление  [new]
ChA
Member

Откуда: Москва
Сообщений: 11126
M0us
как сделать этоже самое но без использования подзапросов?
А зачем ? В чем оптимизация-то ? План смотрели ?
3 июн 05, 16:40    [1595836]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса на обновление  [new]
Alexander Popov
Member

Откуда:
Сообщений: 663
Если таблицы tTest и tSubject никак не связаны то зачем их свзявать в Update'у ??
3 июн 05, 16:46    [1595864]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса на обновление  [new]
M0us
Member

Откуда: Moscow
Сообщений: 883
план смотрел все пучком, но если выполнять так, то в плане при начальном отборе участвуют не 3, а 2 таблицы.

UPDATE tTest
SET SubjectID=1
FROM tTest Ts
INNER JOIN tSubject Sb ON Ts.SubjectID=Sb.SubjectID
WHERE Sb.SubjectName<>'неизвестно'

вот я и думаю - можно ли еще как-то оптимизировать...
3 июн 05, 16:49    [1595875]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса на обновление  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
чой-то я не понял логику изменения
3 июн 05, 16:49    [1595880]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса на обновление  [new]
M0us
Member

Откуда: Moscow
Сообщений: 883
Alexander Popov
Если таблицы tTest и tSubject никак не связаны то зачем их свзявать в Update'у ??

я пытаюсь отобрать те записи в tTest у которых SubjectID<>... tSubject.SubjectName='неизвестно'...

надеюсь правильно объяснил (только путанно :)
3 июн 05, 16:51    [1595889]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса на обновление  [new]
M0us
Member

Откуда: Moscow
Сообщений: 883
LexusR
чой-то я не понял логику изменения

это я просто для примера привел...
3 июн 05, 16:51    [1595898]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса на обновление  [new]
Glory
Member

Откуда:
Сообщений: 104760
SET @x=(SELECT SubjectID FROM tSubject WHERE SubjectName='неизвестно')

UPDATE tTest
SET SubjectID=@x
FROM tTest Ts
INNER JOIN tSubject Sb ON Ts.SubjectID=Sb.SubjectID
WHERE Sb.SubjectName<>'неизвестно'
3 июн 05, 16:51    [1595899]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса на обновление  [new]
ChA
Member

Откуда: Москва
Сообщений: 11126
M0us
план смотрел все пучком, но если выполнять так, то в плане при начальном отборе участвуют не 3, а 2 таблицы.
Ну посудите логически, 1. нужно получить SubjectID FROM tSubject WHERE SubjectName='неизвестно'
2. нужно получить SubjectID FROM tSubject WHERE SubjectName<>'неизвестно'
3. обновить tTest

P.S.Хотелось бы глянуть на "пучок" :)
3 июн 05, 16:53    [1595909]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса на обновление  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
to Glory
а так не тоже самое

SET @x=(SELECT SubjectID FROM tSubject WHERE SubjectName='неизвестно')

UPDATE tTest
SET SubjectID=@x
3 июн 05, 16:55    [1595922]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса на обновление  [new]
M0us
Member

Откуда: Moscow
Сообщений: 883
ChA
M0us
план смотрел все пучком, но если выполнять так, то в плане при начальном отборе участвуют не 3, а 2 таблицы.
Ну посудите логически, 1. нужно получить SubjectID FROM tSubject WHERE SubjectName='неизвестно'
2. нужно получить SubjectID FROM tSubject WHERE SubjectName<>'неизвестно'
3. обновить tTest

P.S.Хотелось бы глянуть на "пучок" :)


принтскрин что-ли надо?
3 июн 05, 16:56    [1595925]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса на обновление  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
ну или чтобы меньше записей менять
SET @x=(SELECT SubjectID FROM tSubject WHERE SubjectName='неизвестно')

UPDATE tTest
SET SubjectID=@x
where SubjectID<>@x
3 июн 05, 16:57    [1595929]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса на обновление  [new]
Glory
Member

Откуда:
Сообщений: 104760
LexusR
to Glory
а так не тоже самое

SET @x=(SELECT SubjectID FROM tSubject WHERE SubjectName='неизвестно')

UPDATE tTest
SET SubjectID=@x

Да нет - вроде не тоже самое. Там = а там <>
3 июн 05, 16:57    [1595930]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса на обновление  [new]
Alexander Popov
Member

Откуда:
Сообщений: 663
(SELECT SubjectID FROM tSubject WHERE SubjectName='неизвестно')
это может возврашать несколько значений и какое значение каким будет заменено в вашем Update не понятно.

Скорее всего вот что вам нужно:
Update  tTest
     Set  SubjectID=S.SubjectID 
    from  tTest Ts, tSubject Sb
  where  Ts.SubjectID=Sb.SubjectID
     AND  Sb.SubjectName<>'неизвестно'
3 июн 05, 16:58    [1595935]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса на обновление  [new]
M0us
Member

Откуда: Moscow
Сообщений: 883
давайте итог подведем чтобы впустую не болтать.

без подзапроса не обойтись и оптимизировать ничего не надо. ТАК?
3 июн 05, 16:58    [1595936]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса на обновление  [new]
M0us
Member

Откуда: Moscow
Сообщений: 883
'неизвестно' в справочнике в единственном экземпляре.

Update tTest
Set SubjectID=Sb.SubjectID
from tTest Ts, tSubject Sb
where Ts.SubjectID=Sb.SubjectID
AND Sb.SubjectName<>'неизвестно'

это не работает...
3 июн 05, 17:02    [1595955]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса на обновление  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
чой-то я или заработался или чегой-то не понимаю
M0us
в табличке tTest нужно у всех записей поставить SubjectID, соответствующее SubjectName='неизвестно' из справочника tSubject

раз это справочник - запись 'неизвестно' - одна
раз проапдейтить все записи то напрашивается просто
UPDATE tTest
  SET SubjectID=(SELECT SubjectID FROM tSubject WHERE SubjectName='неизвестно')
 
или как у Glory c переменной но без всяких условий
3 июн 05, 17:03    [1595962]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса на обновление  [new]
M0us
Member

Откуда: Moscow
Сообщений: 883
LexusR
ну или чтобы меньше записей менять
SET @x=(SELECT SubjectID FROM tSubject WHERE SubjectName='неизвестно')

UPDATE tTest
SET SubjectID=@x
where SubjectID<>@x


да, наверно у Glory и LexusR самое прикольно-оптимальное получилось.

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

всем спасибо.

тема закрыта :)
3 июн 05, 17:05    [1595973]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса на обновление  [new]
Alexander Popov
Member

Откуда:
Сообщений: 663
Сорри не заметил разницу в знаках.

вот еще что можно попробовать, или оставить вариант Glory.
Update tTest
Set SubjectID=Sb.SubjectID 
from tTest Ts
inner join tSubject Sb on Ts.SubjectID=Sb.SubjectID 
 and Sb.SubjectName='неизвестно'
where Sb.SubjectName<>'неизвестно'
3 июн 05, 17:10    [1595994]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса на обновление  [new]
ChA
Member

Откуда: Москва
Сообщений: 11126
M0us
лоховские подзапросы использую...
Wow, надо запомнить...
3 июн 05, 17:11    [1595995]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса на обновление  [new]
M0us
Member

Откуда: Moscow
Сообщений: 883
Alexander Popov
Сорри не заметил разницу в знаках.

вот еще что можно попробовать, или оставить вариант Glory.
Update tTest
Set SubjectID=Sb.SubjectID 
from tTest Ts
inner join tSubject Sb on Ts.SubjectID=Sb.SubjectID 
 and Sb.SubjectName='неизвестно'
where Sb.SubjectName<>'неизвестно'


это неработает...
3 июн 05, 17:22    [1596035]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить