Hibernate-Abrufstrategie - verwenden, wenn „ein“ und wenn die Verwendung von „wählen Sie“?

StackOverflow https://stackoverflow.com/questions/617145

  •  03-07-2019
  •  | 
  •  

Frage

Die meisten Hibernate Verbände unterstützen "holen" Parameter:

fetch="join|select"

mit "select" ist Standardwert.

Wie zu entscheiden, welches für die Vereinigung zu benutzen?

Ich habe versucht, alles aus „wählen Sie“ Ändern auf „Join“ Anwendung breit - Anzahl der generierten Abfragen verringert wahrscheinlich 10-mal, aber die Leistung blieb genau das gleiche (auch ein klein wenig schlechter geworden).

Danke.

War es hilfreich?

Lösung

Join sollte das n + 1 Problem lösen. Wenn Sie 10 Eltern haben, die jeweils mit 10 Kindern, verbinden wird eine Abfrage benötigen und wählen Sie wird 11 (eine für die Eltern und eine für die Kinder von jedem Elternteil) erfordern. Dies kann kein großes Problem sein, wenn die Datenbank auf dem gleichen Server wie die Anwendung ist oder wenn das Netzwerk ist wirklich schnell, aber wenn es Latenz in jeder Datenbank-Aufruf ist, kann sie addieren. Die Join-Methode ist etwas weniger effizient auf der ersten Abfrage, weil Sie die übergeordneten Spalten in jeder Zeile sind duplizieren, aber nur über einen Round-Trip in die Datenbank machen.

Im Allgemeinen, wenn ich weiß, ich werde die Kinder aller Eltern brauchen, gehe ich mit kommen. Wenn ich nur werde die Kinder von einigen Eltern brauchen, verwende ich wählen.

Andere Tipps

Wählen Sie werden untergeordnete Elemente holen, indem eine neue Anfrage an die Datenbank für sie ausgegeben wird. Beitreten Kind Gegenstände holen, indem sie in der Eltern-Abfrage beitreten. Also das ist, warum Sie eine ähnliche Leistung zu sehen sind, auch mit einem Rückgang der Zahl der Abfragen.

Wählen Sie:

SELECT * FROM parent WHERE id=(whatever)
SELECT * FROM child WHERE id=(parent.child.id)

Join:

SELECT *
FROM parent
LEFT OUTER JOIN child ON parent.child.id=child.id
WHERE parent.id=(whatever)

Was, wenn man über die anderen ... nicht ganz sicher zu verwenden. Es hängt wahrscheinlich auf dem Datenbanksystem. Wenn man immer besser als die andere war, bezweifle ich, sie stören würden Ihnen die Möglichkeit zu geben! Wenn Sie eine ähnliche Leistung für jeden zu sehen sind, würde ich nicht darum kümmern.

Wenn die Eltern viele Kinder und diese Kinder wiederum haben viele andere hat, dann in diesem Fall die anfängliche ‚nachziehen‘ könnte das Netzwerk ersticken. Mein Vorschlag ist, ‚die Option‘ in diesem Fall zu verwenden, um die wählt aufzuspalten.

fetching = "join" Wenn Sie holen = „join“ es alle Informationen in einer einzigen Anweisung select retrive wird.

fetching = "select" wenn Sie die zweite SELECT-Anweisung holen die zugehörige Sammlung als in diesem Fall PAAS wollen Sie holen verwenden = „select“.

Quelle: Hibernate Fetching-Strategien

JOIN bevorzugt wird, in der Regel aus Leistungsgründen.

Der eine Grund SELECT zu verwenden ist, wenn man Ergebnisse sind Paging (Einstellen einer Verschiebung und eine Grenze), die eine viele-zu-viele-Beziehung haben. Wenn Sie JOIN verwenden, wird die Root-Entität mehrmals angezeigt, wenn es mehrere many-to-many Kinder enthält und diese „Kopien“ zählt gegen das Limit (auch wenn Hibernate bricht sie nach der Tat mit DISTINCT_ROOT_ENTITY).

Die Leute reden immer über Leistungseinbußen mit holen = JOIN . Aber, wie ich denke, ist es für uns wichtig, die Anzahl der Eltern / Kind-Aufzeichnungen zu verstehen, wir holen:

Wenn Sie nur einzelne Elternteil Datensatz holen wollen und hoffen, dass es nicht viele Kinder hat, dann würde vorschlagen ich Sie verwenden holen = SELECT .

Wenn Sie alle übergeordneten Datensätze einschließlich ihrer Kinder holen wollen, dann wäre es besser, gehen holen = JOIN

Nur eine Notiz hinzufügen, dass, wenn Aufzeichnungen lazily Kinder holen ( faul = true ), dann wäre es nicht sinnvoll, unter holen = JOIN , da die alle Eltern und Kind Aufzeichnungen in einem einzigen Schuss geladen werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top