Rechercher efficacement les valeurs maximales et les données associées dans de grandes tables SQL
Souvent, les requêtes de base de données nécessitent de trouver la valeur maximale dans une colonne et de récupérer les données correspondantes dans d'autres colonnes de la même ligne. Cela est particulièrement difficile avec de très grands ensembles de données. Considérons un tableau nécessitant de trouver le numéro de version le plus élevé pour chaque identifiant unique, ainsi que sa balise associée :
Exemple de tableau :
<code>ID | tag | version -----+-----+----- 1 | A | 10 2 | A | 20 3 | B | 99 4 | C | 30 5 | F | 40</code>
Résultat souhaité :
<code>ID | tag | version -----+-----+----- 2 | A | 20 3 | B | 99 4 | C | 30 5 | F | 40</code>
Pour les tables comportant environ 28 millions de lignes, les méthodes standard telles que les instructions SELECT
imbriquées ou les GROUP BY
simples avec MAX
peuvent être incroyablement lentes. Une solution beaucoup plus efficace utilise la ROW_NUMBER()
fonction window :
SELECT s.id, s.tag, s.version FROM ( SELECT t.*, ROW_NUMBER() OVER(PARTITION BY t.id ORDER BY t.version DESC) AS rnk FROM YourTable t ) s WHERE s.rnk = 1;
Cette requête fonctionne en deux étapes :
Requête interne : Elle attribue un rang unique (rnk
) à chaque ligne au sein de chaque ID
partition (groupe de lignes avec le même ID). Le classement est basé sur la colonne version
par ordre décroissant, ce qui signifie que la version la plus élevée obtient le rang 1.
Requête externe : Elle filtre les résultats de la requête interne, en sélectionnant uniquement les lignes où rnk = 1
. Cela nous donne effectivement la ligne avec le maximum version
pour chaque ID
.
Cette approche évite les requêtes imbriquées et les GROUP BY
opérations, ce qui la rend nettement plus rapide pour les grands ensembles de données. L'utilisation de ROW_NUMBER()
fournit un moyen propre et efficace d'obtenir le résultat souhaité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!