Einzelnen Beitrag anzeigen

tsteinmaurer

Registriert seit: 8. Sep 2008
Ort: Linz, Österreich
530 Beiträge
 
#58

AW: Fragen bezüglich Performance von Firebird in einer Anwendung

  Alt 15. Aug 2019, 14:25
Zitat:
Letztendlich verdiene ich aber nicht mit Firebird und Dienstleistungen drumherum sondern mit Businessanwendungen, die Firebird nutzen. Heißt, das DBMS muss arbeiten. Effizient und zügig.
Verständlich, dass Freibier (ah, sorry: kostenloser Firebird) performen soll wie Sau, wenn möglich. Böse Zungen behaupten, da deutschsprachige Kollegen bei der Gründung dabei waren, dass sich Firebird (Fb) von Freibier (Fb) ableitet, aber vielleicht war es dann doch der Phönix (Vogel) aus der Asche. Aber das ist eine andere Geschichte ...

Ich bin in der glücklichen Lage, dass mir Firebird nicht meine Familie ernährt. Darum muss ich auch nicht Firebird (+ meine Dienste) bei jeder Gelegenheit verteidigen bzw. an den Mann / die Frau bringen, sondern auch kritisch hinterfragen. So zB finde ich, dass Firebird viel zu spät auf den SMP-Zug in der SuperServer Architektur aufgesprungen ist. Da hatte InterBase definitiv die Nase vorne, aber vielleicht auch nur, weil ein paar größere Kunden diese Skalierbarkeitsthema einfach eingefordert hatten (reine Mutmaßung, in der Hoffnung, dass ich von InterBase-Insidern nicht gesteinigt werde ). Firebird punktete mit einer massiven Flotte an SQL-Spracherweiterungen, um auf die anderen Hersteller aufzuschließen.

Grundsätzlich soll jeder das nehmen, was am Besten funktioniert. Warum ist dann Firebird weiterhin im Rennen, wenn es so viel schlechter als Oracle oder MSSQL performt?
Vielleicht sind es dann doch so Dinge wie:
* kostet nix (auch wenn die Entwicklung an Firebird vor 10 Jahren sich in der Gegend von 5-stelligen USD pro Monat abspielte)
* klein und handlich mit einfacher Installation
* Multi-OS Support
* wenig Administration (ein bisschen automatisiertes gbak, gfix)
* enormer SQL-Sprachumfang, sowohl client- als auch serverseitig
* hohe Read/Write-Concurrency Fähigkeit (record versioning)
* Repeatable Read / Snapshot Isolation für eine stabile Sicht auf die Daten z.b. bei Reporting Use-Cases
* etc ...

Vor allem die Read/Write-Concurrency Fähigkeit war ein beliebtes Beispiel was z.b. MSSQL ja bis Version 2005 gar nicht konnte bzw. auch dort by Default OFF war, weil dann die tempdb ein echter Flaschenhals wurde. Ich möchte nicht wissen, wieviel clientseitiger Code fürs Locking-Exception-Handling mit Re-Try Mechanismen notwendig war, um das stabil zu bekommen. Aber gut, die Zeit verging und MSSQL ist da mit Sicherheit viel besser geworden. Andere böse Zungen (TM) behaupteten, dass in der MSQL Welt deswegen auch so stark die Trennung von OLTP und OLAP auf einer Datenbasis forciert wurde, weil dir mit einer MSSQL Datenbank Reads auf nicht committeten Writes mit Locks nur so um die Ohren geflogen ist. Und vom Thema "Lock Escalation" von Locking auf Datensatz in Richtung Page-Ebene sprechen wir noch gar nicht. Die Leute haben halt dann angefangen mit dem NOLOCK Hint zu arbeiten. ACID Eigenschaften Goodbye.

Holger hat ja schon das Problem mit der SELECT COUNT(*) ... Performance geschildert. Ist dem Record Versioning und der hohen Read/Write-Concurrency Fähigkeit geschuldet. Aber man darf da hier schon den Anwendungsentwickler (oder Komponentenhersteller) in die Pflicht nehmen und z.b. folgendes
hinterfragen (Pseudocode unten):

Code:
...
anzahl = SELECT COUNT(*) FROM ... [WHERE ...];
IF (anzahl > 0) THEN
BEGIN
  ...
END
Großes Potential für eine Optimierung zB mit:

Code:
...
IF (EXISTS(SELECT 1 FROM ... [WHERE ...])) THEN
BEGIN
  ...
END
...
Oben war nur ein kleines Negativbeispiel aus der Praxis, das ich in dieser Form oft gesehen haben. Zusätzlich bin ich persönlich der Meinung, dass man sich mit jedem DBMS und dessen Eigenschaften auseinandersetzen MUSS, bevor man mit der Anwendungsentwicklung startet. Bei Firebird sind es halt dann so Eigenheiten wie die Wichtigkeit des Transaktionshandlings, OIT/OAT etc ... Da fährt der Zug drüber . Des Weiteren bin ich auch der Meinung, dass es nicht umsonst Software Engineering auf der Uni, Fachhochschule gibt und Leute dort 5+ Jahre verbringen, um das Rüstzeug für solide Architekturen und testbaren Code zu bekommen. Danach hat es auch sehr, sehr viel mit Erfahrung zu tun und mit Fehlern, die man hoffentlich machen darf, sofern man daraus lernt. Letztendlich ist es ein Handwerk, das man von der Pike lernen muss und über die Jahre verbessert/verfeinert.

Ein weiteres Thema mit massiven negativen Auswirkungen auf Datenbank-Backends sind O/R Mapper. In Bezug auf Performance und Optimierung haben O/R Mapper einen ganzen Industriezweig geprägt. Hersteller von Performance-Monitoring-Tools haben hier sehr gut verdient. O/R Mapper falsch eingesetzt, haben für mich immer folgende Analogie: Ein Rennpferd sieht einen 300kg Aushilfs-Jockey auf sich zukommen und denkt sich: "Shit, und jetzt muss ich genau so performen wie vor einer Woche mit einem 40kg Jockey?". Wenn man dann mal die Anwendungsentwicklung und einen fähigen DBA an einem Tisch bringt, wirds interessant, weil der DBA einfach nicht glauben will, was da alles für ein Sch... ausgeführt wird. Gut aber das ist jetzt hier nicht wirklich das Thema, aber O/R Mapper, falsch eingesetzt, sind eine tolle Spielwiese für inperformanten SQL Code.

Weil das Thema Caching gefallen ist. Ein herrliches und zugleich furchtbares Thema. Für mich ist der beste Cache der, den man nicht benötigt. Ein Cache ist eigentlich nur dann effektiv, wenn es sich um stabile Daten handelt, zB einmal beim Startup geladen und sich dann über die Programmlaufzeit nicht mehr verändert. Nur so wird man vermutlich eine hohe Cache-Hitrate von > 95% erhalten. Zum Beispiel Länder-ISO-Codes und deren Länderbezeichnungen oder etwas interessanter - da größer - Geo-Datenbanken (Mapping von Geo-Koordinaten auf Orte/Städte ...). Ab dem Zeitpunkt wo Daten im Cache verändert werden, wirds bedeutend kniffliger. Cache-Aktualität, Invalidierung, Lock Contention beim Updaten etc. werden dann wichtige Themen. Noch viel, viel schlimmer wirds bei verteilten Caches über Prozesse/Maschinen hinweg. zB ein Broadcast von Cacheänderungen hat gleich mal eine O(n2) Komplexität, was nicht skaliert. Es sind Projekte am (verteilten) Caching als Allheilmittel für Probleme in der Architektur böse gescheitert. Vor allem im Java-Umfeld. Im Delphi-Umfeld gehe ich jetzt nicht auf TClientDataset und CachedUpdates im Detail ein (bzw. ist auch schon sehr lange her). Man stelle sich vor, dass 50 Anwender/Maschinen Updates lokal cachen (uh, Caching) und dann auf die DB losgehen. Performance ist ev. das eine. Das andere sind dann Themen mit Datenintegrität (FK-Constraints), wo es ev. wieder Exceptions schmeißt, weil in einem cached Update ein Datensatz gelöscht wurde, den ein anderer Benutzer voraussetzt, dass es diesen gibt und was passiert dann mit dem Rest der gecachten Änderungen ...

Zurück zum Thema, warum mich dieser Thread interessiert. Firebird und Performance. Vor allem habe ich dann > 80K IOPS gelesen. Ist schon abartig was man 2019 alles zur Verfügung hat und dann trotzdem nichts hilft.

Aus Firebird-Sicht finde ich es toll wo das Projekt steht, vor allem auch weil die Entwicklung Geld kostet. Gut, wünschenwert wäre natürlich immer "mehr und besser". Aber es gibt ein stabiles 2.5/3.0er Release. Erste 4.0er Dev Builds sind verfügbar.
Es gibt eine 2019er Konferenz (https://firebirdsql.org/en/firebird-conference-2019/), wo auch 5.0 erwähnt wird. Macht irgendwo Bock nach Berlin zu fahren.

Aus Sicht der Anwendungsentwicklung wäre es natürlich schön, wenn jede DB gleich tickt. Tut es leider - oder vielleicht Gott sei Dank - nicht?

Nur ein paar Gedanken, in der Hoffnung, dass ich niemanden auf die Füße getreten bin.
  Mit Zitat antworten Zitat