Показать полную графическую версию : команда update: обновление больших объемов
Всем привет.
Есть несколько огромных таблиц (кол-во строк от 150 000)
они связаны по полю типа int, некоторые по полю типа varchar
Нужна информация о правильном написании запросов с командой update
Как лучше апдейтить таблицы; связанные тыблицы; просто таблицы с уловиями where и т.д.
Последнее время появлялись множественные ошибки блокировок, зависание системы и прочее. Хотелось бы более грамотно писать коды.
Можно ссылки на поучительную информацию...
Поясню на примере
Задача:
обновить всех мужчин в таблице продавцов (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
rivera,
А в чем собственно проблема?
Посмотрите результат выполнения для каждого приведенного случая через execution plan
для каждой таблицы каждый раз он будет разным, в зависимости от размера раблицы и индексов на нее.
мне же инетересна именно методика написания, которая будет универсальна для большинства таблиц.
ну типа, подзапросы всегда работаю быстрее и менее затратны чем join
или
по кластерному индексу всегда быстрей update происходит, нежели по подзапросу с выборкой произволному полю
и т.д.
Delirium
10-02-2010, 01:56
where LastName like '%ов' »
Вот такой запрос всегда будет работать медленней, чем условия вида a.id = b.id. Медленней потому, что оператор LIKE при поиске неизвестного количества символов в НАЧАЛЕ не сможет использовать индексацию данных. Поиск вида Like 'иван%' - уже будет быстрее.
В идеале всегда надо обновлять поля, используя ключевые поля (PK и FK), тогда и результат будет почти мгновенным.
Если же необходимо сделать, как в примере, то лучше писать не LIKE, а что то типа
where lower(Right(LastName, 2)) ='ов'.
Проверьте все варианты на одной и той же таблице и сравните планы выполнения. Результат будет виден сразу.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC