Methode 1 Einfach

Die wohl einfachste Methode ist einfach spring.jpa.show-sql auf true zu setzen.

spring.jpa.show-sql=true

Damit das ganze lesbarer ist, kann man auch gleich die Formatierung des SQL Queries veranlassen. Das ganze wird mit spring.jpa.properties.hibernate.format_sql gesteuert. Setzt man auch dieses Wert auf treu, dann erhält man das gewünschte Ergebnis. Leider ist dieses komplett unoptimiert und geht direkt am Loggingframework vorbei. Schlimmer noch die Parameter der Prepared Statements können nicht angezeigt werden.

Methode 2 Loggingframework

Mit den Einstellungen:

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

Bekommt man das gleiche Ergebnis, aber die Ausgaben werden über das Loggingframework ausgegeben. Enums werden so aber nicht ausgegeben. Dafür muss separat folgender Schalter verwendet werden:

logging.level.org.hibernate.type.EnumType=TRACE

DBeaver

DBeaver ist zurzeit mein Favorit bei den Datenbank-Tools.

Highlights von DBeaver

Die Liste der Features von DBeaver ist lang. Es werden sehr viele Datenbanksysteme unterstützt. Da DBeaver RCP von Eclipse verwendet, kann DBeaver nahtlos in Eclipse integriert werden. DBeaver ist natürlich im Marktplatz von Eclipse vorhanden.

Neues in DBeaver

Mit der Version 5.1.4 sind ein paar Korrekturen und Neuerungen eingeflossen.

Data viewer

  • Die Navigation mit Foreign keys/references wurde verbessert
  • Der Textfilter Editor wurde gefixt
  • Die Historie der Volltextsuche wurde gefixed
  • Der SQL Formatter wurde verbessert und einige Fehler beseitigt

MariaDB

  • Der Editor für Benutzerrecht wurde verbessert
  • Das Erstellen einer View wurde gefixt

Plattform

  • DBeaver basiert jetzt auf Eclipse Photon Plattform. Dieses behebt zugleich ein paar alte UI Bugs und verbessert die Performance unter Linux und MacOS.

Aggregatfunktionen in SQL

In den meisten DBMS werden SQL Aggregatfunktionen zusammen mit der GROUP BY Funktion verwendet.

Beispiel einer Mehrfachaggregation mit COUNT

Geben sei eine Tabelle Produkte.

  • product_id
  • artNr
  • product_type_id
  • price

Über die Tabelle Produkte sollen verschieden Aggregatsfunktionen ausgeführt werden (Hier das zählen von Vorkommen). Eine Möglichkeit ist sicherlich die Ergebnisse in dedizierten Abfragen zu ermitteln. Dieses hat aber auch 4 Ergebniszeilen zur Folge.

---Anzahl der Produkte
SELELCT COUNT(*) FROM Produkte

---Anzahl der Produkt mit artNr > 1000
SELECT COUNT(*) FROM Produkte WHERE artNr > 1000

---Anzahl der Produkte die von Typ 3 sind
SELECT COUNT(*) FROM Produkte WHERE product_type_id = 3

---Anzahl der Produkte die von Typ 3 sind und eine ArtNr > 1000
SELECT COUNT(*) FROM Produkte WHERE product_type_id = 3 AND artNr > 1000

Diese einzelnen Abfragen sollen als Gesamtergebnis in einer Zeilen ausgeben werden!

10000 60 200 23

Wie kann man nun aber das in eine Abfrage verpacken? Dazu schauen wir uns die Definition der COUNT Anweisung an.

Es werden alle Zeilen gezählt in dem das Argument nicht NULL ist.

Es kann mit Hilfe der CASE-Anweisung können wir hieraus einzelne Prädikate/Vorbedingungen erstellen. p1 und p2.

SELECT
    CASE WHEN artNr > 1000        THEN 1 END p1,
    CASE WHEN product_type_id = 3 THEN 1 END p2
FROM products

Da kein ELSE Block angegeben ist, gibt CASE standardmäßig NULL zurück.

Das ganz Konstrukt sieht dann wie folgt aus:

SELECT count(*) AS cnt,
    count(p1) AS grt1000,
    count(p2) AS type3,
    count(p1+p2) AS combined FROM (
        SELECT
               CASE WHEN artNr > 1000 THEN 1 END p1,
               CASE WHEN product_type_id = 3 THEN 1 END p2
        FROM products)
products

Jetzt zählt count jede Reihe der Tabelle in denen die zuvor definierten Vorbedingungen gelten. Heraus kommt eine Ergebnisreihe. Da hier genau ein Full Table Scan erforderlich ist, kann dieses gerade bei größeren Tabellen auch zur Optimierung von Abfragen verwendet werden.