Retourne true si toutes les valeurs des colonnes sont remplies
Est-il un moyen plus rapide dans PostgreSQL pour essentiellement faire un si sur plusieurs lignes?
Dire que j'ai une table
ticket | row | archived
1 | 1 | true
1 | 2 | true
1 | 3 | true
2 | 1 | false
2 | 2 | true
Est-il un moyen que je pouvais faire une instruction if à travers le bas de la colonne où ticket = ?
De sorte que, lorsque ticket = 1 serait vrai, car
true && true && true = true
et où ticket = 2 serait faux car
false && true = false
Ou devrais-je simplement s'en tenir à
SELECT ( (SELECT COUNT(*) FROM table WHERE ticket = 1)
= (SELECT COUNT(*) FROM table WHERE ticket = 1 AND archived = true) )
OriginalL'auteur mouckatron | 2012-10-22
Vous devez vous connecter pour publier un commentaire.
Fonction d'agrégation
bool_and()
Simple, court, clair.
Je cite le manuel ici:
Sous-requête expression
EXISTE
- comme @Mike fourniPlus rapide. Mais vous devez vérifier en outre si les lignes avec
ticket = 1
existent, ou vous obtiendrez des résultats incorrects pour les non-existant billets:Index
Les deux formes peut et va utiliser un index comme:
.. ce qui rend à la fois rapide, mais la
EXISTS
requête plus rapide, parce que cette forme peut cesser afin de scan dès que la première ligne correspondante est trouvée. Il n'y a pratiquement aucune différence entre les deux requêtes avec seulement quelques lignes par billet, mais un substantielle différence pour le nombre de lignes par billet.De faire usage de index-analyse uniquement en pg 9.2 vous avez besoin d'une multi-index de colonne de la forme:
Celui-ci est mieux dans
en tout casla plupart des cas, et la version de PostgreSQL. En raison de l'alignement des données, l'ajout d'unboolean
à lainteger
dans l'index ne doit pas faire l'index de croître à tous. Avantage supplémentaire pour presque aucun coût.Cependant, des colonnes indexées empêcher CHAUD (Tas Seul Tuple) les mises à jour. Dire un
UPDATE
ne change que la colonnearchived
. Si la colonne n'est pas utilisée par un index (en quelque sorte), la ligne peut être mis à jour à CHAUD. Le reste, ce raccourci ne peut pas être pris. J'ai écrit plus CHAUDES mises à jour dans cette réponse.Alors, comme toujours, tout dépend de votre charge de travail.
J'ai creusé un peu plus profond, a couru quelques tests et ajouté un peu sur les index et les performances de ma réponse.
Je vous remercie de votre temps pour répondre! Je l'accepte Erwin réponse, parce que le beaucoup plus courte, le code va s'asseoir mieux dans ma requête! Les performances ne devraient pas être de trop, je n'attends pas cette requête à exécuter, sur plus de quelques lignes par billet. Merci les gars!
J'ai ajouté un peu sur les mises à jour. Pourraient être d'intérêt pour vous, si vous avez beaucoup de
UPDATE
s.Je suis toujours impressionné par vos connaissances de Postgres. Je upvoted des dizaines de vos réponses maintenant.
OriginalL'auteur Erwin Brandstetter
Comment au sujet de quelque chose comme:
Je pense que cela pourrait être plus avantageux de comparer les comtes, en tant que
count
peut ou ne peut pas utiliser un index et vraiment tout ce que vous devez savoir, c'est si toutFALSE
lignes existent pour ce billet. Je pense que la création d'un index partiel surticket
pourrait être incroyablement rapide.SQL Violon
bien sûr, count() peut utiliser un index.
select count(*) from foo where some_col = 1
peut utiliser un index sur some_col si ce n'est pas revenir trop de lignes.count()
de ne pas utiliser un index si vous comptez tous des lignes dans une table (sans aucune restriction)Oh merci pour la compensation que! J'ai été un peu curieux, après ceci récente de la question, je vois que vous aussi commenté.
vous avez raison, je ne l'aurais pas laisser Mike me confondre 😉
OriginalL'auteur Mike Christensen
SQL Violon
OriginalL'auteur Clodoaldo Neto