Gibt es einen schnelleren Weg in PostgreSQL, um im Wesentlichen ein if in mehreren Zeilen zu machen?
Sagen Sie, ich habe eine Tabelle
%Vor%Gibt es eine Möglichkeit, eine if-Anweisung quer durch die Spalte zu machen, wo ticket =? Also, wo Ticket = 1 wäre wahr, weil
%Vor%und wo ticket = 2 wäre falsch weil
%Vor%Oder sollte ich einfach bei
bleiben %Vor%bool_and()
Einfach, kurz, klar.
%Vor%Ich zitiere das Handbuch hier :
%Vor%EXISTS
- wie @Mike bereitgestellt
Schneller. Sie müssen aber zusätzlich prüfen, ob Zeilen mit ticket = 1
überhaupt existieren, oder Sie erhalten falsche Ergebnisse für nicht existierende Tickets:
Beide Formen können und werden einen Index verwenden wie:
%Vor% .. was beides schnell macht, aber EXISTS
query schneller , weil dieses Formular abbrechen kann zu scannen, sobald die erste passende Zeile gefunden wird. Es gibt kaum einen Unterschied zwischen den beiden Abfragen mit nur wenigen Zeilen pro Ticket, aber eine wesentliche Differenz für viele Zeilen pro Ticket.
Um Nur-Index-Scans in S. 9.2 zu verwenden, benötigen Sie eine mehrspaltiger Index des Formulars:
%Vor% Dies ist besser in jedem Fall in den meisten Fällen und in jeder Version von PostgreSQL. Aufgrund der Datenausrichtung wird durch das Hinzufügen eines boolean
zum integer
im Index der Index nicht vergrößert . Zusatznutzen für kaum einen Preis.
Indizierte Spalten verhindern jedoch Aktualisierungen (Heap Only Tuple). Angenommen, ein UPDATE
ändert nur die Spalte archived
. Wenn die Spalte von keinem Index (in irgendeiner Weise) verwendet wird, kann die Zeile HOT-aktualisiert werden. Andernfalls kann diese Verknüpfung nicht verwendet werden. Ich habe mehr über HOT-Updates in dieser Antwort geschrieben.
Wie immer hängt das alles von Ihrer genauen Arbeitsbelastung ab.
Wie wäre es mit etwas wie:
%Vor% Ich denke, dies könnte gegenüber dem Vergleich der Zählimpulse von Vorteil sein, da ein count
möglicherweise einen Index verwendet und wirklich alles, was Sie wissen müssen, ist, ob irgendwelche FALSE
Zeilen für dieses Ticket existieren. Ich denke, nur einen partiellen Index auf ticket
zu erstellen, könnte unglaublich schnell sein.
Tags und Links sql postgresql aggregate-functions boolean-logic exists