7
votes

Groupe de comparaison par VS sur la partition par

supposer une table voiture avec deux colonnes car_id (int) et version (int) .

Je veux récupérer le maximum version de chaque voiture.

Il y a donc deux solutions (au moins): xxx

ou: xxx

sont ces deux requêtes de la même performance?


0 commentaires

3 Réponses :


3
votes

Oui, il peut affecter

La deuxième requête est un exemple de vue en ligne. C'est une méthode très utile pour effectuer des rapports avec différents types de comptes ou utilisation de toutes les fonctions globales avec elle.

Oracle exécute la sous-requête, puis utilise les lignes résultantes comme une vue de la clause de provenance.

Comme nous considérons la performance, recommandez toujours la vue en ligne au lieu de choisir un autre type de sous-requête.

Et une autre chose, la seconde requête donnera à tous les enregistrements Max, tandis que d'abord vous donnera un enregistrement maximal.

voir ici


1 commentaires

"Et une autre chose, la seconde requête donnera à tous les enregistrements Max, tandis que d'abord vous donnera un seul enregistrement maximum". Je ne comprends pas pourquoi vous avez écrit que la première colonne ne renvoie qu'un seul max. Les deux requêtes renvoient les mêmes résultats



3
votes

Cela dépendra de votre schéma d'indexation et de la quantité de données dans le tableau. L'optimiseur effectuera probablement différentes décisions basées sur les données réellement à l'intérieur de la table.

J'ai trouvé, au moins dans SQL Server (je sais que vous avez demandé à propos d'Oracle) que l'optimiseur est plus susceptible d'effectuer une analyse complète avec la partition par requête vs le groupe par requête. Mais ce n'est que dans les cas où vous avez un index contenant car_id et une version (descend) dedans.

La morale de l'histoire est que je vais tester à fond pour choisir le bon. Pour les petites tables, peu importe. Pour vraiment, de très gros ensembles de données, ni ne peuvent être rapides ...


0 commentaires

6
votes

Je sais que c'est extrêmement vieux mais je pensais que cela devrait être signalé. XXX PRE>

Je ne sais pas pourquoi vous avez fait l'option deux comme celle-là ... Dans ce cas, le SUB SELECT devrait être théoriquement plus lent. Parce que vous sélectionnez à partir de la même table 2X, puis rejoignez les résultats à elle-même. P>

Il suffit de supprimer la version de votre vue en ligne et qu'ils sont la même chose. P>

select car_id, max(version) over (partition by car_id) as max_version
  from car


0 commentaires