Wann ist BULK INSERT sinnvoll?

julia23

Mitglied
Hallo ihr Helfer-In-Der-Not,


ich würde gerne eine große Datenmenge aus einer SQL-Datenbank holen und sie dann wieder in eine SQL-Tabelle einfügen. Was kann ich machen um dies möglichst effizient zu gestalten? Hab bei meinen Internetrecherchen dann BULK INSERT entdeckt. Was ist hier genau der Unterschied zu einem einfachen Select-Insert?

Ich wäre für Vorschläge und Hinweisen zu leicht verständlichen Links sehr dankbar.

LG, Julia
 
Hi

Beliebige Daten einfügen geht auf jeden Fall immer mit einem normalen insert mit angegebene Werten für die Spalten (händisch eingegeben in irgendeine DB-Konsole oder per Programmcode eingefügt).

Wenn die Daten aus einer anderen DB-Tabelle kommen wäre es schon möglich, sie in einer Schleife
einzeln mit select abzufragen und einzufügen, nur ist das vergleichsweise langsam.
Deswegen gibt es die Möglichkeit mit dem insert-select.

Und wenn man die einzufügenden Daten in einer Datei auf der Festplatte hat (in einem bestimmten Format)...
wieder könnte man eine langsame Schleife machen, nur gibt es auch für den Fall schon fertige DB-Unterstützung,
die das Ganze effizient ausführt. Bei MS SQL Server heißt der Befehl dafür "Bulk Insert".
 
Hallo Julia

Was verwendest du denn als Quell- und Ziel-DBMS? Gibt es einen besonderen Grund, dass du die Frage im .NET Forum stellst?
 
Ich bin jetzt schon wieder weg von BULK INSERT, weil ich auf http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx lese:

"
// Open the destination connection. In the real world you would
// not use SqlBulkCopy to move data from one table to the other
// in the same database. This is for demonstration purposes only."

Oder habe ich da was falsch verstanden?

Als Quell und Ziel DBMS ist der Microsoft SQL Server.

Also ich will Daten aus einer Tabelle der selben Datenbank auslesen und in eine neue Tabelle einfügen.
z.B Will ich aus der Tabelle A wissen wieviele Teilnehmer an einer Vorlesung teilnehmen.
Und dann in neue Tabelle B einfügen. Da gibt es dann eine Spalte die heißt AnzahlDerTeilnehmer in der
die Werte eingefügt werden.

Select Count(*) from Teilnehmer...

Ich hoffe ich konnte das verständlich darlegen. Problem ist bei u.a, dass es sehr viele Abfragen sind und
sehr viele Daten...
 
Wie ich schon geschrieben habe brauchst du das Bulkinsert dafür nicht,
weil die Daten nicht aus irgendeiner Datei kommen.

Insert - select ist ok.
 
Ok, aber es gibt auch keine Vorschläge zur Optimierung der Effizienz bei solchen Vorgängen?
Das einzige was ich weiß ist, das ich geeignete Datentypen wählen kann um Speicherplatz zu sparen.
z.B Tinyint statt int...
 
Wenn die neue Tabelle Indexe hat: Lösch die und erstell sie nach dem Insert wieder.

Und für das Select gibts viel, aber da kann man ohne die konkrete Anweisung nichts auch nur Allgemeines sagen.
Indexe, sinnvolle Joins...
 
Zurück