Всем привет.
Есть несколько огромных таблиц (кол-во строк от 150 000)
они связаны по полю типа int, некоторые по полю типа varchar
Нужна информация о правильном написании запросов с командой update
Как лучше апдейтить таблицы; связанные тыблицы; просто таблицы с уловиями where и т.д.
Последнее время появлялись множественные ошибки блокировок, зависание системы и прочее. Хотелось бы более грамотно писать коды.
Можно ссылки на поучительную информацию...
MSFT SQL Server - команда update: обновление больших объемов
-
rivera
Re: MSFT SQL Server - команда update: обновление больших объемов
Поясню на примере
Задача:
обновить всех мужчин в таблице продавцов (Sales)
Код:
Будет ли запрос выполняться быстрей при такой схеме
Код:
будет ли последний блок отрабатывает еще менее затратней по времени и ресурсам при такой схеме?
Код:
Задача:
обновить всех мужчин в таблице продавцов (Sales)
Код:
Код: Выделить всё
update Sales
Set Gender = 'M'
where LastName like '%ов'Будет ли запрос выполняться быстрей при такой схеме
Код:
Код: Выделить всё
--временная таблица
declare @Rows table (id int)
--выбираем все строки по ключевому полю записи которые будем обновлять:
--id первичный ключ, кластерный индекс в таблице Sales
insert into @Rows (id)
select id from Sales where LastName like '%ов'
--и теперь обновляем все записи, подставляя подзапрос
update Sales
set Set Gender = 'M'
where id in (select id from @Rows)будет ли последний блок отрабатывает еще менее затратней по времени и ресурсам при такой схеме?
Код:
Код: Выделить всё
--обновляем таблицу через комбинацию join
update sl
set Set Gender = 'M'
from Sales as a
join @Rows as b on a.id = b.id-
fomin_
Re: MSFT SQL Server - команда update: обновление больших объемов
rivera,
А в чем собственно проблема?
Посмотрите результат выполнения для каждого приведенного случая через execution plan
А в чем собственно проблема?
Посмотрите результат выполнения для каждого приведенного случая через execution plan
-
fomin_
Re: MSFT SQL Server - команда update: обновление больших объемов
для каждой таблицы каждый раз он будет разным, в зависимости от размера раблицы и индексов на нее.
мне же инетересна именно методика написания, которая будет универсальна для большинства таблиц.
ну типа, подзапросы всегда работаю быстрее и менее затратны чем join
или
по кластерному индексу всегда быстрей update происходит, нежели по подзапросу с выборкой произволному полю
и т.д.
мне же инетересна именно методика написания, которая будет универсальна для большинства таблиц.
ну типа, подзапросы всегда работаю быстрее и менее затратны чем join
или
по кластерному индексу всегда быстрей update происходит, нежели по подзапросу с выборкой произволному полю
и т.д.
-
Delirium
Re: MSFT SQL Server - команда update: обновление больших объемов
Цитата rivera:
where LastName like '%ов'
Вот такой запрос всегда будет работать медленней, чем условия вида a.id = b.id. Медленней потому, что оператор LIKE при поиске неизвестного количества символов в НАЧАЛЕ не сможет использовать индексацию данных. Поиск вида Like 'иван%' - уже будет быстрее.
В идеале всегда надо обновлять поля, используя ключевые поля (PK и FK), тогда и результат будет почти мгновенным.
Если же необходимо сделать, как в примере, то лучше писать не LIKE, а что то типа
Код:
Проверьте все варианты на одной и той же таблице и сравните планы выполнения. Результат будет виден сразу.
where LastName like '%ов'
MSFT SQL Server - команда update: обновление больших объемов
Вот такой запрос всегда будет работать медленней, чем условия вида a.id = b.id. Медленней потому, что оператор LIKE при поиске неизвестного количества символов в НАЧАЛЕ не сможет использовать индексацию данных. Поиск вида Like 'иван%' - уже будет быстрее.
В идеале всегда надо обновлять поля, используя ключевые поля (PK и FK), тогда и результат будет почти мгновенным.
Если же необходимо сделать, как в примере, то лучше писать не LIKE, а что то типа
Код:
Код: Выделить всё
where lower(Right(LastName, 2)) ='ов'.Проверьте все варианты на одной и той же таблице и сравните планы выполнения. Результат будет виден сразу.