Ich habe in der Dokumentation den Unterschied zwischen count(*)
und gesehen count(pk)
. Ich hatte count(pk)
(wo pk
ist a SERIAL PRIMARY KEY
) verwendet, ohne über die Existenz von zu wissen count(*)
.
Meine Frage betrifft die internen Optimierungen von Postgres. Ist es klug genug zu erkennen, dass a SERIAL PRIMARY KEY
in jeder Zeile existieren wird und niemals falsch ist und nur Zeilen zählt, oder wird es redundante Prädikatprüfungen für jede Zeile durchführen? Ich stimme zu, dass dies wahrscheinlich eine zu sinnlose Optimierung ist, aber ich bin nur neugierig.
Ich nahm einen Blick auf die Ausgabe von EXPLAIN
und EXPLAIN VERBOSE
für count(*)
, count(id)
und count(id > 50)
zu sehen , ob EXPLAIN
erwähnt die Prädikate in seiner Ausgabe zu überprüfen. Das tut es nicht.
NOT NULL
Spalte ist der Unterschied groß, wenn Sie viele Zeilen haben. In unserem Fall mit Millionen von ZeilenCOUNT(*)
ist das dreimal schneller. (Postgres 9.4)