2017-12-03 3 views
-2

Ich habe 3 Tabellen: users, posts und likes. Ein Beitrag heißt Hot Post, wenn es innerhalb der ersten Stunde nach der Erstellung mehr als 5 Likes hat. Folgendes wird verwendet, um nach einer Liste von Hot-Posts zu suchen. Kann mir jemand helfen, diese Abfrage zu verbessern (wie man sie indiziert oder umschreibt).Leistung verbessern postgresql Abfrage

+0

@TimBiegeleisen schaffen: es funktioniert. http://prntscr.com/hidlsc –

+1

Sie müssen mehr Informationen für jeden zur Verfügung stellen, um Ihnen wertvolle Einblicke zu geben. Zum Beispiel Ihre Tabellendefinitionen, vorhandene Indizes (falls vorhanden) und die Ausgabe von EXPLAIN. Versuchen Sie außerdem, Tabellenaliase nicht mit Großbuchstaben zu versehen, und entfernen Sie alle doppelten Anführungszeichen (zur besseren Lesbarkeit). – Nicarus

+3

Bitte ** [EDIT] ** Ihre Frage und fügen Sie die 'create table' Anweisungen für die fraglichen Tabellen (einschließlich aller Indizes) und den Ausführungsplan hinzu, der mit **' explain (analyze, buffers) '** erstellt wurde. [** Formatierter Text **] (http://stackoverflow.com/help/formatting) bitte, [keine Screenshots] (http://meta.stackoverflow.com/questions/285551/why-may-i-not -upload-images-of-code-auf-so-wenn-eine-Frage stellen/285557 # 285557) –

Antwort

1

Erstens, es sei denn, es kann wirklich einen Beitrag geben, der nicht zu einem Benutzer gehört, verwenden Sie einen inneren Join dort.

Unter der Annahme, dass es eine gute Anzahl von Posts und Likes gibt, wäre die beste Join-Strategie ein Merge-Join oder ein Hash-Join, den PostgreSQL automatisch auswählen sollte.

Für eine Mergeverknüpfung, könnten die folgenden Indizes hilfreich sein:

CREATE INDEX ON posts (id); 
CREATE INDEX ON likes (post_id); 

kein Index mit einem Hash-Join in diesem Fall helfen könnte.

Wenn der Planer eine verschachtelte Schleife wählt schließlich kommen, könnte es nützlich sein, die Abfrage neu zu schreiben:

... AND likes.created_at < post.created_at + INTERVAL '1 hour' 

und einen Index wie

CREATE INDEX ON likes (post_id, created_at); 
Verwandte Themen