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

Откуда: Белокаменная
Сообщений: 260
есть таблица несколько пару сотен млн строк
в ней нужно делать много точечных обновлений полей не входящих в кластерный индекс
есть ли какой то способ делать это эффективнее чем обычным апдейтом?

может как-то заменить апдейт на инсерт + делит
что бы вместо обновления появлялась новая запись а старая становилась старой версией, которую можно было бы впоследствии удалить

но тогда удаление будет долгим
14 сен 16, 11:51    [19663118]     Ответить | Цитировать Сообщить модератору
 Re: быстрый апдейт большой таблицы  [new]
o-o
Guest
fduch f.f.
есть таблица несколько пару сотен млн строк
в ней нужно делать много точечных обновлений полей не входящих в кластерный индекс

в смысле, не входящих в ключ кластерного?
потому что нет полей, "не входящих в кластерный", у него же на листовом уровне все поля
---
а какая разница, вошли поля или нет в ключ кластерного,
интересует же входят ли поля из WHERE в ключ кластерного/любого другого индекса
14 сен 16, 12:01    [19663186]     Ответить | Цитировать Сообщить модератору
 Re: быстрый апдейт большой таблицы  [new]
fduch f.f.
Member

Откуда: Белокаменная
Сообщений: 260
o-o,

поля из where имеют некластерные индексы
14 сен 16, 12:05    [19663220]     Ответить | Цитировать Сообщить модератору
 Re: быстрый апдейт большой таблицы  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Вариантов мало:
апдейтить небольшими частями или даже по одной записи (циклом, курсором). При этом не будет удара по производительности и блокировок.
Да, будет медленно. Но все зависит от поставленных условий задачи.

Если апдейт связан с активными вычислениями (арифмерика, конвертации), то рационально сделать отдельную таблицу подобную целевой, проапдейтить ее, а затем накатить сделанные в ней изменения на целевую таблицу связав их по первичному ключу.
14 сен 16, 12:06    [19663226]     Ответить | Цитировать Сообщить модератору
 Re: быстрый апдейт большой таблицы  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
o-o,

автор
в смысле, не входящих в ключ кластерного?
потому что нет полей, "не входящих в кластерный", у него же на листовом уровне все поля

наверное имеется ввиду что ключ не изменится

быстрее чем update, del + insert не будет, потому что вы как раз тогда и начнёте насиловать кластерный индекс.
Лучше суть проблемы опишите, возможно у вас проблема в не кластерных индексах
14 сен 16, 12:08    [19663236]     Ответить | Цитировать Сообщить модератору
 Re: быстрый апдейт большой таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
LSV
не будет удара по производительности
LSV
будет медленно
Это не противоречие?
14 сен 16, 12:19    [19663319]     Ответить | Цитировать Сообщить модератору
 Re: быстрый апдейт большой таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8834
fduch f.f.,

исключите обновление полей переменной длины или преобразуйте эти поля, это несколько уменьшит время обновления за счет потребности выделения новых страниц. Отключите автоперерасчет статистик. Отключите и затем перестройте индексы (при больших объемах обновлений в одной транзакции, но у Вас малые объемы). Переместите журнал базы на быстрый диск, то же касается tempdb, если ее использует план запроса.

Вообщем при малых объемах проблемы могут быть только в ожидании снятия несовместимых типов блокировок.
15 сен 16, 10:11    [19667194]     Ответить | Цитировать Сообщить модератору
 Re: быстрый апдейт большой таблицы  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
iap
LSV
не будет удара по производительности
LSV
будет медленно
Это не противоречие?
Нет. Процесс обновления сильно растянется во времени, но будет малозаметен на фоне критичных задач. Не будет эскалаций блокировок и т.п.
15 сен 16, 11:08    [19667542]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить