Autor |
Beitrag |
trm
      
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: Di 27.11.12 22:52
Huhu,
ich bin gerade dabei einige Programme auf eine neue Datenbank umzustellen.
In diesem Zuge erzeuge ich immer mal Testdatensätze.
Im Moment passiert das per Schleife.
Gibt es ein SQL Verfahren, mit dem ich schnell Daten in eine Datenbank schreiben kann als meine aktuelle Methode?
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| procedure TForm1.Panel7Click(Sender: TObject); var X: Integer; dummyStrings: TStrings; str1, str2: string; begin
dummyStrings := TStringList.Create; dummyStrings.Clear;
for X := 0 to 1000000 do begin str1 := Random_String(100); str2 := Random_String(100);
dummyStrings.Add('insert into bibo (name,autor) values (''' + str1 + ''', ''' + str1 + ''');');
end; CreateDBsql(ABSTable1, ABSQuery1, dummyStrings); dummyStrings.Free;
end;
function CreateDBsql(Table: TABSTable; Query: TABSQuery; SQLstrings: TStrings): Integer; begin
Table.Close; Query.SQL.Text := SQLstrings.Text; Query.ExecSQL;
end; |
_________________ In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Mi 28.11.12 09:19
In SQLite würde man so vorgehen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| DB.BeginTransaction; for X := 0 to 1000000 do begin str1 := Random_String(100); str2 := Random_String(100); DB.ExecSQL('insert into bibo (name,autor) values (''' + str1 + ''', ''' + str1 + ''');'); end; DB.Commit; |
Alle inserts werden dann in einer Transaktion durchgeführt. Dies ist erheblich schneller als jedes Insert einzeln durchzuführen. Außerdem sollte auf diese Weise bereits während dem Durchlauf der Schleife, das Insert in der DB durchgeführt werden.
Wie es genau bei dir abläuft weiß ich nicht, da ich nicht beurteilen kann, was die Komponente mit dem langen String macht. Ich habe mal in die Doku geschaut, und ich bilde mir ein, dein Verfahren ist richtig so, denn spezielle Transaction-Befehle scheint es nicht zu geben.
[PS: www.componentace.com...absdb_manual/faq.htm erster Punkt. StartTransaction ist eine Methode von TABSDatabase. www.componentace.com...database_methods.htm ]
Vielleicht hilft dir aber das hier zumindest ein bisschen:
www.componentace.com...erallperformance.htm
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
trm 
      
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: Mi 28.11.12 10:41
Danke Xion, jedoch ist das im Prinzip ein ähnliches Vorgehen, welches ich im Moment nutze.
Ich hoffte, dass es ein SQL Verfahren gibt, welches ähnlich einer Multiplikation arbeitet.
Auf die Random-Werte könnte ich auch Verzichten. Mir geht es im Moment nur um die Menge an Daten.
Die Schleife, welche die Stringlist füllt ist die Bremse.
_________________ In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Mi 28.11.12 16:30
Hi!
Du willst Prepared Statements mit Parametern. Mal von den offensichtlichen Sicherheitsaspekten abgesehen, bringt dir das auch noch Geschwindigkeit, da das SQL nur einmal geparst wird und dann nur noch mit der Information "und jetzt führe das bitte mit diesen Daten aus" aufgerufen wird.
Grüße,
Martok
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Sinspin
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: Mi 28.11.12 17:28
Es geht hier ja nicht um Sicherheit, sondern um Speed. Eine Möglicheit eine Stringliste schneller zu bekommen ist Capacity. Einfach auf die Anzahl der zu erwartenten Strings setzen und es wird schneller. Die Variante von Xion sogt dafür das die DB selber das einfügen noch weiter optimieren kann. Aber das macht eigentlich nur Sinn bei einem Server wenn man mehr als eine Connection die DB mit Daten beschießt.
Ich Denke das es via Prepared Statements am schnellsten geht. Transactionhandling hat im realen Anwendungsfall aber als weiteres des Vorteil das man keinen Schrott in die DB schreibt falls aus irgend einem Grund mal was nicht klappt.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
trm 
      
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: Mi 28.11.12 19:36
Danke für eure Antworten 
_________________ In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege
|
|
|