PostgreSQL 7.4 - Verständnisproblem ...
Geizhals » Forum » Programmierung » PostgreSQL 7.4 - Verständnisproblem ... (3 Beiträge, 64 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
PostgreSQL 7.4 - Verständnisproblem ...
01.01.2006, 16:09:35
Hi !

Gegeben sei eine Tabelle mit ein paar Millionen Datensatzzeilen - und unter anderem gebe es ein Attribut "fixstop", das ein Boolean not null ist.

Die Histogramme sind noch auf dem Defaultwert 10, und auf den Boolean gebe es einen Index.

Hier ein paar Ausgaben:

SELECT attname, n_distinct, most_common_vals FROM pg_stats WHERE tablename = 'lieferliste';
....

fixstop |          1 | {f}
# Es sind also nur 'false-Werte' in der DB gespeichert.

kis2_prod=# EXPLAIN select * from lieferliste where fixstop='t';
                                  QUERY PLAN
------------------------------------------------------------------------------
 Index Scan using idx_test on lieferliste  (cost=0.00..2.01 rows=1 width=118)
   Index Cond: (fixstop = true)
# Bei einer Query nach 't' erkennt er anhand der Statistic die Selektivität von 't' - und geht über den Index - soweit ok

kis2_prod=# EXPLAIN select * from lieferliste where fixstop='f';
                              QUERY PLAN
-----------------------------------------------------------------------
 Seq Scan on lieferliste  (cost=0.00..55892.88 rows=1379510 width=118)
   Filter: (fixstop = false)
(2 Zeilen)
# Bei einer Query nach 'f' erkennt er anhand der Statistic die Wertlosigkeit der WHERE-Clause - und macht korrekt einen Full Table Scan.


EXPLAIN select * from lieferliste where fixstop;
                           QUERY PLAN
-----------------------------------------------------------------
 Seq Scan on lieferliste  (cost=0.00..52444.10 rows=1 width=118)
   Filter: fixstop
# Das hier versteh ich nicht.


Nun zu meiner Frage:
In der Tabelle gibt es keinen einzigen True-wert für fixstop - wie man an der ersten Query sieht.
Daher ist für mich der Weg bei der Query nach "fixstop='t'" völlig klar. Mich verblüfft allerdings, daß ein "WHERE fixstop='t'" kein Synonym zu "WHERE fixstop" ist - denn da macht er ja den full table scan.

In der Doku habe ich keinen Hinweis drauf gefunden - wie lautet jetzt die genaue Vorgehensweise des Optimizers ? Und... läßt sich dieses Feature sinnvoll nutzen ? Bleibt das Verhalten konstant oder kann es sein, daß sich das mit der 8er oder 8.1er bereits geändert hat ?


EDIT:
Die Queries wurden direkt nach einem VACUUM ANALYZE abgesetzt, an veralteten Statistiken dürft's aber nicht liegen. Einsatzszenario: Die Millionen Datensatzzeilen werden bleiben - und es werden maximal 50 das fixstop auf 'true' gesetzt bekommen - ein Index-Scan macht also sowohl bei "WHERE fixstop" als auch bei "WHERE fixstop='t'" durchaus Sinn.

01.01.2006, 16:23 Uhr - Editiert von gepeinigter_aon_neukunde, alte Version: hier
[ Dieser Beitrag wurde inzwischen editiert. Die aktuelle Version befindet sich hier. ]
Antworten PM Alle Chronologisch
 
Melden nicht möglich
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung