MSSQL 2005 und sehr große Menge IF NOT EXSISTS INSERT

12/08/2008 - 12:23 von Klaus Mayer | Report spam
Hallo,

ich update eine Datenbank mittels IF NOT EXSISTS (...)... INSERT
INTO ..
Diese Statements werden von einem selbstgeschriebenen Programm
generiert und direkt an den Server übermittelt.
Die entsprechenden SQL-Tabellen sind bereits jeweils mit einem Index
über zwei ID's asugestattet, die Exsists-Anweisung vergleicht auch
mittels dieses Index und ich erreiche eine Vergleichsrate von ca. 220
Records pro Sekunde, wobei die SQL-DB in der jetzigen Testphase nur
auf einem XP-Client làuft.
Da ich aber insgesamt fast 40Mio Datensàtze vergleichen muß, ist mir
diese Rate noch zu gering.
Wie könnte ich die steigern? Ist es sinnvoll, nur die Daten an eine
Stored Procedure zu übergeben und von der den Rest erledigen zu
lassen?

Bin für jeden Tipp dankbar!

Schöne Grüße

Klaus
 

Lesen sie die antworten

#1 Michael Monarch
13/08/2008 - 15:21 | Warnen spam
"Klaus Mayer" wrote:

Hallo,

ich update eine Datenbank mittels IF NOT EXSISTS (...)... INSERT
INTO ..
Diese Statements werden von einem selbstgeschriebenen Programm
generiert und direkt an den Server übermittelt.
Die entsprechenden SQL-Tabellen sind bereits jeweils mit einem Index
über zwei ID's asugestattet, die Exsists-Anweisung vergleicht auch
mittels dieses Index und ich erreiche eine Vergleichsrate von ca. 220
Records pro Sekunde, wobei die SQL-DB in der jetzigen Testphase nur
auf einem XP-Client làuft.
Da ich aber insgesamt fast 40Mio Datensàtze vergleichen muß, ist mir
diese Rate noch zu gering.
Wie könnte ich die steigern? Ist es sinnvoll, nur die Daten an eine
Stored Procedure zu übergeben und von der den Rest erledigen zu
lassen?

Bin für jeden Tipp dankbar!

Schöne Grüße

Klaus




Servus Klaus,

ich gehe mal davon aus das nur 40 mio DS in der Zieltabelle sind und nicht
in der Quelltabelle.

Ich habe mit folgendem Ansatz sehr gute Performance erreicht, da ich eventl.
Logs durch andere Zugriffe aus dem Weg gehe. Die Datensàtze werden einzeln
geprüft und entsprechend rübergeschoben.

Angenommen in der Zieltab (ZT) sind 40 mio datensàtze und die Quelltab (QT)
hat 100.000

In der ZT ist das Feld Z_ID_E (art bigint) der eindeutige Index der als
Vergleicht mit der QT dient.

code SP
declare @SP_QT_ID as bigint

Declare Quelle Cursor for
SELECT id from QT

open Quelle

Fetch next from Quelle into @SP_QT_ID
While @@FETCH_STATUS=0
Begin

if (Select Count(*) from ZT where Z_ID_E
=@SP_QT_ID)=0
Begin
insert into ZT(Z_ID_E, usw )
select ID , usw ...
from QT
where ID=@SP_QT_ID
end
Fetch next from Quelle into @SP_QT_ID

end -- von while

close Quelle
DEALLOCATE Quelle

Ähnliche fragen