ホームページ >データベース >mysql チュートリアル >大規模な SQL データベース テーブルから最大値と対応するデータを効率的に取得するにはどうすればよいですか?

大規模な SQL データベース テーブルから最大値と対応するデータを効率的に取得するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-07 17:21:41681ブラウズ

How to Efficiently Retrieve the Maximum Value and Corresponding Data from a Large SQL Database Table?

大規模な SQL テーブル内の最大値と関連データを効率的に検索する

多くの場合、データベース クエリでは、列内の最大値を見つけて、同じ行内の他の列から対応するデータを取得する必要があります。 これは、非常に大規模なデータセットの場合に特に困難です。 各一意の ID とそれに関連付けられたタグの最大のバージョン番号を検索する必要があるテーブルを考えてみましょう:

サンプルテーブル:

<code>ID  |  tag  |  version
-----+-----+-----
1 |  A  |  10
2 |  A  |  20
3 |  B  |  99
4 |  C  |  30
5 |  F  |  40</code>

望ましい結果:

<code>ID  |  tag  |  version
-----+-----+-----
2  |  A  |  20
3  |  B  |  99
4  |  C  |  30
5  |  F  |  40</code>

約 2,800 万行のテーブルの場合、ネストされた SELECT ステートメントや GROUP BY を使用した単純な MAX などの標準メソッドは非常に遅くなる可能性があります。 より効率的なソリューションは、ROW_NUMBER() ウィンドウ関数を使用します。

<code class="language-sql">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;</code>

このクエリは 2 つのステップで機能します:

  1. 内部クエリ:rnk パーティション (同じ ID を持つ行のグループ) 内の各行に一意のランク (ID) を割り当てます。ランキングは version 列に基づいて降順に決定されます。つまり、最高のバージョンがランク 1 になります。

  2. 外部クエリ: 内部クエリの結果をフィルターし、rnk = 1 の行のみを選択します。 これにより、各 version の最大 ID を持つ行が効果的に得られます。

このアプローチでは、ネストされたクエリと GROUP BY 操作が回避され、大規模なデータセットの処理が大幅に高速化されます。 ROW_NUMBER() を使用すると、目的の結果を達成するためのクリーンで効率的な方法が提供されます。

以上が大規模な SQL データベース テーブルから最大値と対応するデータを効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。