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

Откуда:
Сообщений: 116
Есть вьюшка X, в которой 3 млн. записей.
Есть таблица Y, в которой 2.7 млн. записей.
Делаю следующий update:
UPDATE Y SET 
[NAME] = X.[NAME_PRICES]  
,[SEARCHABLE_CONTENT] = PRICES1.SEARCHABLE_CONTENT1
FROM Y 
INNER JOIN X ON X.XML_ID = Y.XML_ID 

Выполняется уже больше 20 часов и до сих пор еще работает, и неизвестно, когда закончит.
Вопрос: как можно выполнить то же самое иначе оптимально?
25 май 13, 13:04    [14348831]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE вместе с JOIN слишком долго выполняется, необходима оптимизация  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
Если не висит на блокировках, показывайте план и структуру таблиц с индексами.
25 май 13, 13:11    [14348842]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE вместе с JOIN слишком долго выполняется, необходима оптимизация  [new]
okwell5
Member

Откуда:
Сообщений: 116
okwell5,
Поправка, вот такой update:
UPDATE Y SET 
[NAME] = X.[NAME_PRICES]  
,[SEARCH] = X.SEARCH1
FROM Y 
INNER JOIN X ON X.XML_ID = Y.XML_ID 
25 май 13, 13:11    [14348843]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE вместе с JOIN слишком долго выполняется, необходима оптимизация  [new]
okwell5
Member

Откуда:
Сообщений: 116
okwell5,
мда, написал в общем. Но если просите структуру, тогда напишу истинные названия объектов.
Только как посмотреть план выполнения?
25 май 13, 13:17    [14348858]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE вместе с JOIN слишком долго выполняется, необходима оптимизация  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
okwell5
Только как посмотреть план выполнения?
https://www.sql.ru/faq/faq_topic.aspx?fid=393
Выкладывайте действительный план.
25 май 13, 13:26    [14348875]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE вместе с JOIN слишком долго выполняется, необходима оптимизация  [new]
okwell5
Member

Откуда:
Сообщений: 116
invm,
Слишком громоздко, поэтому прилагаю два файла: структуры и план предварительный. Фактический план не показывается.

К сообщению приложен файл (ДолгийUpdate1.sql - 9Kb) cкачать
25 май 13, 13:49    [14348900]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE вместе с JOIN слишком долго выполняется, необходима оптимизация  [new]
okwell5
Member

Откуда:
Сообщений: 116
okwell5, И предварительный план:

К сообщению приложен файл (ПланируемыйПланUpdate1.xls - 16Kb) cкачать
25 май 13, 13:49    [14348902]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE вместе с JOIN слишком долго выполняется, необходима оптимизация  [new]
okwell5
Member

Откуда:
Сообщений: 116
Все, я сам нашел решение: добавил перед джойном HASH:
UPDATE Y SET
[NAME] = X.[NAME_PRICES]
,[SEARCH] = X.SEARCH1
FROM Y
INNER HASH JOIN X ON X.XML_ID = Y.XML_ID
Результат: отработало меньше чем за 3 минуты. Супер!
25 май 13, 16:23    [14349163]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE вместе с JOIN слишком долго выполняется, необходима оптимизация  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
okwell5,

Y.[NAME] <> X.[NAME_PRICES] или ,[SEARCH] <> X.[SEARCH1]
для всех записей, да?
То есть, может, есть записи, которые и апдейтить-то не надо?
Сколько таких в процентах от общего количества?
25 май 13, 16:45    [14349193]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE вместе с JOIN слишком долго выполняется, необходима оптимизация  [new]
okwell5
Member

Откуда:
Сообщений: 116
iap
okwell5,

Y.[NAME] <> X.[NAME_PRICES] или ,[SEARCH] <> X.[SEARCH1]
для всех записей, да?
То есть, может, есть записи, которые и апдейтить-то не надо?
Сколько таких в процентах от общего количества?

Да, совершенно верно! Добавил к условию джойна еще это условие:
Y.[NAME] <> X.[NAME_PRICES]
В итоге проапдейтилось 16 тыс. строк, время: 15 секунд.
Второе условие [SEARCH] <> X.[SEARCH1] не подставляется из-за ошибки неприменимости типов text и nvarchar в условиях джойна.
25 май 13, 18:05    [14349313]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE вместе с JOIN слишком долго выполняется, необходима оптимизация  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
okwell5,

какой ещё text? Какая версия сервера? Почему юникоду ставится в соответствие не-юникод?
Надо заменить text на nvarchar(max).
После joinа я бы написал
WHERE NOT EXISTS(SELECT Y.[NAME],Y.[SEARCH] INTERSECT SELECT X.[NAME_PRICES],X.[SEARCH1])
Это автоматически учитывает значения NULL в отличие от сравнения операторами <>
25 май 13, 18:13    [14349329]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE вместе с JOIN слишком долго выполняется, необходима оптимизация  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
okwell5,

Вообще, я бы на Вашем месте подумал, а зачем там вообще BLOB?
Может, NVARCHAR(4000) достаточно?

И как же можно наложить ограничение на Y.[NAME], выкинув ограничение на Y.[SEARCH]?
Это же независимые поля. Почему Y.[SEARCH] надо апдейтить только при изменении поля Y.[NAME]?
25 май 13, 18:48    [14349408]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE вместе с JOIN слишком долго выполняется, необходима оптимизация  [new]
okwell5
Member

Откуда:
Сообщений: 116
iap
okwell5,

Вообще, я бы на Вашем месте подумал, а зачем там вообще BLOB?
Может, NVARCHAR(4000) достаточно?

И как же можно наложить ограничение на Y.[NAME], выкинув ограничение на Y.[SEARCH]?
Это же независимые поля. Почему Y.[SEARCH] надо апдейтить только при изменении поля Y.[NAME]?

Я бы, конечно, привел типы данных к одному varchar(4000), но менять структуру таблиц нельзя, т.к. таблица Х принадлежит 1С-ке, и неизвестно, как себя поведет платформа. А таблица Y Принадлежит битриксу, и последствия изменений тоже неизвестны.
Насчет наложения ограничений: да, согласен; оказывается нельзя накладывать ограничения по одному полю, не учитывая другое, поэтому пока кроме слова HASH в своем апдэйте ничего добавить нельзя.
25 май 13, 19:07    [14349457]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить