ホームページ >データベース >mysql チュートリアル >PostgreSQL クエリで LIMIT を適用する前に合計行数を効率的に判断するにはどうすればよいですか?

PostgreSQL クエリで LIMIT を適用する前に合計行数を効率的に判断するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-20 12:08:10454ブラウズ

How Can I Efficiently Determine the Total Row Count Before Applying LIMIT in PostgreSQL Queries?

PostgreSQL クエリで LIMIT 前の合計行数を効率的に取得します

データベース データ ページングでは、通常、ページング コントロールをレンダリングするための合計ページ数を決定する必要があります。通常、これには 2 つの別々のクエリを実行する必要があります。1 つは COUNT() を使用して合計を取得し、もう 1 つは LIMIT を使用して現在のページのデータを取得します。

この方法は非効率的です。幸いなことに、PostgreSQL には、LIMIT を適用する前に合計を取得するより良い方法があります。ウィンドウ関数を使用します。

SQL ウィンドウ関数

PostgreSQL 8.4 で導入されたウィンドウ関数を使用すると、「ウィンドウ」で定義されたデータセットに対して計算を実行できます。適切なウィンドウを指定することで、LIMIT 操作に影響を与えることなく合計を取得できます。

次のクエリを考えてみましょう:

<code class="language-sql">SELECT foo, COUNT(*) OVER() AS full_count
FROM bar
WHERE <some condition="">
ORDER BY <some col="">
LIMIT <pagesize>
OFFSET <offset>;</code>

ここで、full_count は LIMIT が適用される前の合計行数を示します。

注: この方法でウィンドウ関数を使用すると、従来の 2 つのクエリを使用するアプローチよりも計算コストが高くなる可能性があります。これは、ページング パラメーターに関係なく、すべての行をカウントする必要があるためです。

合計数の代替方法

場合によっては、LIMIT より前の合計を取得する必要はありません。代替案は次のとおりです:

  1. LIMIT と OFFSET を使用してクエリを実行します。
  2. クライアント関数を使用して、影響を受ける行の数をカウントします (例: PL/pgSQL の GET DIAGNOSTICS または PHP の pg_num_rows)。

その他の考慮事項

  1. SQL クエリ内のイベントの順序はパフォーマンスに影響します。 LIMIT および OFFSET 操作は、フィルタリング、グループ化、およびその他の操作の後に適用されます。
  2. 大きなテーブルで LIMIT と OFFSET を使用するのは非効率的です。パフォーマンスを向上させるために、他の方法の使用を検討してください。

以上がPostgreSQL クエリで LIMIT を適用する前に合計行数を効率的に判断するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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