Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
Ролг Хупин Member Откуда: Чебаркуль Сообщений: 3990 |
Делать порциями, короткими транзакциями |
15 июн 17, 16:51 [20567697] Ответить | Цитировать Сообщить модератору |
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
а вот это нехорошо... в таблице должен быть первичный ключ |
||
15 июн 17, 16:52 [20567700] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
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] Ответить | Цитировать Сообщить модератору |
User2155 Member Откуда: Сообщений: 150 |
dies irae, Update быстрей будет? |
15 июн 17, 16:59 [20567722] Ответить | Цитировать Сообщить модератору |
LoopN
Guest |
Пришлите план запроса |
15 июн 17, 17:00 [20567728] Ответить | Цитировать Сообщить модератору |
LoopN
Guest |
aleks2 правильно написал, план не нужен |
15 июн 17, 17:02 [20567737] Ответить | Цитировать Сообщить модератору |
dies irae Member Откуда: Сообщений: 78 |
быстрее вряд ли, но короче и читабельней. если конечно insert/delete не требуется |
||
15 июн 17, 17:18 [20567799] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8353 |
User2155, отключите индекс перед обновлением, затем сделайте rebuild. Архитектура обновления columnstore не слишком хороша для массовых операций. Поэтому-то и был дополнительный фильтр предложен. |
15 июн 17, 18:06 [20568023] Ответить | Цитировать Сообщить модератору |
User2155 Member Откуда: Сообщений: 150 |
Владислав Колосов, ой, интересно. А можно ли отключить колоночный индекс? Что при этом будет с таблицей? я думал что columnstore это способ хранения информации, и если это кластеризованный индекс то его отключить нельзя. Как при этом будут храниться данные? |
16 июн 17, 09:24 [20569052] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8353 |
User2155, в справке указано: Ограничения индекса Columnstore Не может быть изменен с помощью инструкции ALTER INDEX. Вместо этого удалите и заново создайте индекс columnstore. (Инструкцию ALTER INDEX можно использовать, чтобы отключить и перестроить индекс columnstore.) Определите, что выгоднее по затратам времени. |
16 июн 17, 11:51 [20569608] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Ваще то, дополнительный фильтр был предложен из более банальных (высших) соображений: нечего зря в журнал и данные писать. ЗЫ. Бред "про индексы" - это бред и есть. |
||
16 июн 17, 12:47 [20569825] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |