AGB  ·  Datenschutz  ·  Impressum  







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

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 3 von 5     123 45   
Jürgen Thomas

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

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

  Alt 3. Mär 2010, 09:48
Zitat von psychomama:
Darf ich dann bitte einmal fragen, wie man sonst eine dynamische SQL-Anweisung schreiben soll?!
Beispielsweise so, wie es oben in #5 und #7 gemacht wurde. Die Tabellen, Spalten und JOINs dürfen selbstverständlich dynamisch zusammengesetzt werden; auch die Parameter dürfen auf diese Weise dynamisch eingebaut werden, aber keinesfalls die Werte für die Parameter.

Zitat von p80286:
In den allermeisten Fällen ist Deine Aussage korrekt, aber es gibt eben auch Ausnahmen, darum sollte man nicht ganz so dogmatisch sein.
Es mag solche Ausnahmen geben. Aber die Regel ist so eindeutig; ich wundere mich sowieso, dass das in dieser Diskussion nicht viel deutlicher gesagt wurde, sondern nur implizit danach gehandelt wurde.

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
Benutzerbild von s.h.a.r.k
s.h.a.r.k

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

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

  Alt 3. Mär 2010, 11:30
@Jürgen Thomas: Das mit den Paramtern kannte ich schon Meine Frage hatte eher etwas mit der Speicherwaltung zu tun, wenn ich einen String über "+" zusammenbaue. Man merkt vor allem schnell, dass es zu einem Problem werden kann, wenn man verschiedene Dateitypen in eine DB klopfen kann und das über einen einzigen SQL-String machen will. Man muss die Logik der Params halt selbst basteln -> unnötige Arbeit.

Zitat von s.h.a.r.k:
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?
Diese Frage wäre noch offen
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
646 Beiträge
 
FreePascal / Lazarus
 
#23

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

  Alt 3. Mär 2010, 17:50
wenn du es von der Applikationsseite wirklich schnell haben willst, dann achte auf die Transaktionssteuerung und auf das prepare außerhalb der schleife und tausche innerhalb der Schleife nur noch die parameter aus. Bei jedem execsql kommt dann sonst ein riesen overhead zu stande. Den Tip von hoika also auf jeden Fall ernst nehmen. Wenn du jedoch in der Schleife das SQL änderst, dann macht der client beim server sowieso ein unprepare und ein neues prepare mit jedem execsql. Damit würdest du wieder Geschwindigkeit verlieren.

Wenn die Daten zum Beispiel als Datei vorliegen, dann konvertier ich die lieber mit Delphi in ein Fixed format (pro zeile wird jedes feld mit Leerzeichen aufgefüllt).
von csv
SQL-Code:
ID;ZAHL;TXT;TXT2;ZAHL2
1;2;abc;xy;5
2;1;asd;yss;7
4;1;bbs;ddd;5

in fixed format, z.B.

SQL-Code:
1 2 abc xy 5
2 1 asd yss 7
4 1 bbs ddd 5
die datei dann zum Beispiel als c:\dat.txt speichern

dann in firebird

SQL-Code:
create table dat_ext external file 'C:\dat.txt'
(id char(3),
zahl char(2),
txt char(4),
txt2 char(3),
zahl2 char(1),
crlf char(2)) --zeilenumbruch in Textdatei belegt bei windoof 2 byte
als interne tabelle zum Beispiel

SQL-Code:
create table dat
(id integer,
zahl integer,
txt char(4),
txt2 char(3),
zahl2 integer)

dann in firebird

insert into dat select id,zahl,txt,zahl2,txt2 from dat_ext
und dann ganz einfach

drop table dat_ext; damit bekommst du locker 20000 bis 100000 records pro sekunde in die Datenbank. Das geht in einer Transaktion mit wenigen execsqls, dabei ist dann der prepare auch egal.

Das entspricht dem Tip von chaosben und schlägt alle anderen verfahren um längen.

So ein Präprozessor, also ein simples Programm was aus deinen vorhandenen Daten eben so ein fixed format erzeugt ist in Delphi sogar mit TStringlist schnell zusammengeklöppelt und braucht sicherlich auch für 100000 records weniger als eine Sekunden, wenn das nicht ganz bescheuert programmiert ist.


Schöne Grüße
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat
shmia

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

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

  Alt 4. Mär 2010, 14:02
Zitat von s.h.a.r.k:
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?
Aus Performancegründen.
Ich beziehe mich hier mal auf ADO-Komponenten.
Wenn man einen INSERT direkt über Connnection.Execute('INSERT INTO ....') einreicht, dann ist man deutlich schneller als wenn man dies über eine ADOQuery oder ADOCommand tut.

Auch bei anderen Datenbank-Komponenten, die das Konzept einer Connection haben muss das so sein.
Letztendlich gibt eine Query ihren SQL-Befehl immer an die Connection- oder Database-Komponenten weiter.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

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

  Alt 4. Mär 2010, 15:30
Zitat von shmia:
Aus Performancegründen.
Ich beziehe mich hier mal auf ADO-Komponenten.
Wenn man einen INSERT direkt über Connnection.Execute('INSERT INTO ....') einreicht, dann ist man deutlich schneller als wenn man dies über eine ADOQuery oder ADOCommand tut.

Auch bei anderen Datenbank-Komponenten, die das Konzept einer Connection haben muss das so sein.
Letztendlich gibt eine Query ihren SQL-Befehl immer an die Connection- oder Database-Komponenten weiter.
wofür ist dann die TQuery noch gut?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.169 Beiträge
 
Delphi 10.4 Sydney
 
#26

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

  Alt 4. Mär 2010, 15:43
Zitat von p80286:
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.
Dann viel Spaß beim Erklären wenn in einem Sicherheitsaudit der Auditor erstmal den SQL-Tracer anschmeißt und sieht das es Stellen gibt die nicht mit parametrisierte Abfragen laufen. Wie willst du Sicherstellen das die Methode die sowas macht nicht doch mal mit Werten auf User-Eingaben gefüttert wird? Z.B. 2ter Entwickler der die internas einer Methode nicht kennt bzw. sich nicht anschaut.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
shmia

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

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

  Alt 4. Mär 2010, 16:16
Zitat von p80286:
wofür ist dann die TQuery noch gut?
TQuery braucht man immer dann, wenn man eine Datenmenge zurückerwartet (das ist im Prinzip alles was mit SELECT ... anfängt).
TQuery bietet jede Menge Komfort (Parameter, Events,..) der halt etwas Zeit kostet.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

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

  Alt 4. Mär 2010, 16:38
Hallo Berhard

Zitat von Bernhard Geyer:
Dann viel Spaß beim Erklären wenn in einem Sicherheitsaudit der Auditor erstmal den SQL-Tracer anschmeißt und sieht das es Stellen gibt die nicht mit parametrisierte Abfragen laufen. Wie willst du Sicherstellen das die Methode die sowas macht nicht doch mal mit Werten auf User-Eingaben gefüttert wird? Z.B. 2ter Entwickler der die internas einer Methode nicht kennt bzw. sich nicht anschaut.
in Meiner Praxis gibt es z.B. folgende Situation:

Code:
select tabtyp from Tabelle1;

case tabtyp of
  Akte1 : sqltext:= 'select info from Tabelle2';
  Akte2 : sqltext:= 'select info from Tabelle3';
  Akte3 : sqltext:= 'select info1 from Tabelle4,Tabelle5 where Tabelle4.xid=Tabelle5.txid';
usw.
wie willst Du das mit Parametern erledigen?

solche Konstrukte wie
Code:
sqltext:='select adresse from tabelle1 where vorname='+form1.edit1.text+';'
sind natürlich tödlich.

und auch soetwas kommt auch nicht in die Tüte:

Code:
sqltext:='select adresse from tabelle1 where vorname='+Listbox1.items[listbox1.selected]+';'
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#29

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

  Alt 4. Mär 2010, 18:35
Zitat von p80286:
wie willst Du das mit Parametern erledigen?
Zur Laufzeit parametrisierte Queries zuweisen, die Datentypen der Parameter definieren, parametrieren und ab die Luzie.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

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

  Alt 5. Mär 2010, 09:26
Zitat von alzaimar:
Zitat von p80286:
wie willst Du das mit Parametern erledigen?
Zur Laufzeit parametrisierte Queries zuweisen, die Datentypen der Parameter definieren, parametrieren und ab die Luzie.
Äh wie soll das dann aussehen?
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 03:19 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