2016-05-10 2 views
1

ich eine Abfrage wie folgt ausgeführt werden:Wie kann ein SELECT mit einem zusätzlichen UND-Begriff mehr Zeilen ergeben als ohne?

SELECT distinct me.* 
    FROM me 
    LEFT JOIN has_things ON has_things.me_id = me.id 
    LEFT JOIN has_refs ON has_refs.thing_id = has_things.thing_id 
    WHERE 
     has_refs.ref_id = 456 
     AND me.id=123; 

In der ersten Variante, ich die letzte Zeile AND me.id = 123 und bekommen 0 Zeilen, während in der zweiten Variante auslassen ich diese Zeile enthalten und 1 Reihe bekommen.

In einer anderen Variante, in der die letzte Zeile AND me.id >= 123 ist, bekomme ich 0 Zeilen.

Ich verwende psql, um die Datenbank abzufragen.

Was fehlt mir und wie kann ich das beheben? Ich dachte, AND Bedingungen können nur die Anzahl der Übereinstimmungen reduzieren.

Kennt jemand solche PostgreSQL Bugs wo Zeilen einfach verschwinden oder verschwinden, vielleicht mit Links zu Bugtickets oder so?

Scheint meine andere Frage bezogen werden:
How can PDO not return a row which pg_query() does?

+2

Welcher Datentyp ist 'me.id'? Können Sie ein komplettes Testsetup zur Verfügung stellen, um dies zu reproduzieren? Zeigt der Ausführungsplan eine Indexsuche für diese Spalte an? Wenn ja, hilft die Neuerstellung des Index? –

+2

Es ist wahrscheinlich in Kombination mit dem, was Sie in Ihrem LINKEN JOIN und den übrigen Teilen von WHERE –

+0

'me.id' vom Typ' serial NOT NULL' haben. Wir werden versuchen, den Index während der Nachtstunden, wo die Last niedrig ist, neu zu erstellen. Ich aktualisierte meine Abfrage mit der echten, die ich minimieren konnte, während ich immer noch die gleichen Ergebnisse produzierte. Für mich ist der 'JOIN' Look völlig unverdächtig. – Archimedix

Antwort

0

die Indizes Recreating das Problem behoben.

Jetzt frage ich mich, wie man korrupte oder inkonsistente Indizes erkennen kann, um automatisch eine Neuindizierung durchzuführen.

+1

Was ist die ** genaue ** Postgres-Version, die Sie verwenden? –

+0

Die neuste Version 9.4 ist 9.4.7 und es gab viele Bugfixes zwischen 9.4.2 und 9.4.7, so dass ich nicht überrascht wäre, wenn die aktuelle Version dieses Verhalten nicht zeigen würde. [Zitat von der Homepage] (http://www.postgresql.org/support/versioning/): "* Alle Benutzer sollten so schnell wie möglich auf die neueste Minor-Version aktualisieren. Während Upgrades immer ein gewisses Risiko haben, PostgreSQL Minor Releases Behebt nur häufig auftretende Fehler, Sicherheitslücken und Fehler bei der Datenkorruption, um das Risiko eines Upgrades zu verringern. ** Die Community betrachtet Upgrades nicht als riskanter als Upgrades. *** " –

+0

Ich weiß, aber das liegt nicht an meiner Macht. – Archimedix

Verwandte Themen