Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Wie bekomme ich einen performanten Firebird? (https://www.delphipraxis.net/180125-wie-bekomme-ich-einen-performanten-firebird.html)

Union 25. Apr 2014 19:39

AW: Wie bekomme ich einen performanten Firebird?
 
Hier mal die wichtigsten Eckdaten:
Zitat:

Zitat von 3DM2
Server:
2x Intel Xeon E5620 @2,40 Ghz
24566 MB Speicher
5371 MB frei
Auslastung zwischen 0-4%
fb_inet_server belegt 22020Kb
Schreibgeschwindigkeit in FDB schwankt zwischen 500.000 - 1.600.000 B/s 58-160 ms Antwortzeit

Controller: LSI 3Ware Liberator
Firmware: FHX 5.12.00.007
Driver: 5.01.00.018
BIOS: BE9X 5.11.00.006
Memory: 488 MB
Bus Type: PCIe
Bus Width: 4 Lanes
Bus Speed 2.5 Gbps/Lane
Unit 0: Raid 5 1,82TB
Stripe: 64kb
Volumes: 1
Subunits 3
HDs: WDC WD1003FBYX-01Y7B0 931,51 GB SATA
Letzter Verify: 19.04.2014 19:20, OK
Keine Fehler seit 16.02.2013 (weiter reicht das Log nicht zurück).


IBExpert 25. Apr 2014 20:34

AW: Wie bekomme ich einen performanten Firebird?
 
Moin,

das mit den Buffers hast du ja schon gefunden, in der Statistik stand ja vorher 0 als Page Buffers und das bedeutet, das dein Superclassic pro connection sage und schreibe 75 Pages cacht. Da deine DB dann auch noch nur 4k Pagesize hat und nicht wie durchaus empfehlenswert 16k, ist daher dein cache beim insert 75*4k, also sage und schreibe 300 Kbyte.

Das reicht nicht mal um die Systemtabellen zu cachen, geschweige denn Index pages, data pages usw. Dieser durchaus von Firebird bei der Classic/Superclassic Variante gewählte default wert von 75 ist sicherlich zu klein, aber aufgrund der Historie von Firebird bzw Interbase schon in der Steinzeit benutzbar gewesen, als Datenbankserver sich noch über 1MB Ram mehr gefreut haben.

Weiterhin gehe ich aber davon aus, das dein Server trotz guter CPU mit Firebird leider eine ziemlich lahme Gurke ist, denn die fehlende CPU Last ist ganz einfach damit zu erklären, das die CPU nur auf den Datenträger=Festplatte oder Raid wartet. Und ich würde wetten, das der Datenträger eine gute alte drehende Festplatte ist, was im Zeitalter von robusten Enterprise SSDs für Datenbank so ähnlich ist wie heute noch einen Röhrenbildschirm auf dem Schreibtisch zu haben. Und ganz wichtig: RAID ist nicht immer vorteilhaft, dazu später mehr.

Also erster Tip:

Wenn Classic oder Superclassic, dann zunächst mal in firebird.conf den Eintrag #DefaultDbCachePages = 2048 durch
DefaultDbCachePages = 1024 ersetzen (ohne # davor, weil das das Kommentarzeichen ist).

Dann gilt ab sofort dieser Wert als Default, auch wenn in der DB nicht mit gfix angepasst wurde. Ab ca. 500 Pages wird firebird mit normalen Festplatten überhaupt erst sinnvoll benutzbar. Es gilt dabei immer der Wert mit gfix oder in ibexpert-services-database properties eingestellte wert überschreibt den Wert aus der Firebird.conf. Wenn im Statistikheader Page buffers 0 steht, gilt der Wert der Firebird.conf. Wenn der nicht gesetzt ist, dann gilt der Default Wert der Firebird Version, bei Superserver also 2048 und bei classic oder superclassic 75.

Wenn du nun also mit einem Backup/Restore die Pagesize auf 16k verändert hast, dann gilt für 1000 Pages beim Superclassic ein Cache pro Userconnection von 16MB, da passt deutlich mehr rein als in 300k. Dieser Wert muss aber pro Userconnection auch auf dem Datenbankserver physikalisch frei sein und nicht in einer ausgelagerten Pagefile simuliert werden.

Wenn du das mit zum Beispiel maximal 10 Userconnections auf der DB arbeitest, dann braucht der Cache gerade mal 160 MB, das sollte man schon frei haben. Dreh den Wert aber nicht zu hoch, es gibt nachher nicht nur Vorteile.

Nächster Punkt: Deine Inserts kannst du am besten einfach mit execute block zusammenfassen, d.h. bei Masseninserts gar nicht parametrisieren, sondern nimm dir aus der SQL Datei wenn es geht jeweils 50 Zeilen (darf nicht mehr als 32 kb pro block sein) und schreibe

Code:
execute block as begin
davor und

Code:
end
dahinter. Jede insert Zeile muss am Ende ein Semikolon haben. Den Text packst du nun ganz normal in die sql.text eigenschaft deiner TxxQuery und führst das mit execsql aus. Auf dem Weg schickst du 50 Sqls in einem TCP/IP Datenpaket an den Server und nicht 2000 wie bei parametrisierten SQLs. Ob du dann nach jeweils 100*50 zeilen ein commit machst ist dann gar nicht mehr so wild.

So erzeugte SQLs Dateien kannst du auch mit IBExpert im Script executive, mit ibescript.exe oder mit jedem anderen einigermaßen brauchbaren SQL Tool für Firebird direkt ausführen. Manche Delphi Komponenten sind leider zu blöd dafür, mit den meisten klappt das aber.

Zu guter Letzt dann noch folgender Hinweis zur Hardware:

Wir haben mal bei einem Kunden, mit dessen Software und Hardware alle MTV Europe Fernsehstationen (MTV, viva und wie der Kram nicht alles heisst) ihr Programm ausstrahlen, einen Test von einigen Dell Servern als Stichprobe gemacht. Insgesamt setzt MTV über 100 Firebird Server ein, jeweils einer pro Kanal und Land, je Kanal auch eigene Hardware ohne Virtualisierung. Das komplette MTV Programm kommt aus Firebird Servern, genau so wie länderspzifische Klingeltonwerbung usw.

Das spannende dabei war, das die Stichprobe mit 10 Server auf 7 Servern ok war und auf 3 angeblich baugleichen unglaublich langsam war. In allen Rechnern waren DELL Raid Controller mit 3 SAS HDDs eingebaut, auf den schnellen Rechner dauerte der in der IBExpert Vollversion eingebaute Benchmark insgesamt ca. 2 Minuten, auf den langsamen jedoch 17 Minuten.

Theoretisch war alles identisch praktisch aber scheinbar nicht. Der Dell Support selbst hat auch nicht weitergeholfen, sondern auf der Kiste nur eine 500MB Datei in ca 2-3 Sekunden von einen Pfad in den anderen kopiert und gesagt, der Rechner ist ok. Aus der Sicht des Hardwareherstellers auch verständlich, für den Kunden aber trotzdem inakzeptabel.

Egal ob du nun classic oder superclassic nimmst, im Multiuserbetrieb mit 10 User verursacht diese Version gegenüber dem Superserver die 10fache I/O Last auf dem Datenträger und die CPU wartet meistens nur darauf, das der Datenträger endlich mal wieder die eine oder andere angeforderte Page von der Platte nachlädt. Daher siehst du keine CPU Last.

Wenn dann noch für jede Page der Schreiblesekopf bewegt werden muss, dann ist die mittlere Zugriffszeit des Datenträgers viel wichtiger als der CPU Speed, weil die eh nur wartet. Bei recht guten 10ms durchschnittliche Zugriffszeit wären dann also für 10*10 Kopfbewegungen schon die erste Sekunde Wartezeit zusammen. Wenn nun noch die Cachebuffers zu klein sind, dann sind das eher 10*100 Kopfbewegungen, also zusammen 10 Sekunden. SSDs habe da erhebliche Vorteile, im Zusammenspiel mit ausreichend Arbeitsspeicher geht dann noch mal richtig die Post ab, wenn man das sinnvoll einstellt. Deine CPUs können aber auch 100 Kerne haben, bei ienem zu lahmen Datenträger heizen die nur das Gehäuse während die warten. Das siehst du ja auch auf deinem Taskmanager: gähnende Langeweile in der CPU ....

Ganz wichtiger Zusatzhinweis: pro userconnection benutzt Firebird in allen Versionen immer nur einen CPU Kern. Wenn du beim Import der einzige User bist, wirst du mit diesem einem Import auch nur einen CPU Kern auslasten. Wenn dein Import sauber multithreaded programmiert ist, könnte es ein Vorteil sein, das jeder Thread beim classic oder superclassic auf einem anderen Kern laufen kann, aber wenn der Datenträger lahm ist, dann erzeugt das mehr Last als es vorteile bringt.

Mit den bei mtv auf den schnellen Servern gemessenen 120 Sekunden erreichst du im IBExpert Benchmark eine Wert von ca. 35% (die Referenz 100% ist der gleiche Benchmark auf einem von uns als Hardware für 1200 € angebotenen IFS Server, der ca. 40 Sekunden für den Benchmark mit dem Superserver braucht, d.h. das sind die 100% (beim superclassic erreicht der etwa 60%)

Eine heute von mir ausgelieferter IFS Server, der schon ein paar Euro mehr gekostet hat, schafft mit verschiedenen Techniken mit dem Superserver als auch mit dem superclassic server im IBExpert Benchmark ca. 170 %, braucht als knapp über 20 Sekunden.

Eine Benchmark auf einem Kundenserver, wo Schweinchen Schlau Systemadministrator wieder alles besser wusste, hat letzte Woche sämtliche mir bekannten Negativ Rekorde gebrochen, der brauchte für den gleichen Test sage und schreibe ca. 2 Stunden! Keine Ahnung was der da eingebaut, sah aber irgendwie nach iscsi schnittstelle an externer storage aus order irgendwas ähnliches, was für Datenbankserver der absolute Oberschwachfug ist, weil dann zu den mittleren Zugriffszeiten der HDD auch noch die Latenzzeit auf dem Netzwerkkabel kommt und bei viel Traffic auch noch die Kollosionen.

Im Benchmark wurde dieser Server als erster mit 0% gemessen, weil die Referenzzeit unseres 100% Systems geteilt durch diese Zeit gerundet weniger als 1 ergab. Und die Anwender der Firebird basierenden Software können nicht vernünftig arbeiten, weil Schweinchen Schlau Systemadministrator meint, alles besser zu wissen als der Softwarehersteller, von dem wir den Auftrag zur Rechnerprüfung hatten. Der Softwarehersteller selbst hat schon einen von ihm konfgurierten Firebird Server zum Kunden mitgenommen hatte, auf dem das vernünftig lief. Kunde wollte aber lieber seine Schrottkonfiguration behalten, egal wie lahm die ist, warum auch immer ...

Im Rahmen unsere Hotline schalten wir uns auch gerne auf die Server unserer Kunden und nutze dann eine IBExpert Tageslizenz für den Benchmark (ist halt nur in der Vollversion drin). Es ist immer wieder lustig, wenn dann jemand einen frisch gekauften teuren Rechner als komplett ungeeignet erkennt und dann doch auf einmal jemanden fragt, der sich damit auskennt, wie man den denn doch noch einigermaßen schnell bekommt. Je teurer die Storage und je virtualisierter das ganze ist, um so mieser sind die Werte im Vergleich zu einem echten dedizierten Datenbankserver.

Als einfach Vorabtest auch ohne unseren Benchmark: Nicht eine Datei mit 500 MB von einen Pfad in den anderen auf dem gleichen Laufwerk kopieren, das ist langweilig und sagt nichts über Datenbankoperationen aus. Dafür lieber einfach mal 100000 oder 1mio Dateien mit je 1k von einem Pfad in einen anderen Pfad auf dem gleichen Laufwerk kopieren (wichtig: kopieren, nicht verschieben). Da rödelt sich die Platte einen ähnlichen Wolf wie bei Datenbankoperationen. Damit habt ihr schon mal ganz grob einen Vergleichswert mit einem Referenzsystem eurer Wahl.

Die CPU Geschwindigkeit ist vergleichweise egal, der heute ausgelieferte Server, der die 170% erreicht hat, hatte 2,5 Ghz, das aber mit insgesamt 10 Kernen (Xeon E5) und einem guten Servermainboard, auf dem der eingebaute Intel C220/600 RAID Controler mit RAID1 super Leistung bringt.

Aber auch da setzen wir diverse Tricks ein, damit eine 5,5GB große Datenbank mit ca. 50mio Datensätzen und reichlich Indizes beim backup/restore innerhalb von 13 Minuten durch ist (4 Minuten backup/9 Minuten Restore, jeweils mit gbak). Könnt Ihr ja mal mit euren Werten vergleichen

So, das reicht aber auch nun, keine Ahnung ob so lange Post überhaupt von den meisten bis zum Ende gelesen werden :-)

Ein schönes Wochenende wünsche ich

Lemmy 25. Apr 2014 20:56

AW: Wie bekomme ich einen performanten Firebird?
 
Zitat:

Zitat von IBExpert (Beitrag 1256983)
So, das reicht aber auch nun, keine Ahnung ob so lange Post überhaupt von den meisten bis zum Ende gelesen werden :-)

HIER!!! :-) Danke für die Ausführungen!

tsteinmaurer 25. Apr 2014 20:57

AW: Wie bekomme ich einen performanten Firebird?
 
Zitat:

Insgesamt setzt MTV über 100 Firebird Server ein
Schade, schade, dass das Firebird Projekt um jeden Euro/Dollar kämpfen muss, wenn solche kommerzielle Firebird Installation im Umlauf sind.

Interessanter Post, btw. :-D

LG

Union 25. Apr 2014 21:59

AW: Wie bekomme ich einen performanten Firebird?
 
Super Post, ich habe jede Zeile genossen. Mein Datenimport ist nun durch, 8364632 records in 11:09:16.531. Bei der Einrichtung des Servers mussten wir wegen des Raids ganz schön tricksen weil Windows Server standardmäßig meint den Cache ausschalten zu müssen. Ich erzeuge gerade mal 1 Mio Testfiles.

hstreicher 26. Apr 2014 07:50

AW: Wie bekomme ich einen performanten Firebird?
 
Noch eines zur Stripset Größe 64 KB
das Stripeset ist die Verwaltungseinheit eines RAID , d.h. jede Lese oder Schreibanforderung liest/schreibt diese Datenmenge von den Platten

also bei Firebird Pagesize 4KB und Stripset 64KB laufen 60 KB nutzlos über die Platten also rund 93 % nutzlose Daten

Bei dem vom HK vorgeschlagenen 16 KB sind das immer noch 75% Nutzlose Daten die von den Platten geholt werden
also Stripset Größe auf 16KB (oder das kleinst mögliche )

-

Wieso der Performance Einbruch nach ca 300000 Inserts ,
Antwort der Ram Cache des Diskcontrollers (488MB) ist vollgelaufen und jetzt schlägt der Treibanker RAID voll zu

mfg Hannes

Sir Rufo 26. Apr 2014 10:40

AW: Wie bekomme ich einen performanten Firebird?
 
Ein RAID5 mit 3 Platten ist sicher(er) aber sicher nicht schnell.

Meine Erfahrung mit RAID5 hat mich gelehrt, dass man ab ca. 6 Platten in einem Verbund einen schnelleren Zugriff bekommt.

Für Datenbanken ist allerdings ein RAID10 fast schon Pflicht.

Windows Server und Cache abschalten:

Das ist doch hoffentlich kein Domain-Controller, oder?
Ein Domain-Controller schaltet den Cache auf der System-Platte (die Platte, wo die System-Partition liegt) ab, damit das Active-Directory keinen Schaden nehmen kann. Das sollte man auch tunlichst unterlassen, den Cache da wieder einzuschalten :!:

Ein Server, der Domain-Controller werden soll bekommt für das System einen eigenen Plattenverbund spendiert (RAID1,5,10 je nach Geldbeutel und Gusto) und für die restlichen Daten weitere Platten-Verbünde, je nach Anforderung (RAID10 für DB, RAID5 für den anderen Kram).

Für ein performantes, sicheres und schnell wiederherzustellendes Netzwerk packe ich auf 2 (hardware) getrennte VMs den Domain-Controller und Backup-Domain-Controller. Und diese sind ausschließlich Domain-Controller und haben sonst keine weiteren Aufgaben.

Alle anderen Server werden nur Mitglieder der Domäne.

IBExpert 26. Apr 2014 11:23

AW: Wie bekomme ich einen performanten Firebird?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1257037)
Für Datenbanken ist allerdings ein RAID10 fast schon Pflicht.

ich plädiere da eher auch ein RAID 1 auf Basis von 2 High End Enterprise SSDs namhafter Hersteller, z.B. Intel
und einem ausgeklügelten Sicherungskonzept.

Vorteile Raid 1: Jede der beiden Platten ist ohne Einschränkung in einem anderen Rechner sofort einsetzbar, zum
Beispiel ist damit ein Backupserver mit gleichen Hot Plug Einschüben sofort einsetzbar.

Im RAID 10 sind Einzelplatten gar nicht benutzbar und so manch ein Controller reagiert seltsam, wenn er zwei
asynchrone Raid 0 Parts hochfahren soll. Der Geschwindigkeitsgewinn durch Raid0 hält sich je nach Stripe Größe
auch sehr im Rahmen oder sorgt sogar für negative Auswirkungen.

Auf dem Raid Laufwerk ist dann aber nur die Datenbank. Das OS kann dann auf einer normalen Platte sein, ob die
dann mit Raid Technik abgesichert ist, ist dann dem eigene Geschmack und Budget überlassen.

jsheyer 26. Apr 2014 11:39

AW: Wie bekomme ich einen performanten Firebird?
 
Hallo,

es war sehr viel Text, habe es aber auch mit Freuden bis zum Ende gelesen :-D

Übrigens, das System, das bei einem Kunden die Performance Problem bei schreiben hatte, war auch ein Dell, Zufall????
Auch hier konnte nicht festgestellt werden, absolut rätselhaft.
Man konnte den Effekt sogar beim kopieren von grossen Dateien nachstellen, also mal 5 GB kopiert, so ab 500 MB ging die Geschwindigkeit teilweise auf 200 kB / Sek runter.
Und wie gesagt, nirgendwo irgendeine Fehlermeldung.

mikhal 26. Apr 2014 12:24

AW: Wie bekomme ich einen performanten Firebird?
 
Zitat:

So, das reicht aber auch nun, keine Ahnung ob so lange Post überhaupt von den meisten bis zum Ende gelesen werden
Ich hab's auch bis zum Ende gelesen und mir so meine Gedanken zur Firmendatenbank unseres ERP gemacht. Hier ist es zwar eine Oracle-Datenbank mit ca. 100 GByte Tablespace, aber auch hier ist der Effekt schlechter Performance zu erkennen. Hier ist im SAN (über FibreCat angesteuert) ein RAID 5 Verbund gegeben und die Performance ist hier schlechter wie bei der Kopie für die Entwickler, die ohne RAID auf einem Testserver zugreifen (und das nicht nur, weil dann deutlich weniger Mitarbeiter im System arbeiten).

Auf jeden Fall sind ein paar technische Fragen bei mir hochgekommen, wie man es verbessern kann - aber das ERP wird nächsten Monat durch ein ein anderes ersetzt...:|
Trotzdem: Danke Holger, hat mir tiefe Einblicke gegeben und wird mir bei meinem zukünftigen Weg weiterhelfen.

Mikhal

Union 26. Apr 2014 13:14

AW: Wie bekomme ich einen performanten Firebird?
 
Zwischenbericht
Dank der Hilfe von Euch Allen und besonders Holger Klemt konnte ich das Problem jetzt lokalisieren. Es lag an der Write-Cache-Policy des Controllers. Diese war sehr konservativ eingestellt. Der in IBExpert eingebaute Benchmark meldete nach dem Aktivieren einer mehr auf Performance setzende Policy 120-fach höhere Performance!

Der Import der Buchungstabelle war nach 5:53 abgeschlossen, also ca. doppelt so schnell wie vorher.

Ich habe nun den nächsten Importlauf gestartet, diesmal mit deaktivierten Indizes. Es sieht auf den ersten Blick so aus als wäre das nochmals ca. 5-10 Mal schneller.

Als nächsten Test werde ich einmal das ISql direkt auf dem Server starten und sehen ob durch den Wegfall der TCP-Übertragung noch etwas herauskommt.

Im letzten Schritt werde ich durch mein Export-Tool mal ein Script erzeugen lassen, das die EXTERNAL TABLE Definitionen für die zu importierende Tabelle erzeugt und eine Importdatendatei mit festen Feldlängen passend dazu.

Ich weiss nur noch nicht was ich mit evtl. vorhandenen Memos machen soll.

@Sir Rufo: Ja, der Server ist leider auch ein DC. Der Cache wird schon ab Windows Server 2003 immer dann ausgeschaltet, wenn Windows auf der betreffenden Disk das AD hat und auf dem Controller keine BBU erkennen kann. Was dann passiert hängt in der Tat von der Qualität des Treibers ab. Ich habe daher beim Bootvorgang dskcache eingebunden um die Laufwerk-Richtlininen zu ändern. Wenn die Cache-Befehle nicht durchgereicht werden (dann gibt auch dskcache einen Fehler aus), der Treiber also eigentlich schlecht programmiert ist, dann ist alles in Ordnung.

IBExpert 26. Apr 2014 14:34

AW: Wie bekomme ich einen performanten Firebird?
 
Da merkt man ja, das mein Text durchaus einige Male gelesen wurde.

Lasst euch von den Hardwareheinis keinen vom Pferd erzählen, Ihr könnt tausende Euros für Pseudosicherheit ausgeben, die bei Datenbanksystemen so viele negative Einflüsse haben, das man das gar nicht glaubt. Meistens ist weniger mehr.

Falls Ihr schon mit Firebird arbeitet, dann gibt es noch einen anderen sehr einfach Test.

Erzeugt mit dem Befehl
Code:
"CREATE SHADOW 1 ''C:\db\db.shd'"
mal ein Shadow der Datenbank und messt die Zeit, die der dafür braucht. Das Shadow sollte auf der selben Platte liegern wie die DB. Nachdem das Shadow erzeugt wurde, könnt ihr mit
Code:
"DROP SHADOW 1"
das shadow wieder löschen. Achtung: das Shadow ist fast genau so groß wie die Orginal Datenbankdatei.

Gestern beim Kunden auf dem neuen Server aktuell gemessener Bestwert waren ca. 6 Sekunden pro GB, die 5,5GB große Datei wurde von Firebird 2.5 dabei page für page innerhalb von ca. 30 Sekunden kopiert. Mit einem Trick konnten wir den Wert sogar noch auf 20 Sekunden herunterbringen und das Shadow haben wir dann als automatisierte Datensicherung genommen, die ab sofort alle 30 oder 15 Minuten ausgeführt wird, obwohl beim Erstellen des Shadow aktive Verbindungen auf der Datenbank auch schreiben können, während das Shadow erstellt wird.

Falls euer Server also beim Shadow erzeugen die auf Festplatten und RAIDs üblichen 3-5MB pro Sekunde schafft, dann sollte Ihr die Eignung als Datenbakserver einfach mal hinterfragen. Meistens braucht man ja nur messbare Argmente, damit die Hardwareheinis mal aufhören mit deren Klugscheißereien und den Schweigefuchs zu machen: Öhrchen auf und Schnäuzchen zu.

vagtler 26. Apr 2014 14:37

AW: Wie bekomme ich einen performanten Firebird?
 
Zitat:

Zitat von Union (Beitrag 1257060)
[...] @Sir Rufo: Ja, der Server ist leider auch ein DC. [...]

Ein DC ist ein DC, kein Datenbankserver.

Union 26. Apr 2014 15:28

AW: Wie bekomme ich einen performanten Firebird?
 
Unabhängig davon ob es jetzt die "richtige" Maschine oder Server ist: Mir ging es darum FireBird genauso schnell oder schneller zu sehen als das bisher eingesetzte DB-System bei gleicher Hardware. Das ist gelungen.

8,364,632 records

Verbindung Index Dauer hh:mm
remote aktiviert 05:53
remote deaktiviert 02:05
lokal deaktiviert 00:21

Den Test mit dem external file spare ich mir:
  1. Wird die Datei riesengroß weil sie eine feste Feldlänge haben muss
  2. Habe ich keine Idee wie ich dort Memos und NULL Werte verarbeiten kann

Vielen, vielen Dank nochmals an alle Helfer!

jobo 27. Apr 2014 11:59

AW: Wie bekomme ich einen performanten Firebird?
 
Spannende Infos von IBExpert!

Auch wenn ich auf einem Laptop mit einem kommerziellen Standard DB System auf ähnliche oder bessere Werte komme (jenachdem wie man's macht) als hier genannt (4 Mio records ca 6 Minuten oder 11 Minuten):

Zitat:

Zitat von Union (Beitrag 1257084)
8,364,632 records

Verbindung Index Dauer hh:mm
remote aktiviert 05:53
remote deaktiviert 02:05
lokal deaktiviert 00:21

Es zeigt doch, wie sehr es sich lohnt, sich mit den Interna eines DB Systems auseinanderzusetzen!
Mich wundert immer wieder mal, wie egal das vielen hier scheinbar meist ist.

Mich würde für einen genaueren Vergleich noch der originale Tabellenaufbau interessieren und ob dort ein Primärschlüssel definiert ist. Oder ist "Index deaktiviert" gleich "nicht mal Primärschlüssel"?

Union 27. Apr 2014 12:25

AW: Wie bekomme ich einen performanten Firebird?
 
Untenstehend die DDL für die betreffende Tabelle. Die Indizes waren beim letzten Import komplett deaktiviert mit ALTER INDEX <name> INACTIVE. In der usprünglichen DB gibt es keine PK und keine RI. Grosse Integer werden durch DOUBLE dargestellt, da die ursprünglich verwendeten DB keine BIGINT bzw. INT64 unterstützen - nicht lachen, das System ist in den Ursprüngen knapp 30 Jahre alt.
Code:
CREATE TABLE BUCHUNG
(
 "ID" DOUBLE PRECISION,
 "VORG_NR" DOUBLE PRECISION,
 "LFD_BNR" DOUBLE PRECISION,
 "MAND_ID" DOUBLE PRECISION,
 "ART_ID" DOUBLE PRECISION,
 "PAL_NR" CHAR ( 10 ),
 "ZUG_NR" CHAR ( 20 ),
 "ZUG_POS" INTEGER,
 "ABG_NR" CHAR ( 20 ),
 "ABG_POS" INTEGER,
 "LIEFER_ID" DOUBLE PRECISION,
 "KD_ID" DOUBLE PRECISION,
 "BELEG_ID" DOUBLE PRECISION,
 "BUCH_DAT" DATE,
 "ZUG_DAT" TIMESTAMP,
 "MENGE" DOUBLE PRECISION,
 "PLATZ_ID" DOUBLE PRECISION,
 "DATUM" DATE,
 "ZEIT" CHAR ( 8 ),
 "VORGANG" CHAR ( 3 ),
 "AUTO_VORG" CHAR ( 3 ),
 "ART" CHAR ( 4 ),
 "USER" CHAR ( 8 ),
 "STATUS" CHAR ( 4 )
);
CREATE INDEX "BUCHUNG_ID" ON BUCHUNG (ID);
CREATE INDEX "BUCHUNG_MAND_ID" ON BUCHUNG (MAND_ID, ART_ID, DATUM, ZEIT);
CREATE INDEX "BUCHUNG_ART_ID" ON BUCHUNG (ART_ID, MAND_ID, DATUM, ZEIT);
CREATE INDEX "BUCHUNG_ZUG_NR" ON BUCHUNG (ZUG_NR, MAND_ID, ART_ID);
CREATE INDEX "VORG_NR" ON BUCHUNG (VORG_NR);
CREATE INDEX "BUCHUNG_PLATZ_ID" ON BUCHUNG (PLATZ_ID);
CREATE INDEX "VORGANG" ON BUCHUNG (VORGANG);
CREATE INDEX "BUCHUNG_STATUS" ON BUCHUNG (STATUS);

IBExpert 27. Apr 2014 20:28

AW: Wie bekomme ich einen performanten Firebird?
 
Abschliessend im Thread nur noch mal als Hinweis an alle, die viel
importieren und exportieren:

Der Weg über external files bringt bei Firebird erheblich mehr speed
als man denkt.

Die folgende Tabelle mit 20 Feldern, PK und 3 weiteren Indizes und
1.000.000 Datensätze braucht für die Übertragung von drinnen nach
draußen oder von draußen nach drinnen jeweils ca. 1 Minute (der server
hatte bei dem Test nur eine normale Festplatte eingebaut).

Ganz wichtig:

External files definieren geht immer, aber benutzen könnt Ihr die erst,
wenn Ihr in der Firebird.conf den Parameter ExternalFileAccess angepasst
habt und den Firebird Server noch mal neu startet.

Code:
ExternalFileAccess = Restrict C:\export
Bei diesem Beispiel könnt ihr dann im pfad c:\export dateien einlesen oder
auch von firebird erstellen lassen.

Das Feld crlf ist im external file nur definiert, damit man im Texteditor
auch zeilenvorschübe sehen würde, wenn man die denn dort öffnet. Bei allen
weiteren Typen am besten wegen Lesbarkeit auf char(m) umwandeln.

Die Datei sieht dann so aus (Die Boardsoftware schummelt da weitere crlf
rein, ist aber pro datensatz immer eine Zeile).

Code:
1                 JENNIFER                                         WOMMACK                                          MARTIN LUTHER KING JR AVE                        -                                                 PITTSFIELD                                       MO                                               14960             USA                                              3                 JENNIFER.WOMMACK@yahoo.com                       1(435)703-9855                                    4                 1389 4408 4192 3925                               6/2016                                            JENNIFER.WOMMACK1000001                           567373                                            36                45000             F
2                 MARIA                                            DOHERTY                                          NE NEFF ROAD                                     -                                                 ROCKVILLE                                        CT                                               67979             USA                                              5                 MARIA.DOHERTY@yahoo.com                          1(924)920-6861                                    1                 7739 7739 5985 5952                               12/2019                                           MARIA.DOHERTY1000002                              726542                                            31                79000             F
3                 RICKEY                                           HUFFMASTER                                       FIRST AVENUE EAST                                -                                                 BERKELEY HEIGHTS                                 MN                                               12931             USA                                              11                RICKEY.HUFFMASTER@yahoo.com                      1(659)169-7730                                    2                 4666 5413 7709 9617                               3/2016                                            RICKEY.HUFFMASTER1000003                          709595                                            31                41000             M
....
Es rechnet zeitlich sich sehr oft, wenn man Daten für einen Import bekommt, die mit
einem kleinen Delphi oder Lazarus Hilfsprogramm in ein passendes Fixed format zu
konvertieren und danach den Import in die Datenbank auf diesem Weg zu machen.

Beim Export kann man auf einfach csv Dateien erzeugen, in
dem man die Daten einfach als varchars trimt und mit trenner in
einen char(255) einträgt. Das füllt Firebird dann zwar bis zum Ende mit
Leerzeichen auf, ist aber für jedes csv Import normalerweise unkritisch
(char(2) für crlf nixht vergessen)

Direkter csv Import ohne externe Tools via external file ginge zwar auch,
ist aber relativ umständlich, in dem man das als Stored Procedure
auseinanderfrickelt.

Hier der Befehl, um Daten aus der internen Tabelle in die externe zu kopieren
[CODE]
insert into customer_ext_c (ID, FIRSTNAME, LASTNAME, ADDRESS1, ADDRESS2, CITY, STATE, ZIP, COUNTRY, REGION, EMAIL, PHONE,
CREDITCARDTYPE, CREDITCARD, CREDITCARDEXPIRATION, USERNAME, PASSWD, AGE, INCOME, GENDER,crlf)
select ID, FIRSTNAME, LASTNAME, ADDRESS1, ADDRESS2, CITY, STATE, ZIP, COUNTRY, REGION, EMAIL, PHONE, CREDITCARDTYPE,
CREDITCARD, CREDITCARDEXPIRATION, USERNAME, PASSWD, AGE, INCOME, GENDER,'
'
from CUSTOMER
[CODE]

Hier der Befehl, um Daten aus der externen Tabelle in die interne zu kopieren
Code:
insert into customer (ID, FIRSTNAME, LASTNAME, ADDRESS1, ADDRESS2, CITY, STATE, ZIP, COUNTRY, REGION, EMAIL, PHONE,
                      CREDITCARDTYPE, CREDITCARD, CREDITCARDEXPIRATION, USERNAME, PASSWD, AGE, INCOME, GENDER)
select ID, FIRSTNAME, LASTNAME, ADDRESS1, ADDRESS2, CITY, STATE, ZIP, COUNTRY, REGION, EMAIL, PHONE, CREDITCARDTYPE,
       CREDITCARD, CREDITCARDEXPIRATION, USERNAME, PASSWD, AGE, INCOME, GENDER
from customer_ext_c
Metadaten
Code:
/******************************************************************************/
/****              Generated by IBExpert 27.04.2014 20:58:34               ****/
/******************************************************************************/

/******************************************************************************/
/****                                Tables                               ****/
/******************************************************************************/

CREATE TABLE CUSTOMER (
    ID                   NUMERIC(18,0) NOT NULL,
    FIRSTNAME            VARCHAR(50) NOT NULL,
    LASTNAME             VARCHAR(50) NOT NULL,
    ADDRESS1              VARCHAR(50) NOT NULL,
    ADDRESS2              VARCHAR(50),
    CITY                 VARCHAR(50) NOT NULL,
    STATE                VARCHAR(50),
    ZIP                  INTEGER,
    COUNTRY              VARCHAR(50) NOT NULL,
    REGION               SMALLINT NOT NULL,
    EMAIL                VARCHAR(50),
    PHONE                VARCHAR(50),
    CREDITCARDTYPE       SMALLINT NOT NULL,
    CREDITCARD           VARCHAR(50) NOT NULL,
    CREDITCARDEXPIRATION VARCHAR(50) NOT NULL,
    USERNAME             VARCHAR(50) NOT NULL,
    PASSWD               VARCHAR(50) NOT NULL,
    AGE                  SMALLINT,
    INCOME               NUMERIC(18,0),
    GENDER               VARCHAR(1)
);


CREATE TABLE CUSTOMER_EXT_C EXTERNAL 'C:\EXPORT\CUSTOMER.DAT' (
    ID                   CHAR(18),
    FIRSTNAME            CHAR(50),
    LASTNAME             CHAR(50),
    ADDRESS1              CHAR(50),
    ADDRESS2              CHAR(50),
    CITY                 CHAR(50),
    STATE                CHAR(50),
    ZIP                  CHAR(18),
    COUNTRY              CHAR(50),
    REGION               CHAR(18),
    EMAIL                CHAR(50),
    PHONE                CHAR(50),
    CREDITCARDTYPE       CHAR(18),
    CREDITCARD           CHAR(50),
    CREDITCARDEXPIRATION CHAR(50),
    USERNAME             CHAR(50),
    PASSWD               CHAR(50),
    AGE                  CHAR(18),
    INCOME               CHAR(18),
    GENDER               CHAR(1),
    CRLF                 CHAR(2)
);



/******************************************************************************/
/****                             Primary Keys                            ****/
/******************************************************************************/

ALTER TABLE CUSTOMER ADD CONSTRAINT PK_CUSTOMER PRIMARY KEY (ID);


/******************************************************************************/
/****                               Indices                               ****/
/******************************************************************************/

CREATE INDEX CUSTOMER_IDX1 ON CUSTOMER (FIRSTNAME);
CREATE DESCENDING INDEX CUSTOMER_IDX3 ON CUSTOMER (ID);
CREATE UNIQUE INDEX IX_CUSTOMER_USERNAME ON CUSTOMER (USERNAME);

Union 27. Apr 2014 20:50

AW: Wie bekomme ich einen performanten Firebird?
 
Acuh wieder sehr informativ, danke. Leider habe ich damit zwwei bereits geschilderte Probleme, nämlich NULL und BLOB SUB_TYPE TEXT korrekt importiert zu bekommen.

IBExpert 27. Apr 2014 21:04

AW: Wie bekomme ich einen performanten Firebird?
 
naja, nullwerte werde mit coalesce umgewandelt in Leerstrings. Falls im Ziel dann auch wieder nullwerte gebraucht werden, können die dort ja via trigger auch wieder von einem Spezialstring, z.B. 'NULL' wieder in einen Nullwert umgewandelt werden.

Blobs sind eine eigene Baustelle, da würde ich wenn es geht die blobdaten in einen varchar packen (geht ja bis 32765 Zeichen Länge, macht dann aber das external file sehr groß), dann mit substring(feldname from 1 for 32765) noch begrenzen.

Oder noch besser, aus dem original Import entfernen und später gesondert einspielen. Entweder baust du dir dafür ein eigenes Tools oder benutzt so was wie in IBExpert eingebaut http://ibexpert.net/ibe/index.php?n=...sIntoADatabase

mensch72 27. Apr 2014 21:17

AW: Wie bekomme ich einen performanten Firebird?
 
Tolle Ansätze auf aktuellem Stand... ist zwar noch nicht auf dem Level was Anwendungen in meinem Gebiet brauchen, aber als "gute" Referenzwerte zur Argumentation bei hyperschlauen Admins/IT-Beratern super zu verwenden.

1Mio Datensätze pro Minute ist für SQL schon nicht schlecht... Da ich pro Tabelle "sehr sehr viele" kleine Buchungsdatensätze(100..300Mio Records) in Simulationen schneller 1..2Mio Datensätze pro Sekunde incl. (Zeit)Index streamen/kopieren muss(das ist nochmal Faktor 100+ schneller!), geht das wohl weiter nur mit eigenen auf LowLevel programmierten binären File-Strukturen.


Wenn es einen "realistischen"/"bezahlbaren" SQL-Datenbankserver mit einer Transferleistung von 1Mio Records/Sekunde(oder besser;) gäbe, würde mich das interessieren... wäre für jegliche Vorschläge offen, egal ob hier oder als PM.

Dejan Vu 27. Apr 2014 21:50

AW: Wie bekomme ich einen performanten Firebird?
 
Microsoft SQL-Server mit den einschlägigen Optimierungen sowie diversen Tricks, die man sonst noch im Internet findet (meist Hardware) ist per bulk load schon sehr schnell. Mich würde es wundern, wenn es ein RDBMS gibt, das diese Performance ohne bulk load hinbekommt.

Mit einem einfachen Key-Value Store (vor Jahren mal geschrieben) habe ich vor längerer Zeit ohne Optimierungen ca. 0.5 Mio Datensätze im regulären Betrieb hinbekommen (Datensätze ist übertrieben. 32 Byte-Chunks waren das und embedded war das Teil auch noch). Ich kann mir gut vorstellen, das gängige IMDB oder ausgewachsene KVS die Performance hinbekommen, die Du wünschst. Aber bezahlbar ist das dann irgendwann nicht mehr, weil der Server dann ziemlich teuer wird (und persistent ist das dann ja sowieso nicht).

Allerdings hat mein KVS das auch auf Pladde geschrieben. Bei den aktuellen (z.B. Redis) scheint das auch der Fall zu sein. Insofern sollte ich die nicht in einem Atemzug mit IMDB nennen.

IBExpert 28. Apr 2014 07:48

AW: Wie bekomme ich einen performanten Firebird?
 
Zitat:

Zitat von mensch72 (Beitrag 1257198)
1Mio Datensätze pro Minute ist für SQL schon nicht schlecht... Da ich pro Tabelle "sehr sehr viele" kleine Buchungsdatensätze(100..300Mio Records) in Simulationen schneller 1..2Mio Datensätze pro Sekunde incl. (Zeit)Index streamen/kopieren muss(das ist nochmal Faktor 100+ schneller!), geht das wohl weiter nur mit eigenen auf LowLevel programmierten binären File-Strukturen.

In diese Bereiche wird ein SQL Server aufgrund der notwendigen Overheads (Recordversionen, Transaktion, Multiuserfähigkeit usw.) wohl eher nicht hinnkommen, daher ist das für deinen Anwendungsbereich sicherlich besser in eigener Lowlevel Implementation aufgehoben, bei der dich der Overhead sicherlich sowieso nicht interessiert. Welcher Bereich ist das denn, in dem man immer mal eben 300 mio records hin und herschubsen muss ;-)

Union 28. Apr 2014 07:52

AW: Wie bekomme ich einen performanten Firebird?
 
Zitat:

Zitat von IBExpert (Beitrag 1257212)
Welcher Bereich ist das denn, in dem man immer mal eben 300 mio records hin und herschubsen muss ;-)

Vielleicht ein LHC Programm zur Aufzeichnung von Detektorsignalen?

vagtler 28. Apr 2014 07:59

AW: Wie bekomme ich einen performanten Firebird?
 
Aber dann bewegen wir uns ja auch eher im Bereich von Big Data denn in relationalen DBMS.

mensch72 28. Apr 2014 15:03

AW: Wie bekomme ich einen performanten Firebird?
 
BigData ist das noch nicht, ist nur eine kleine Lösung für DataMining und etwas Statistik im Bankenumfeld für elektronische Finanztransaktionen bis in den Millisekundenbereich.
Über 10Jahre kommen dann pro Tabelle schon mal locker hunderte Millionen von Datensätzen zusammen.

BigData wird es erst, wenn von vor hat solche Daten von sagen wir allen weltweit gehandelten Werten (Aktien,Optionen,Futures,Forex) auf einem System zusammen zu führen und dann möglichst in Echtzeit was darin zu suchen...
dann hätte ich gerne eine Transferleistung von 100..200Mio Records/Sekunde... 8-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:10 Uhr.
Seite 2 von 2     12   

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