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

Откуда:
Сообщений: 150
День добрый,
предположим есть 2 таблицы:
create table Target_table (
	key_field varchar(50),
	other_field nvarchar(10));

create table Source_table (
	key_field varchar(50) primary key,
	other_field nvarchar(10));

На первой стоит колоночный индекс, поле key_field НЕ уникальное. Есть некластеризованный индекс на поле key_field.
На второй стоит кластеризованный индекс на поле key_field.

Выполняю команду Merge, чтобы обновить данные в первой таблице из второй таблицы:
merge Tareget_table as Target
using (select key_field, other_field from Source_table) as Source
on (Target.key_field = Source.key_field)
when matched then update set Target.other_field = Source.other_field;

Проблема в том, что количество записей очень большое - миллионы. Команда может выполняться больше часа.
Есть ли способ ускорить это дело?

спасибо.
15 июн 17, 16:46    [20567681]     Ответить | Цитировать Сообщить модератору
 Re: Обновление нескольких миллионов строк - как бы запросик ускорить?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3663
Делать порциями, короткими транзакциями
15 июн 17, 16:51    [20567697]     Ответить | Цитировать Сообщить модератору
 Re: Обновление нескольких миллионов строк - как бы запросик ускорить?  [new]
dies irae
Member

Откуда:
Сообщений: 78
User2155,

а зачем merge, если только update используется?

update Tareget_table  set other_field = Source_table.other_field
from Tareget_table join Source_table  on Tareget_table.key_field = Source_table.key_field
where Tareget_table.other_field != Source_table.other_field


автор
поле key_field НЕ уникальное

а вот это нехорошо... в таблице должен быть первичный ключ
15 июн 17, 16:52    [20567700]     Ответить | Цитировать Сообщить модератору
 Re: Обновление нескольких миллионов строк - как бы запросик ускорить?  [new]
aleks2
Guest
User2155
День добрый,
предположим есть 2 таблицы:
create table Target_table (
	key_field varchar(50),
	other_field nvarchar(10));

create table Source_table (
	key_field varchar(50) primary key,
	other_field nvarchar(10));

На первой стоит колоночный индекс, поле key_field НЕ уникальное. Есть некластеризованный индекс на поле key_field.
На второй стоит кластеризованный индекс на поле key_field.

Выполняю команду Merge, чтобы обновить данные в первой таблице из второй таблицы:
merge Tareget_table as Target
using (select key_field, other_field from Source_table) as Source
on (Target.key_field = Source.key_field)
when matched then update set Target.other_field = Source.other_field;

Проблема в том, что количество записей очень большое - миллионы. Команда может выполняться больше часа.
Есть ли способ ускорить это дело?

спасибо.


merge Tareget_table as Target
using (select key_field, other_field from Source_table) as Source
on (Target.key_field = Source.key_field)
when matched and  Target.other_field <> Source.other_field then update set Target.other_field = Source.other_field;
15 июн 17, 16:57    [20567716]     Ответить | Цитировать Сообщить модератору
 Re: Обновление нескольких миллионов строк - как бы запросик ускорить?  [new]
User2155
Member

Откуда:
Сообщений: 150
dies irae,

Update быстрей будет?
15 июн 17, 16:59    [20567722]     Ответить | Цитировать Сообщить модератору
 Re: Обновление нескольких миллионов строк - как бы запросик ускорить?  [new]
LoopN
Guest
Пришлите план запроса
15 июн 17, 17:00    [20567728]     Ответить | Цитировать Сообщить модератору
 Re: Обновление нескольких миллионов строк - как бы запросик ускорить?  [new]
LoopN
Guest
aleks2 правильно написал, план не нужен
15 июн 17, 17:02    [20567737]     Ответить | Цитировать Сообщить модератору
 Re: Обновление нескольких миллионов строк - как бы запросик ускорить?  [new]
dies irae
Member

Откуда:
Сообщений: 78
User2155
dies irae,

Update быстрей будет?


быстрее вряд ли, но короче и читабельней. если конечно insert/delete не требуется
15 июн 17, 17:18    [20567799]     Ответить | Цитировать Сообщить модератору
 Re: Обновление нескольких миллионов строк - как бы запросик ускорить?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7651
User2155,

отключите индекс перед обновлением, затем сделайте rebuild. Архитектура обновления columnstore не слишком хороша для массовых операций. Поэтому-то и был дополнительный фильтр предложен.
15 июн 17, 18:06    [20568023]     Ответить | Цитировать Сообщить модератору
 Re: Обновление нескольких миллионов строк - как бы запросик ускорить?  [new]
User2155
Member

Откуда:
Сообщений: 150
Владислав Колосов,

ой, интересно. А можно ли отключить колоночный индекс? Что при этом будет с таблицей?
я думал что columnstore это способ хранения информации, и если это кластеризованный индекс то его отключить нельзя. Как при этом будут храниться данные?
16 июн 17, 09:24    [20569052]     Ответить | Цитировать Сообщить модератору
 Re: Обновление нескольких миллионов строк - как бы запросик ускорить?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7651
User2155,


в справке указано:

Ограничения индекса Columnstore
Не может быть изменен с помощью инструкции ALTER INDEX. Вместо этого удалите и заново создайте индекс columnstore. (Инструкцию ALTER INDEX можно использовать, чтобы отключить и перестроить индекс columnstore.)

Определите, что выгоднее по затратам времени.
16 июн 17, 11:51    [20569608]     Ответить | Цитировать Сообщить модератору
 Re: Обновление нескольких миллионов строк - как бы запросик ускорить?  [new]
aleks2
Guest
Владислав Колосов
User2155,

отключите индекс перед обновлением, затем сделайте rebuild. Архитектура обновления columnstore не слишком хороша для массовых операций. Поэтому-то и был дополнительный фильтр предложен.


Ваще то, дополнительный фильтр был предложен из более банальных (высших) соображений: нечего зря в журнал и данные писать.

ЗЫ. Бред "про индексы" - это бред и есть.
16 июн 17, 12:47    [20569825]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить