Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как перелить данные командой SELECT INTO и получить в новой таблице поле timestamp?  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Как перелить данные командой SELECT INTO и получить в новой таблице поле timestamp?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36686
insert into + tablock работает так же быстро, как и select into, если таблица пуста.
Читайте про минимальное протоколирование.

Сообщение было отредактировано: 16 ноя 17, 18:08
16 ноя 17, 18:07    [20961185]     Ответить | Цитировать Сообщить модератору
 Re: Как перелить данные командой SELECT INTO и получить в новой таблице поле timestamp?  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Vpsem
Есть задача по переливке большой таблицы (>10млрд).
Не секрет что SELECT INTO работает быстрее чем INSERT INTO, однако проблема в том, что таблица источник содержит поле timestamp которое на получателе должно быть таким же по счету (5й столбец, например). При этом сами значения поля timestamp не принципиальны, пусть будут такими какаими их сервер сосчитатет.

Опробованные варианты:
SELECT INTO - быстро, но без поля..
INSERT INTO - медленно
SSIS - медленно
BCP - время умножается на 2 и нет места для полной выгрузки.

Как сказать серверу что при выполнении SELECT INTO необходимо еще фиксировать timestamp?

Версию сервера напишите? "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]     Ответить | Цитировать Сообщить модератору
 Re: Как перелить данные командой SELECT INTO и получить в новой таблице поле timestamp?  [new]
Vpsem
Member

Откуда: Киев
Сообщений: 54
Andy_OLAP
Версию сервера напишите? "SELECT INTO - быстро, но без поля" - это как?

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]     Ответить | Цитировать Сообщить модератору
 Re: Как перелить данные командой SELECT INTO и получить в новой таблице поле timestamp?  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Vpsem
В вашем примере использован INSERT INTO в ранее созданную таблицу.
При использовании команды SELECT INTO поле timestamp получить не получается..

У меня пример как раз select * into новая таблица.
У Вас на сервере мой пример не отрабатывает? Не вставляется столбец timestamp?
17 ноя 17, 11:20    [20962804]     Ответить | Цитировать Сообщить модератору
 Re: Как перелить данные командой SELECT INTO и получить в новой таблице поле timestamp?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Vpsem,

SELECT 1 as [a], CAST(NULL as timestamp) as [b]
INTO #Temp
17 ноя 17, 12:11    [20963092]     Ответить | Цитировать Сообщить модератору
 Re: Как перелить данные командой SELECT INTO и получить в новой таблице поле timestamp?  [new]
Vpsem
Member

Откуда: Киев
Сообщений: 54
Andy_OLAP
У меня пример как раз select * into новая таблица.
У Вас на сервере мой пример не отрабатывает? Не вставляется столбец timestamp?

Да, недоглядел, все работает. Удивительно что и значения timestamp сохраняются!

TaPaK
SELECT 1 as [a], CAST(NULL as timestamp) as [b]
INTO #Temp


Ваш пример тоже то что нужно! При этом значение timestamp в новой таблице 0x
17 ноя 17, 12:37    [20963217]     Ответить | Цитировать Сообщить модератору
 Re: Как перелить данные командой SELECT INTO и получить в новой таблице поле timestamp?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Vpsem
Andy_OLAP
У меня пример как раз select * into новая таблица.
У Вас на сервере мой пример не отрабатывает? Не вставляется столбец timestamp?

Да, недоглядел, все работает. Удивительно что и значения timestamp сохраняются!

TaPaK
SELECT 1 as [a], CAST(NULL as timestamp) as [b]
INTO #Temp


Ваш пример тоже то что нужно! При этом значение timestamp в новой таблице 0x

я так понимаю, что такое timestamp вы вообще не понимаете....
17 ноя 17, 12:41    [20963230]     Ответить | Цитировать Сообщить модератору
 Re: Как перелить данные командой SELECT INTO и получить в новой таблице поле timestamp?  [new]
Vpsem
Member

Откуда: Киев
Сообщений: 54
[quot TaPaKя так понимаю, что такое timestamp вы вообще не понимаете....[/quot]
17 ноя 17, 13:03    [20963304]     Ответить | Цитировать Сообщить модератору
 Re: Как перелить данные командой SELECT INTO и получить в новой таблице поле timestamp?  [new]
Vpsem
Member

Откуда: Киев
Сообщений: 54
TaPaK
так понимаю, что такое timestamp вы вообще не понимаете....

Понимаю это так:
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 Ответить