![]() |
Re: Schnellste Insert Möglichkeit für eine DB?
Das Problem bei deinem Beispiel oben ist, dass es dort keine Möglichkeit gibt, zu parametrisieren, da du die komplette Tabelle selektierst.
Das Statement, was du selbst als tödlich bezeichnest, ist ein Kandidat dafür. |
Re: Schnellste Insert Möglichkeit für eine DB?
Mir scheint wir schreiben aneinander vorbei.
Code:
sollte (darf)darf nicht genutzt werden
sqltext:='select adresse from tabelle1 where vorname='+form1.edit1.text+';'
richtig wäre dies hier:
Code:
Gleiches gilt für die Übergabe aus Listboxen u ä.
sqltext:='select adresse from tabelle1 where vorname=:prmvorname ;'
also statt
Code:
dies
sqltext:='select adresse from tabelle1 where vorname='+Listbox1.items[listbox1.selected]+';'
Code:
Aber wie geht man mit folgender Situation um (stark vereinfacht):
sqltext:='select adresse from tabelle1 where vorname=:prmvorname ;'
Code:
Aus einer Abfrage ergibt sich ein Wert, der die folgende Abfrage bestimmt. (z.B. die Tabelle)
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. Gruß K-H |
Re: Schnellste Insert Möglichkeit für eine DB?
Moin !
Hulla, habe das We hier nicht rein gesehen und nun entstehen hier fast Grundsatzdiskussionen :) Ich möchte aber nochmal auf den Kern meines Problems zurück kommen. Mein Beispiel ganz zu Anfang:
Delphi-Quellcode:
... war auch nur ein Beispiel und trifft nicht den Kern meines Problems.
for I := 1 to Amount do begin
Inc(Counter); DBQuery.SQL.Text := 'INSERT Into ' + Table + ' (ID, PROP01, PROP02, PROP03, PROP04, PROP05, PROP06, PROP07, PROP08, PROP09, PROP10) VALUES (:wert1, :wert2, :wert3, :wert4, :wert5, :wert6, :wert7, :wert8, :wert9, :wert10, :wert11);'; DBQuery.Prepare; DBQuery.Params[0].AsInteger := Counter; DBQuery.Params[1].AsFloat := Random(10000); ... DBQuery.Params[10].AsFloat := Random(10000); DBQuery.ExecSQL; end; Die For Schleife dient hier ja nur zum Erzeugen von Last. In Wirklichkeit aber kommen die Daten bei uns von Geräten. Die Geräte senden (um es einfach zu machen) Spannung, Strom, Ladung. Und das mehr oder minder schnell. Wir haben also nicht einen Block an Daten den ich auf einen Schlag wegschreiben möchte (was man dann ja über eine Transaktion könnte), sondern wir haben eher eine stetige Datenmenge die permanent weggeschrieben werden muss. Ich sehe da im Moment zwei Varianten: 1) Man schreibt jeden Datensatz sofort bei Erscheinen in die DB. Das (so verstehe ich das hier) erzeugt aber eine Menge Overhead. 2) Ich könnte Datensätze erst puffern und dann z.B. immer 10 Datensätze mittels Transaktion wegschreiben. Das würde den Overhead auf der DB verringern, aber mehr Aufwand am Client bedeuten. Wie seht ihr das? |
Re: Schnellste Insert Möglichkeit für eine DB?
Zitat:
blockweise in die DB zu schreiben. Wie die Pufferung aussieht richtet sich danach, welche Zeitverzögerung Du Dir erlauben kannst. Ich puffere hier Blöcke von 3 Min. bis zu 1 Stunde. Die Daten werden lokal in CSV Dateien geschrieben und dann nach Zeitraum X and den Server übertragen (FTP mit den Indys). Der schreibt dann diese Daten in _EINER_ Transaktion in die DB (Firebird). Es handelt sich dabei dann um einige hundert bis zu ettlichen tausend "inserts". Das geht granatenschnell und läuft hier sehr zuverlässig. Direkt in die Datenbank werden nur die Daten geschrieben, deren Überwachung kritisch ist. Das erledigen die entsprechenden Clients dann selber. |
Re: Schnellste Insert Möglichkeit für eine DB?
Moin !
Zitat:
Aber gut, dann würde man die Daten sammeln und in einem eigenen Thread nach x Sekunden / Minuten / ... in die DB schieben. |
Re: Schnellste Insert Möglichkeit für eine DB?
Zitat:
jedes Insert/Update ist von einer Transaktion "umhüllt". Je größer die Datenmenge innerhalb der Transaktion, desto größer der Verwaltungsaufwand pro Transaktion (Rollback) darum würde ich die Menge nicht ins "unendliche" wachsen lassen. Gruß K-H |
Re: Schnellste Insert Möglichkeit für eine DB?
Moin !
Zitat:
Zitat:
|
Re: Schnellste Insert Möglichkeit für eine DB?
nocheinmal
Jedes INSERT/UPDATE-Statement steckt in einer Transaktion (Naja so sollte es eigentlich sein). Und bei einigen Systemen hast Du es in der Hand wann die Transaktion mit Commit/Autocommit abgeschlossen wird. Wie exilant schrieb: Zitat:
Eine Faustformel wie "1000 Datensätze und dann ab damit" halte ich für nicht sehr vernünftig. Ich rechne immer mit "die Transaktion ist abgeschlossen" die Daten sind gespeichert. Wenn Du die Daten in einer Datei zwischenspeicherst, dann ist das ja nicht ganz so wichtig. (Wieso kann man Deine Meßwerte eigentlich nicht in einer Datei zwischenspeichern? ob server oder embedded hat doch damit nichts zu tun. Oder gibt's da ein Problem mit dem Plattenplatz????) Gruß K-H |
Re: Schnellste Insert Möglichkeit für eine DB?
Zitat:
Das ist dank Firebirds MGA auch kein sooo wahnsinniger Overhead für die DB. Da würde ich mir keine Sorgen machen. Und wie ich schon sagte: Es ist schnell.
Delphi-Quellcode:
insertstatement.transaction.starttransaction; try readcsv; while not eof(csv)do begin insertstatement.paramby.... := ...csv_value.... insertstatement.paramby.... := ...csv_value.... insertstatement.paramby.... := ...csv_value.... ... insertstatement.execute; readcsv; end; insertstatement.transaction.commit; killcsv; except on e:exception do begin insertstatement.transaction.rollback; WhateverYouMustDo; end; end; |
Re: Schnellste Insert Möglichkeit für eine DB?
Moin,
ich habe dazu mal eine Frage, weil mir fällt da das Einlesen einer Schülerliste ein. Das heißt ich habe eine Datenbank mit Personen und dann bekomme ich eine neue Liste mit Personen. Jetzt will ich neue Personen hinzufügen, und alte (also die nicht in der neuen Liste stehen) löschen. Aber ich will nicht die komplette Liste neu anlegen. Nun ist das aktuell so, dass jeder ein Flag bekommt, ob er in der Liste ist und standard ist das keiner. Dann geht er jede Person auf der Liste durch und vergleicht das mit der Datenbankliste und setzt das Flag auf „vorhanden“. Wenn das nicht der Fall ist, wird die Person hinzufügt. Kann ich jetzt zu Anfang ein SQL Befehl erstellen (präventiv) und das dann nutzen, auch wenn zwischenzeitlich mal ein Update kommt? Ich benutze SQLite, und hoffe mal, dass ich nicht geschlagen werde, dass ich keinen neuen Thread auf mache :) MfG Fabian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz