Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Memilih Baris Maks dengan Cekap daripada Pemisahan Tanpa Imbasan Jadual Berbilang?

Bagaimana untuk Memilih Baris Maks dengan Cekap daripada Pemisahan Tanpa Imbasan Jadual Berbilang?

Susan Sarandon
Susan Sarandonasal
2025-01-21 08:19:09490semak imbas

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

Dapatkan baris terbesar dalam partition dengan cekap dan elakkan akses jadual berlebihan

Dalam bidang pertanyaan data, kecekapan adalah penting, terutamanya apabila berurusan dengan jadual besar. Cabaran pengoptimuman yang biasa adalah untuk mencari baris dengan nilai terbesar dalam lajur tertentu daripada setiap partition jadual.

Andaikan kita perlu mendapatkan markah yang diperolehi oleh setiap ID dalam pusingan terkini (PUSINGAN) daripada jadual SKOR:

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

Kaedah awal:

Salah satu cara ialah mendapatkan semula semua baris dan kemudian menapis baris yang tidak mewakili PUSINGAN maksimum setiap ID:

<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>

Walaupun kaedah ini berkesan, ia tidak cekap kerana imbasan jadual yang berlebihan.

Pelan pengoptimuman:

Satu lagi cara yang lebih cekap ialah menggunakan fungsi tetingkap dan klausa DISTINCT:

<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>

Dalam kaedah ini, fungsi tetingkap max(round) OVER (PARTITION BY id) mengira PUSINGAN maksimum untuk setiap ID. Kemudian gunakan klausa DISTINCT selepas fungsi tetingkap, memastikan hanya baris PUSINGAN tertinggi untuk setiap ID dikembalikan. Akhir sekali, fungsi tetingkap first_value(score) OVER (PARTITION BY id ORDER BY round DESC) mendapatkan semula SKOR pertama yang dikaitkan dengan ROUND terbesar untuk setiap ID.

Skim yang dioptimumkan ini mencapai hasil yang diinginkan tanpa memerlukan beberapa imbasan jadual, meningkatkan prestasi dengan ketara.

Atas ialah kandungan terperinci Bagaimana untuk Memilih Baris Maks dengan Cekap daripada Pemisahan Tanpa Imbasan Jadual Berbilang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn