Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   команда update: обновление больших объемов (http://forum.oszone.net/showthread.php?t=166825)

rivera 09-02-2010 15:14 1343054

команда update: обновление больших объемов
 
Всем привет.

Есть несколько огромных таблиц (кол-во строк от 150 000)
они связаны по полю типа int, некоторые по полю типа varchar

Нужна информация о правильном написании запросов с командой update

Как лучше апдейтить таблицы; связанные тыблицы; просто таблицы с уловиями where и т.д.

Последнее время появлялись множественные ошибки блокировок, зависание системы и прочее. Хотелось бы более грамотно писать коды.
Можно ссылки на поучительную информацию...

rivera 09-02-2010 15:30 1343075

Поясню на примере
Задача:
обновить всех мужчин в таблице продавцов (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_ 09-02-2010 17:14 1343200

rivera,
А в чем собственно проблема?
Посмотрите результат выполнения для каждого приведенного случая через execution plan

rivera 09-02-2010 18:01 1343232

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

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

Delirium 10-02-2010 01:56 1343546

Цитата:

Цитата rivera
where LastName like '%ов' »

Вот такой запрос всегда будет работать медленней, чем условия вида a.id = b.id. Медленней потому, что оператор LIKE при поиске неизвестного количества символов в НАЧАЛЕ не сможет использовать индексацию данных. Поиск вида Like 'иван%' - уже будет быстрее.
В идеале всегда надо обновлять поля, используя ключевые поля (PK и FK), тогда и результат будет почти мгновенным.
Если же необходимо сделать, как в примере, то лучше писать не LIKE, а что то типа
Код:

where lower(Right(LastName, 2)) ='ов'.
Проверьте все варианты на одной и той же таблице и сравните планы выполнения. Результат будет виден сразу.


Время: 10:00.

Время: 10:00.
© OSzone.net 2001-