2015-08-12 4 views
5

Ich verwende Hibernate mit Ansichten (Annotation @ Subselect und @ Synchronize) und Filter. Das Problem ist die Abfrage für den Winterschlaf (durch die Eigenschaft 'value' der Annotation @Subselect definiert) und die Leistung wird sehr langsam.Wie verschachtelte Abfrage im Ruhezustand mit Ansichten und Filtern zu vermeiden

Zum Beispiel, wenn ich meine eigene SQL-Abfrage schreiben (die mehr als 100 ms nicht auszuführen nimmt) ist dies wie folgt aus:

SELECT id, 
     country_id, 
     firstName, 
     lastName 
FROM client 
WHERE client.country_id IN (2564,2558,1452,3652) 

Aber wenn ich mit Filtern mit Hibernate, die erzeugte Abfrage wird :

SELECT _this.id   AS id1_0_0, 
     _this.country_id AS country_id2_0_0 
     _this.firstName AS firstName3_0_0, 
     _this.lastName AS lastName4_0_0 
FROM (
    SELECT id, 
      country_id, 
      firstName, 
      lastName 
    FROM client 
) _this 
WHERE _this.country_id2_0_0 IN (2564,2558,1452,3652) 

Dies bedeutet, dass der durch den Ruhezustand erzeugten SQL ist langsamer als meine SQL-Abfrage mit der Hand geschrieben, da alle Zeilen der ‚Kunden‘ Tabelle (in verschachtelter query) geladen werden, und die Filteroperation ist im übergeordneten Abfrage ausgeführt nachdem alle Zeilen geladen sind, ist das dumm und sehr langsam Leistungen (1,7 sec vs weniger als 100ms). Also, kennt jemand eine Methode, um das zu vermeiden?

+0

Could postest du deine '@ Subselect' Definition? –

+0

@Subselect ist die Annotation, die einer Klasse/einem Feld hinzugefügt wird (tatsächlich wird sie passend benannt). Aber warum gelten Filter nicht für die geschachtelte Abfrage? – SnakePlissken

+4

Jeder anständige Optimierer sollte die äußere Bedingung in die abgeleitete Tabelle schieben, d. H. Die zweite Abfrage in die erste umschreiben. Was ist dein DBMS? – dnoeth

Antwort

0

kann ich hier verschiedene Probleme und Lösungen finden Sie unter:

  1. Blick, wenn Sie können die @Subselect Anmerkung vermeiden überhaupt => wenn man eine Ansicht in Datenbank erstellen, die die angeforderten Daten zurückgibt , macht es das ganze Szenario und die Implikationen (Hibernate Mapping) viel einfacher (warum sollte Hibernate etwas tun oder optimieren, dass Datenbanken wirklich optimiert und entworfen sind)
  2. Hibernate erzeugt keinen Code, der offensichtlich für Ihre Datenbank optimiert ist (Version) => versuchen Sie, auf eine neuere Hibernate-Version zu wechseln oder beeinflussen Sie sie mit db-spezifischen Hinweisen/Konfiguration (Dialekt, Hersteller etc.)
  3. die Datenbank macht keine gute Arbeit bei der Optimierung Ihrer Abfrage (Filter drücken) und scheint sehr schlecht bei einer solchen gemeinsamen Optimierungsstrategie =>versuchen, auf eine neuere DB-Version zu wechseln oder das DBMS wenn möglich (z. B. PostgreSQL, Oracle, ...) seit mehr zukünftige Probleme werden hier

erwartet werden (für genauere Angaben braucht man wirklich, um mehr Hintergrundinformationen über Ihre Tabellen, db-Version und kommentierten Klassen)

Verwandte Themen