Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » MSFT SQL Server - команда update: обновление больших объемов

Ответить
Настройки темы
MSFT SQL Server - команда update: обновление больших объемов

Аватара для rivera

Ветеран


Сообщения: 661
Благодарности: 10

Профиль | Отправить PM | Цитировать


Всем привет.

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

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

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

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

-------
...


Отправлено: 15:14, 09-02-2010

 

Аватара для rivera

Ветеран


Сообщения: 661
Благодарности: 10

Профиль | Отправить PM | Цитировать


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

-------
...


Отправлено: 15:30, 09-02-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Пользователь


Сообщения: 140
Благодарности: 14

Профиль | Отправить PM | Цитировать


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

Отправлено: 17:14, 09-02-2010 | #3


Аватара для rivera

Ветеран


Сообщения: 661
Благодарности: 10

Профиль | Отправить PM | Цитировать


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

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

-------
...


Отправлено: 18:01, 09-02-2010 | #4


Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


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

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)


Отправлено: 01:56, 10-02-2010 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » MSFT SQL Server - команда update: обновление больших объемов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Загрузка - Обновление Windows Vista HP SP1 до SP2 из Windows Update SAOPP Microsoft Windows Vista 52 24-02-2010 13:04
Установка - [решено] После установки SP3 не работает Windows Update и автоматическое обновление Excaliburg Microsoft Windows 2000/XP 11 09-10-2008 20:50
Стабильность работы so-dimm разных объемов и производителей Igor Urievich Материнские платы и память 2 23-07-2008 11:42
Разное - Копирование больших объемов в Vista Ult 32 Awes Microsoft Windows Vista 5 21-08-2007 19:02
Обработка больших объемов информации ProcInf Программирование и базы данных 2 11-06-2007 13:10




 
Переход