/ / Effizienzhilfe beim Einfügen und Löschen von Zeilen aus einer großen DB-Tabelle ~ 100M Zeilen - tsql, sybase

Effizienzhilfe beim Einfügen und Löschen von Zeilen aus einer großen DB-Tabelle ~ 100M rows - tsql, sybase

Ich füge Zeilen aus einer großen DB-Tabelle in eine Archivtabelle ein und lösche dann die eingefügten Zeilen. Mein Code lautet wie folgt:

-- insert here
insert into DEST_DB.dbo.ARCHIVE_TABLE
select SRC_DB.dbo.ORIG_TABLE.*
from SRC_DB.dbo.ORIG_TABLE
where SRC_DB.dbo.ORIG_TABLE.ORDER_ID
IN ( select #tmp_table.order_id from #tmp_table )

-- delete here
delete from SRC_DB.dbo.ORIG_TABLE
where SRC_DB.dbo.ORIG_TABLE.ORDER_ID
IN ( select #tmp_table.order_id from #tmp_table )

Die grosse von #tmp_table.order_id Die Tabelle ist derzeit auf 10 KByte Zeilen festgelegt, und die temporäre Tabelle wird in einer Schleife gefüllt und gelöscht. Dies bedeutet, dass sie für meine Einfüge- und Löschvorgänge in jeder Schleifeniteration verwendet wird.

ich habe UNIQUE UNCLUSTERED Indizes für die ORDER_ID-Spalte für meine SRC_DB.dbo.ORIG_TABLE

Mein Problem ist, wenn ich meine gespeicherte Prozedur ausprobiere, scheint sie beim Verarbeiten dieser Tabelle anzuhalten.

Ich verstehe, dass ich möglicherweise nicht die effizientesten Lösungen habe, und würde gerne Kritik und Vorschläge dazu hören, wie ich meine gespeicherte Prozedur verbessern kann.

Vielen Dank

Antworten:

1 für die Antwort № 1

Ich würde versuchen, eine PK auf #tmp_table und den Countdown fallen zu lassen

insert into DEST_DB.dbo.ARCHIVE_TABLE
select SRC_DB.dbo.ORIG_TABLE.*
from SRC_DB.dbo.ORIG_TABLE
join #tmp_table on #tmp_table.order_id = SRC_DB.dbo.ORIG_TABLE.order_id
order by clustered index on DEST_DB.dbo.ARCHIVE_TABLE

delete SRC_DB.dbo.ORIG_TABLE
join #tmp_table on #tmp_table.order_id = SRC_DB.dbo.ORIG_TABLE.order_id

1 für die Antwort № 2

Die gespeicherte Prozedur führt den von Ihnen angegebenen Code aus.

Ist das "es scheint nur anzuhalten, wenn diese Tabelle verarbeitet wird", dass Sie dieses SP nie fertiggestellt haben - es ist so langsam?

Versuchen Sie es mit einer kleineren Anzahl von # tmp_table.order_id - 100 oder 1000 Zeilen.

Versuchen Sie, die WHERE-Klausel folgendermaßen zu ändern:

-- insert here
insert into DEST_DB.dbo.ARCHIVE_TABLE
select SRC_DB.dbo.ORIG_TABLE.*
from SRC_DB.dbo.ORIG_TABLE
where exists
( select #tmp_table.order_id from #tmp_table where #tmp_table.order_id=SRC_DB.dbo.ORIG_TABLE.ORDER_ID)

-- delete here
delete from SRC_DB.dbo.ORIG_TABLE
where exists
( select #tmp_table.order_id from #tmp_table where SRC_DB.dbo.ORIG_TABLE.ORDER_ID=#tmp_table.order_id)