2017-08-14 2 views
0

Ich habe eine Tabelle mit 1 000 000 Datensätze:Wie kopiert man die Tabelle in eine andere Tabelle?

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 
)); 

Ich brauche das Feld sollte

[id] [int] IDENTITY(1,1) 

mit

[id] [bigint] IDENTITY(1,1) 

Aber alle Daten (einschließlich ID-Werte) zu ersetzen sein kopiert in die neue Tabelle und ID sollte IDENTITY aber Bigint sein.

Ich habe die neue Tabelle erstellt

CREATE TABLE [dbo].[x2_new](
    [session_id] [uniqueidentifier] NOT NULL, 
    [node_id] [uniqueidentifier] NOT NULL, 
    [id] [bigint] IDENTITY(1,1) NOT NULL, 
CONSTRAINT [PK_x2_new] PRIMARY KEY CLUSTERED 
(
    [id] ASC 
)); 

und versucht, Daten zu kopieren:

insert into x2_new(session_id,node_id,id) 
select session_id,node_id,id from x2; 

Aber es ist langsam. Wie kopiert man Daten schneller in die neue Tabelle?

+0

Definieren Sie langsam? Das Einfügen einer Million Datensätze in eine Tabelle, die indiziert wird, wird nicht so schnell sein wie eine, die nicht indiziert ist, natürlich – scsimon

+0

ja, aber auf der anderen Seite ist diese Abfrage in t1 aus t auswählen schneller als Einfügen in() select ... von. Aber ich kann es wegen Identitätsfeld nicht verwenden – Oleg

+0

Nun wäre ein schneller Weg, die Einschränkungen und Indizes fallen zu lassen und einfach den Typ der Tabellenspalte zu ändern. – scsimon

Antwort

0

In diesem Fall .. Sie ein tun müssen, um " identity_insert OFF 'an deinem Zielort und füge es mit deinem Skript ein ... versuche auch, NoLock zu setzen ... aber ist das eine einmalige Aktivität oder eine repetitive?

0

Wenn beide Tabellen in derselben databse sind, warum nicht verwenden Sie Daten importieren Task-Funktion, die Spalten auswählen und das SSIS-Paket sofort laufen ..

+0

Zumindest, weil ich endlich ein Skript brauche, das Clients zur Verfügung gestellt wird, die meine Datenbank benutzen. Sie sehen: Ich versuche, das Problem zu lösen int identity overflow, zu ersetzen int identity-> bigint identity – Oleg

+0

In diesem Fall .. Sie müssen eine ' identity_insert OFF ' an Ihrem Ziel und fügen Sie mit Ihrem Skript .. versuchen Sie NoLock setzen Auch und natürlich, Int int Bigint .. aber ist dies eine einmalige Aktivität oder eine Wiederholung? – HappieFeet

+0

Ja, es ist eine einmalige Operation. Der Grund ist: die Identität INT ist nicht genug, muss in Identität BIGINT konvertieren. Deshalb teste ich diese Operation auf meiner Datenbank und werde dann das Skript den Clients zur Verfügung stellen. – Oleg

Verwandte Themen