2016-05-10 1 views
1

Je suis en cours d'exécution d'une requête comme ceci:Comment un SELECT avec un terme ET supplémentaire peut-il produire plus de lignes que sans lui?

Dans la première variante
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; 

, j'omettent la dernière ligne AND me.id = 123 et obtenir 0 lignes tandis que dans la deuxième variante j'inclure cette ligne et obtenir 1 rang.

Dans une autre variante où la dernière ligne est AND me.id >= 123, j'obtiens 0 lignes.

J'utilise psql pour interroger la base de données. Qu'est-ce qui me manque, et comment puis-je résoudre ce problème? Je pensais que AND conditions peuvent seulement réduire le nombre de correspondances.

Est-ce que quelqu'un connaît de tels bogues PostgreSQL où les lignes disparaissent ou disparaissent, peut-être avec des liens vers des tickets de bogues ou autre chose?

semble lié à mon autre question:
How can PDO not return a row which pg_query() does?

+2

Quel type de données est 'me.id'? Pouvez-vous fournir une configuration de test complète pour reproduire cela? Le plan d'exécution affiche-t-il une recherche d'index pour cette colonne? Si oui, recréer l'index aide-t-il? –

+2

C'est probablement en combinaison avec ce que vous avez dans votre LEFT JOIN et les autres parties de WHERE –

+0

'me.id' est de type' serial NOT NULL'. Nous allons essayer de recréer l'index pendant les heures de nuit où la charge est faible. J'ai mis à jour ma requête avec la vraie, que j'ai réussi à minimiser tout en produisant toujours les mêmes résultats. Pour moi, les «JOIN» semblent entièrement sans méfiance. – Archimedix

Répondre

0

Recréer les index fixe le problème.

Maintenant, je me demande comment on peut détecter les index corrompus ou incohérents pour effectuer automatiquement une réindexation.

+1

Quelle est la version ** exacte ** de Postgres que vous utilisez? –

+0

La version 9.4 la plus récente est 9.4.7 et il y avait beaucoup de corrections de bugs entre 9.4.2 et 9.4.7 donc je ne serais pas surpris si la version actuelle ne montre pas ce comportement. [Citation de la page d'accueil] (http://www.postgresql.org/support/versioning/): "* Tous les utilisateurs doivent mettre à niveau vers la version mineure la plus récente dès que possible.Tandis que les mises à jour présentent toujours un risque, les versions mineures de PostgreSQL corriger uniquement les bogues de corruption de données et de sécurité fréquemment rencontrés pour réduire le risque de mise à niveau. ** La communauté considère que la mise à niveau n'est pas plus risquée que la mise à jour *** " –

+0

Je sais, mais ce n'est pas mon pouvoir. – Archimedix