Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Vpsem Member Откуда: Киев Сообщений: 54 |
Есть задача по переливке большой таблицы (>10млрд). Не секрет что SELECT INTO работает быстрее чем INSERT INTO, однако проблема в том, что таблица источник содержит поле timestamp которое на получателе должно быть таким же по счету (5й столбец, например). При этом сами значения поля timestamp не принципиальны, пусть будут такими какаими их сервер сосчитатет. Опробованные варианты: SELECT INTO - быстро, но без поля.. INSERT INTO - медленно SSIS - медленно BCP - время умножается на 2 и нет места для полной выгрузки. Как сказать серверу что при выполнении SELECT INTO необходимо еще фиксировать timestamp? |
16 ноя 17, 18:01 [20961150] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37198 |
insert into + tablock работает так же быстро, как и select into, если таблица пуста. Читайте про минимальное протоколирование. Сообщение было отредактировано: 16 ноя 17, 18:08 |
16 ноя 17, 18:07 [20961185] Ответить | Цитировать Сообщить модератору |
Andy_OLAP Member Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион Сообщений: 3151 |
Версию сервера напишите? "SELECT INTO - быстро, но без поля" - это как? if OBJECT_ID('tempdb..#test_test') is not null drop table #test_test create table #test_test (column1 int not null, column2 timestamp, column3 int not null ) insert into #test_test (column1,column3) select 1,2 union all select 3,4 select * from #test_test -- это удивительно, но timestamp скопировался и он второй столбец по счету -- как и в исходной таблице select * into #test_test_copy from #test_test select * from #test_test_copy if OBJECT_ID('tempdb..#test_test') is not null drop table #test_test if OBJECT_ID('tempdb..#test_test_copy') is not null drop table #test_test_copy |
||
16 ноя 17, 18:17 [20961224] Ответить | Цитировать Сообщить модератору |
Vpsem Member Откуда: Киев Сообщений: 54 |
Microsoft SQL Server 2016 (SP1-CU5) В вашем примере использован INSERT INTO в ранее созданную таблицу. При использовании команды SELECT INTO поле timestamp получить не получается.. Сравниваю инструкции, отпишу: INSERT INTO new_table WITH(tablock) (перечень полей без timestamp) SELECT (перечень полей без timestamp) FROM old_table SELECT (перечень полей без timestamp) INTO new_table FROM old_table |
||
17 ноя 17, 11:00 [20962727] Ответить | Цитировать Сообщить модератору |
Andy_OLAP Member Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион Сообщений: 3151 |
У меня пример как раз select * into новая таблица. У Вас на сервере мой пример не отрабатывает? Не вставляется столбец timestamp? |
||
17 ноя 17, 11:20 [20962804] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
Vpsem,SELECT 1 as [a], CAST(NULL as timestamp) as [b] INTO #Temp |
17 ноя 17, 12:11 [20963092] Ответить | Цитировать Сообщить модератору |
Vpsem Member Откуда: Киев Сообщений: 54 |
Да, недоглядел, все работает. Удивительно что и значения timestamp сохраняются!
Ваш пример тоже то что нужно! При этом значение timestamp в новой таблице 0x |
||||
17 ноя 17, 12:37 [20963217] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
я так понимаю, что такое timestamp вы вообще не понимаете.... |
||||||
17 ноя 17, 12:41 [20963230] Ответить | Цитировать Сообщить модератору |
Vpsem Member Откуда: Киев Сообщений: 54 |
[quot TaPaKя так понимаю, что такое timestamp вы вообще не понимаете....[/quot] |
17 ноя 17, 13:03 [20963304] Ответить | Цитировать Сообщить модератору |
Vpsem Member Откуда: Киев Сообщений: 54 |
Понимаю это так: SELECT 1 as [a], CAST(NULL as timestamp) as [b] INTO #Temp select * from #Temp --a b --1 0x update #Temp set a = 2 select * from #Temp --a b --2 0x00000000000A1463 |
||
17 ноя 17, 13:05 [20963309] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |