Heim > Datenbank > MySQL-Tutorial > Wie wählt man effizient die maximale Zeile aus Partitionen ohne mehrere Tabellenscans aus?

Wie wählt man effizient die maximale Zeile aus Partitionen ohne mehrere Tabellenscans aus?

Susan Sarandon
Freigeben: 2025-01-21 08:19:09
Original
445 Leute haben es durchsucht

How to Efficiently Select the Max Row from Partitions Without Multiple Table Scans?

Erhalten Sie effizient die größte Zeile in der Partition und vermeiden Sie redundanten Tabellenzugriff

Im Bereich der Datenabfrage ist Effizienz entscheidend, insbesondere beim Umgang mit großen Tabellen. Eine häufige Optimierungsherausforderung besteht darin, in jeder Partition einer Tabelle die Zeile mit dem größten Wert in einer bestimmten Spalte zu finden.

Angenommen, wir müssen die von jeder ID in der letzten Runde (ROUND) erzielte Punktzahl aus der SCORES-Tabelle abrufen:

ID ROUND SCORE
1 1 3
1 2 6
1 3 2
2 1 10
2 2 12
3 1 6

Anfängliche Methode:

Eine Möglichkeit besteht darin, alle Zeilen abzurufen und dann diejenigen herauszufiltern, die nicht die maximale ROUND pro ID darstellen:

<code class="language-sql">SELECT * FROM 
(SELECT id, round,
CASE WHEN (MAX(round) OVER (PARTITION BY id)) = round THEN score ELSE NULL END score
 FROM
 SCORES
 where id in (1,2,3)
) scorevals
WHERE
scorevals.round is not null;</code>
Nach dem Login kopieren

Obwohl diese Methode funktioniert, ist sie aufgrund redundanter Tabellenscans ineffizient.

Optimierungsplan:

Eine weitere effizientere Möglichkeit ist die Verwendung von Fensterfunktionen und der DISTINCT-Klausel:

<code class="language-sql">SELECT DISTINCT
       id
      ,max(round) OVER (PARTITION BY id) AS round
      ,first_value(score) OVER (PARTITION BY id ORDER BY round DESC) AS score
FROM   SCORES
WHERE  id IN (1,2,3)
ORDER  BY id;</code>
Nach dem Login kopieren

Bei dieser Methode berechnet die Fensterfunktion max(round) OVER (PARTITION BY id) den maximalen ROUND für jede ID. Wenden Sie dann nach der Fensterfunktion eine DISTINCT-Klausel an, um sicherzustellen, dass nur die höchste ROUND-Zeile für jede ID zurückgegeben wird. Schließlich ruft die Fensterfunktion first_value(score) OVER (PARTITION BY id ORDER BY round DESC) den ersten SCORE ab, der der größten ROUND für jede ID zugeordnet ist.

Dieses optimierte Schema erzielt die gewünschten Ergebnisse, ohne dass mehrere Tabellenscans erforderlich sind, was die Leistung erheblich verbessert.

Das obige ist der detaillierte Inhalt vonWie wählt man effizient die maximale Zeile aus Partitionen ohne mehrere Tabellenscans aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage