AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Schnellste Insert Möglichkeit für eine DB?
Thema durchsuchen
Ansicht
Themen-Optionen

Schnellste Insert Möglichkeit für eine DB?

Ein Thema von moelski · begonnen am 2. Mär 2010 · letzter Beitrag vom 9. Mär 2010
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#11

Re: Schnellste Insert Möglichkeit für eine DB?

  Alt 2. Mär 2010, 13:56
Moin !

Ah ok. So habe das mal angepasst mit erstaunlichem Ergebnis
Count : 1000
1 Time : 12093 ms
2 Time : 9156 ms
3 Time : 6015 ms

Also nochmals deutlich schneller bei 1000 Datensätzen.

Das war jetzt alles auf Basis des Firebird Servers (2.5).
werde jetzt mal embedded testen und schaun ob das noch schneller geht?!
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#12

Re: Schnellste Insert Möglichkeit für eine DB?

  Alt 2. Mär 2010, 14:06
Moin !

So wenn ich das ganze embedded laufen lasse ändert sich nicht viel.

Count : 1000
1 Time : 6968 ms
2 Time : 6781 ms
3 Time : 4656 ms

Es ist zwar etwas schneller als auf dem Server, aber nicht wirklich gravierend.


Jetzt könnte man noch testen ob es etwas bringt wenn man mehrere INSERT in einen SQL Text packt.
Das würde aber auf der anderen Seite auch bedeuten das ich in der Anwendung die Daten puffern muss.

Mal sehen ob ich das noch teste ...

Wenn jemand noch einen anderen Vorschlag hat ... Nur her damit.
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#13

Re: Schnellste Insert Möglichkeit für eine DB?

  Alt 2. Mär 2010, 16:48
Die SQL-Befehle sollte man nicht über eine Query-Komponente absenden, sondern falls möglich direkt über das Connection-Objekt oder Database-Objekt.
Beim Zusammenbauen der SQL-Befehle sollte man darauf achten, dass man nicht Folgendes tut:
SQL := SQL + ....; Hierbei würde jedes Mal der String verlängert, was zur Folge hat, dass ein neuer Speicherblock notwendig wird und dann der alte Block auf den neuen kopiert wird.
Andreas
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#14

Re: Schnellste Insert Möglichkeit für eine DB?

  Alt 2. Mär 2010, 17:46
Ok ich werde das mal testen.

Wusste nicht dass das mit UniDac so geht.
Danke für den Hinweis.
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#15

Re: Schnellste Insert Möglichkeit für eine DB?

  Alt 2. Mär 2010, 17:49
Hallo,

was ich hier vermisse,
sind die Transaktionen.

sollte UniDAC wie die BDE arbeiten,
würde bei jedem ExecSQL ein StartTransaction / Commit gemacht.

Das sollte aber ausserhalb der Schleife passieren.

Delphi-Quellcode:
StartTransaction;
try
  Prepare;
  for
    ExecSQL;
finally
  Commit;
end;

Heiko
Heiko
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#16

Re: Schnellste Insert Möglichkeit für eine DB?

  Alt 2. Mär 2010, 17:57
Hallo Heiko,

evtl. ist das Beispiel dafür ungeeignet, aber die Daten kommen bei mir ja im Sekundentakt später. Die For Schleife ist derzeit ja nur zum simulieren großer Datenmengen.

Muss ich dann zwangsläufig auch mit Transaktions arbeiten?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#17

Re: Schnellste Insert Möglichkeit für eine DB?

  Alt 2. Mär 2010, 22:37
Zitat von shmia:
Die SQL-Befehle sollte man nicht über eine Query-Komponente absenden, sondern falls möglich direkt über das Connection-Objekt oder Database-Objekt.
Warum *genau* sollte man das nicht tun?

Zitat von shmia:
Beim Zusammenbauen der SQL-Befehle sollte man darauf achten, dass man nicht Folgendes tut:
SQL := SQL + ....;
Sowas darf ich dann aber machen, ohne dass es Probleme mit dem Speicher gibt, oder?

sql := 'SELECT * FROM ' + table + ' WHERE ID = ' + id + ' ORDER BY ' + order;
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#18

Re: Schnellste Insert Möglichkeit für eine DB?

  Alt 3. Mär 2010, 08:25
Zitat von s.h.a.r.k:
Sowas darf ich dann aber machen, ohne dass es Probleme mit dem Speicher gibt, oder?
sql := 'SELECT * FROM ' + table + ' WHERE ID = ' + id + ' ORDER BY ' + order;
Sowas sollst du grundsätzlich nicht machen! Das hat nichts mit dem Speicher(n) zu tun, sondern ist eine Frage der Sicherheit und Geschwindigkeit (und wird in 1000 Beiträgen dringend empfohlen):

* Parameter vermeiden Probleme bei der Formatierung von Zahlen, Datumsangaben oder Hochkommata als Teil von Strings.
* Parameter verhindern Sql-Injection.
* Ein parametrisierter Befehl, der der DB schon bekannt ist, muss nicht neu analysiert werden und wird deshalb schneller ausgeführt. Ein Befehl, der z.B. durch die "eingebaute ID" jedesmal anders aussieht, muss jedesmal neu analysiert werden.

Ich hoffe, das ist so klar und eindeutig, dass es nicht mehr in Zweifel gezogen wird. Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
psychomama

Registriert seit: 3. Mär 2010
3 Beiträge
 
#19

Re: Schnellste Insert Möglichkeit für eine DB?

  Alt 3. Mär 2010, 08:57
Darf ich dann bitte einmal fragen, wie man sonst eine dynamische SQL-Anweisung schreiben soll?!
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#20

Re: Schnellste Insert Möglichkeit für eine DB?

  Alt 3. Mär 2010, 09:39
Zitat von Jürgen Thomas:
* Parameter vermeiden Probleme bei der Formatierung von Zahlen, Datumsangaben oder Hochkommata als Teil von Strings.
* Parameter verhindern Sql-Injection.
* Ein parametrisierter Befehl, der der DB schon bekannt ist, muss nicht neu analysiert werden und wird deshalb schneller ausgeführt. Ein Befehl, der z.B. durch die "eingebaute ID" jedesmal anders aussieht, muss jedesmal neu analysiert werden.

Ich hoffe, das ist so klar und eindeutig, dass es nicht mehr in Zweifel gezogen wird. Jürgen
Ach wenn ich Dir Recht geben muß, sind das keine allgemeingültigen Aussagen!
Wenn z.b. der Benutzer keine Chance hat an den SQL-Text zu kommen (Injection), dann kann
sql:=sql+.... durchaus sinnvoll sein.
In den allermeisten Fällen ist Deine Aussage korrekt, aber es gibt eben auch Ausnahmen, darum sollte man nicht ganz so dogmatisch sein.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz