Gibt true zurück, wenn alle Spaltenwerte wahr sind

8

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%     
mouckatron 22.10.2012, 15:55
quelle

3 Antworten

10

Aggregatfunktion bool_and()

Einfach, kurz, klar.

%Vor%

Ich zitiere das Handbuch hier :

%Vor%

Unterabfrageausdruck 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:

%Vor%

Indizes

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.

    
Erwin Brandstetter 22.10.2012, 17:07
quelle
5

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.

SQL Fiddle

    
Mike Christensen 22.10.2012 16:05
quelle
1
%Vor%

SQL Fiddle

    
Clodoaldo Neto 22.10.2012 16:12
quelle