La requête la plus performante pour "select max in group"?
J'ai un tableau simple des commentaires (id INT, revision INT, comment VARCHAR(140))
avec un contenu comme ceci:
1|1|hallo1|
1|2|hallo2|
1|3|hallo3|
2|1|hallo1|
2|2|hallo2|
Je suis à la recherche d'une instruction SQL qui sera de retour à chaque commentaire avec le plus de révision:
1|3|hallo3|
2|2|hallo2|
J'ai trouvé cette solution:
select id, revision, comment
from comments
where revision = (
select max(revision)
from comments as f
where f.id = comments.id
);
mais il est très lent sur de grands ensembles de données. Sont-il mieux requêtes pour accomplir cette?
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Voici une manière qu'avec une indexation appropriée ne sera pas heinously lent et il n'utilise pas une sous-sélection:
Adapté à partir de requêtes ici:
http://www.xaprb.com/blog/2007/03/14/how-to-find-the-max-row-per-group-in-sql-without-subqueries/
(À partir d'une recherche google: max groupe par sql)
Assurez-vous d'avoir votre index correctement configuré. L'indexation sur l'id, la révision devrait être bon.
Voici une autre de prendre sur votre requête. Vous n'avez pas vérifié son plan d'exécution, mais si vous configurez l'indice eh bien, il devrait vous aider:
Editted d'ajouter:
http://www.microsoft.com/technet/prodtechnol/sql/2005/impprfiv.mspx
Editted de nouveau à ajouter info:
J'avais toujours aller avec la sous-requête.
Testé avec une de nos tables de qui a près de 1 million de lignes total. Il existe des index sur les deux champs CHAMP2 ET CHAMP3. Requête a retourné 83953 lignes en moins de 3 secondes sur notre boîte de dev.
Analytics serait ma recommandation.
Idée à partir du champ gauche, mais ce que sur l'ajout d'un champ supplémentaire à la table:
Alors quand vous faites un changement, définir l'indicateur sur la nouvelle révision et le retirer sur toutes les précédentes.
Votre requête serait alors simplement devenir:
Ce serait beaucoup plus facile sur la base de données et donc beaucoup plus rapide.
Un bien propre façon de faire "plus tard x par id" type de requêtes est ce. Il doit aussi être très facile à indexer correctement.
Pour les grandes tables, je trouve que cette solution a une meilleure performance:
Sans les sous-sélections (ou des tables temporaires):