sql: insert mit VALUES oder SET ?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Pischti
Beiträge: 417
Registriert: 20.02.2002 12:54:18
Wohnort: dresden

sql: insert mit VALUES oder SET ?

Beitrag von Pischti » 24.02.2005 12:54:04

hi,
hab eine performancefrage zu sql:
bei einem INSERT - welche variante ist schneller (wenn überhaupt ein unterschied)?

INSERT INTO tabelle (key1, key2, key3) VALUES ('wert1','wert2','wert3');
oder
INSERT INTO tabelle SET key1='wert1', key2='wert2', key3='wert3' ;

die zweite variante würde mir programmiertechnisch die arbeit erleichtern, dass ganze muss aber schnell sein ...
gruss pischti
debian stable

Benutzeravatar
HELLinG3R
Beiträge: 1328
Registriert: 15.04.2004 07:54:33

Beitrag von HELLinG3R » 24.02.2005 12:58:34

ich würde die zweite variante nehmen, wenn es dir leichter fällt.
Der Unterschied zwischen beiden Varianten sollte so minimal sein, dass sich das nur bei *wirklich* großen Datenbanken bemerkbar machen sollte und selbst dort nicht ausschlaggebend.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 24.02.2005 13:05:48

Es sollten beide Varianten gleich schnell sein.

Wenn du viele Datensätze insertieren möchtest, solltest du jedoch Hostvariablen verwenden. Das erspart dem DBMS das oftmalige parsen des Statements.
Wenn dein DBMS auch noch blockweises Insert unterstützt, ist das die schnellste Methode.

Benutzeravatar
Pischti
Beiträge: 417
Registriert: 20.02.2002 12:54:18
Wohnort: dresden

Beitrag von Pischti » 24.02.2005 13:27:54

jo, ich will viele datensätze INSERT-ten, ist für ein systemlog gedacht ...

was meinst du mit hostvariablen ?
gruss pischti
debian stable

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 24.02.2005 14:08:16

hier habe ich ein JDBC Beispiel:

Das Statement wird nur einmal "prepared", das Zeichen ? markiert eine sogenannte Hostvariable
Danach wird abwechselnd, diese Hostvariable mit einem Wert verknüpft und dann das Statement ausgeführt. Es werden in diesem Beispiel 4 Datensätze insertiert.
Auf der Clientseite ersparst du dir das oftmalige Zusammenstückeln des Statements (inclusive Typumwandlung) und das DBMS erspart sich das oftmalige Parsen des Statements.

Code: Alles auswählen

preparedStatement = connection.prepareStatement("INSERT INTO test2 (test1_id) VALUES(?)"); 
preparedStatement.setInt(1,v1.intValue()); 
preparedStatement.execute();
preparedStatement.setInt(1, v2.intValue()); 
preparedStatement.execute();
preparedStatement.setInt(1, v3.intValue()); 
preparedStatement.execute();
preparedStatement.setInt(1, v4.intValue()); 
preparedStatement.execute();
[edit]
? markiert jetzt eine Variable, die im Kontext des Hosts (=DBMS Server) verwendet wird.
d.h. der Name Hostvariable
[/edit]
Zuletzt geändert von gms am 24.02.2005 14:17:00, insgesamt 2-mal geändert.

Benutzeravatar
emge
Beiträge: 1525
Registriert: 20.10.2003 22:05:46
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: 50° 45' 0" N 12° 10' 0" E

Beitrag von emge » 24.02.2005 14:11:12

Hostvariablen, manchmal auch Bindevariablen genannt, sind ein Mechanismus, bei dem das Statement vorbereitet wird und bei jedem Insert nur die Werte ausgetauscht werden. Das Spart der DB-Engine eine Menge Arbeit.

Wie das in deinem Programm umgesetzt wird, kommt ganz auf die jeweilige Sprache an. Unter Java mit JDBC verwendet man z. B. dafür ein PreparedStatement-Objekt.

Grüße, Marco

Antworten