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

Откуда: Чебаркуль
Сообщений: 3673
Есть таблица

CREATE TABLE [dbo].[x2](
	[session_id] [uniqueidentifier] NOT NULL,
	[node_id] [uniqueidentifier] NOT NULL,
	[id] [int] IDENTITY(1,1) NOT NULL,
 CONSTRAINT [PK_x2] PRIMARY KEY CLUSTERED 
(
	[id] ASC
));


в ней 1 млн записей.
Надо создать рядом такую же, скопировать данные, но чтобы поле [id] [int] IDENTITY стало [id] [bigint] IDENTITY?

Сделать типа select .. into from.... не вижу как, поле ид получается не идентити.

А так, создать новую и затем
insert into x22 ...
select .. from x2

получается не быстро.
14 авг 17, 18:27    [20723037]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36905
http://lmgtfy.com/?q=select into identity
14 авг 17, 18:29    [20723042]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3673
Гавриленко Сергей Алексеевич
http://lmgtfy.com/?q=select into identity


спасибо, воспользовался анимацией. Но там не нашел ответа.
Мне надо не добавить новое поле с идентити, мне надо скопировать таблицу в новую, но чтобы значения поля идентити скопировались.
Цель этой карусели - вместо int identity мне надо получить в новой таблице bigint identity .
А значения на скопировать.
14 авг 17, 18:35    [20723057]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36905
Сделать новую таблицу нужной структуры и перелить туда данные с identity insert. select into -- это не единственный вариант получить минимально протоколирование вставки.
14 авг 17, 18:38    [20723063]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3673
Гавриленко Сергей Алексеевич
Сделать новую таблицу нужной структуры и перелить туда данные с identity insert. select into -- это не единственный вариант получить минимально протоколирование вставки.


делаю так, но работает медленно.
Как можно ускорить?
14 авг 17, 18:42    [20723074]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36905
https://technet.microsoft.com/en-us/library/ms191244(v=sql.105).aspx?f=255&MSPPError=-2147217396
14 авг 17, 18:44    [20723078]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
KRS544
Member

Откуда:
Сообщений: 497
А долго - это сколько?
14 авг 17, 18:54    [20723102]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3673
KRS544
А долго - это сколько?


уже второй час работает скрипт, но это не устроит.
Таких похожих таблиц еще 6, и юзерские нервы не выдержат
14 авг 17, 19:05    [20723133]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Я похоже не уловлю, в чем закавыка, но что мешает просто:

SELECT
    ID=CAST(ID AS BIGINT),
    ... перечисляем другие поля ...
INTO NewTable
FROM OldTable


?
14 авг 17, 19:17    [20723159]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36905
В том, что поле id не будет identity.

Сообщение было отредактировано: 14 авг 17, 19:18
14 авг 17, 19:18    [20723161]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
для FROM таблицы еще WITH (NOLOCK) добавить
14 авг 17, 19:18    [20723162]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Гавриленко Сергей Алексеевич
тем, что поле id не будет identity.

А потом через ALTER TABLE накатить ему IDENTITY
14 авг 17, 19:19    [20723164]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3673
Yuri Abele
Гавриленко Сергей Алексеевич
тем, что поле id не будет identity.

А потом через ALTER TABLE накатить ему IDENTITY


а это можно сделать для существующей таблицы с данными через ALTER TABLE?
14 авг 17, 19:21    [20723171]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3673
Yuri Abele
для FROM таблицы еще WITH (NOLOCK) добавить


да, это используется
14 авг 17, 19:21    [20723175]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36905
Yuri Abele
Гавриленко Сергей Алексеевич
тем, что поле id не будет identity.

А потом через ALTER TABLE накатить ему IDENTITY
А мужики-то не знали.
14 авг 17, 19:23    [20723180]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Гавриленко Сергей Алексеевич
Yuri Abele
пропущено...

А потом через ALTER TABLE накатить ему IDENTITY
А мужики-то не знали.

Хотя про IDENTITY не уверен - сейчас проверю
14 авг 17, 19:25    [20723185]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Yuri Abele
Гавриленко Сергей Алексеевич
пропущено...
А мужики-то не знали.

Хотя про IDENTITY не уверен - сейчас проверю

Не, нельзя. Простите - поторопился. Сейчас еще подумаю.
14 авг 17, 19:27    [20723192]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3673
Yuri Abele
Yuri Abele
пропущено...

Хотя про IDENTITY не уверен - сейчас проверю

Не, нельзя. Простите - поторопился. Сейчас еще подумаю.


Спасибо, Юра, а то я уже хотел начать проверять ;-)
14 авг 17, 19:29    [20723201]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Вот что точно можно, это:
- создать пустую новую таблицу с IDENTITY полем.
- отключить IDENTITY
- через
INSERT INTO NewTable WITH (NOLOCK) SELECT * FROM OldTable WITH (NOLOCK)
закачать данные
- активировать IDENTITY и переназначить ему новое стартовое IDENTITY значение
14 авг 17, 19:30    [20723203]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
SET IDENTITY_INSERT NewTable ON;

INSERT INTO NewTable WITH (NOLOCK) SELECT * FROM OldTable WITH (NOLOCK);

DBCC CHECKIDENT(Table_Name, RESEED, <новое стартовое значение>);

SET IDENTITY_INSERT NewTable OFF;


как-то так ...
14 авг 17, 19:34    [20723217]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3673
Yuri Abele
Вот что точно можно, это:
- создать пустую новую таблицу с IDENTITY полем.
- отключить IDENTITY
- через
INSERT INTO NewTable WITH (NOLOCK) SELECT * FROM OldTable WITH (NOLOCK)
закачать данные
- активировать IDENTITY и переназначить ему новое стартовое IDENTITY значение


Да, собственно, так и делаю, получается не быстро, потому и задал вопрос.
14 авг 17, 19:34    [20723219]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Еще SET NOCOUNT ON; но даст не много
14 авг 17, 19:38    [20723231]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3673
Yuri Abele
Еще SET NOCOUNT ON; но даст не много


ок, но хотелось бы чего-то кардинально быстрого
Я там ошибся в первом сообщении, в реальной базе в сумме по 6 таблицам надо скопировать больше 1 млрд записей, в первой таблице их под 600 000 000
14 авг 17, 19:41    [20723245]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
ну тогда только BULK INSERT. Как? - есть варианты.
Самое простое?
1. Выгрузить через BCP все в текстовый файл
bcp OldTable out OldTable.CSV –c -T

2. Загрузить обратно:
bcp NewTable in OldTable.CSV -T –c
14 авг 17, 19:45    [20723251]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро скопировать таблицу в той же базе?  [new]
invm
Member

Откуда: Москва
Сообщений: 9279
Ролг Хупин
Yuri Abele
Вот что точно можно, это:
- создать пустую новую таблицу с IDENTITY полем.
- отключить IDENTITY
- через
INSERT INTO NewTable WITH (NOLOCK) SELECT * FROM OldTable WITH (NOLOCK)
закачать данные
- активировать IDENTITY и переназначить ему новое стартовое IDENTITY значение


Да, собственно, так и делаю, получается не быстро, потому и задал вопрос.
Что, серьезно считаете, что NOLOCK как-то повлияет на целевую таблицу?

1. Если модель восстановления FULL, то перевести в BULK_LOGGED. Как правильно переключать - https://technet.microsoft.com/ru-ru/library/ms190203(v=sql.105).aspx
2. Копируем данные с минимальным журналированием
INSERT INTO NewTable WITH (TABLOCK) SELECT * FROM OldTable
3. Переводим обратно в FULL. если требуется.

ЗЫ: Вышеперечисленное справедливо для 2008 и старше.
14 авг 17, 19:51    [20723262]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить