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

Откуда:
Сообщений: 375
В десяток таблиц фактов потребовалось добавить поле (ссылка на id другой таблицы, связь один-ко-многим), которое нужно заполнить значениями. И построить по этому полю индекс.

Сначала нужно записать эти id'шники (примерно 10-я часть всех записей из т.фактов), остальные приравнять единице.
Т.е. примерно так:
update Facts
set TId= t2.id
from Table2 as t2
where ...

go

update Facts
set TId = 1
where TId is NULL

go


В каждой т.фактов примерно по 10млн записей.
Если сначала сделать индекс, а потом апдейтить, то будет очень долго, т.к. будет заполняться индекс.
Но если сначала проапдейтить, то без индекса будет долго выполняться второй апдейт (где идет поиск is NULL).
Как лучше сделать апдейт?
10 янв 12, 22:50    [11881759]     Ответить | Цитировать Сообщить модератору
 Re: большой update и индексы  [new]
Voice2001
Member

Откуда:
Сообщений: 375
ps. MS SQL 2000
10 янв 12, 22:51    [11881767]     Ответить | Цитировать Сообщить модератору
 Re: большой update и индексы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Сначала апдейт, потом индекс. Апдейт можно делать порциями.

Апдейт такой:

update a set
  TId = isnull(b.id, 1)
from Facts a
left join Table2 b on ...
10 янв 12, 23:05    [11881820]     Ответить | Цитировать Сообщить модератору
 Re: большой update и индексы  [new]
Voice2001
Member

Откуда:
Сообщений: 375
а еще при добавлении поля сделал дефолтовое значение равное 1. Тогда отпадает надобность во втором апдейте
10 янв 12, 23:37    [11881936]     Ответить | Цитировать Сообщить модератору
 Re: большой update и индексы  [new]
Voice2001
Member

Откуда:
Сообщений: 375
Гавриленко Сергей Алексеевич
Апдейт можно делать порциями

а порционность что дает?
10 янв 12, 23:40    [11881943]     Ответить | Цитировать Сообщить модератору
 Re: большой update и индексы  [new]
edyaN
Member

Откуда: Berlin
Сообщений: 185
Voice2001
Гавриленко Сергей Алексеевич
Апдейт можно делать порциями

а порционность что дает?

если модель восстановления простая, то лог файл возможно не будет увеличиваться.
ну и если понадобится отмена обновления, то она будет происходить быстрее.
Интерактивность повышается :)
11 янв 12, 12:22    [11883939]     Ответить | Цитировать Сообщить модератору
 Re: большой update и индексы  [new]
гость11111
Guest
автор
Но если сначала проапдейтить, то без индекса будет долго выполняться второй апдейт (где идет поиск is NULL).

не будет. у вас же 90% записей нулл останутся. толку от индекса?
11 янв 12, 12:28    [11883986]     Ответить | Цитировать Сообщить модератору
 Re: большой update и индексы  [new]
Voice2001
Member

Откуда:
Сообщений: 375
гость11111
не будет. у вас же 90% записей нулл останутся. толку от индекса?

учитывая, что дефолтовым значением я сделал единицу, нуллов нет и проблема отпала.
Но если бы я этого не делал и 90% записей имели НУЛЛ в этом поле, получается, что долго было бы и с индексом, и без?
11 янв 12, 19:30    [11888130]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить