データベース データを操作する場合、ページ分割されたナビゲーション コントロールをレンダリングするには、合計ページ数を決定することが重要です。従来のアプローチではクエリを 2 回実行しますが、これは非効率的です。この記事では、必要なクエリの数を最小限に抑えながら結果数を決定する別の方法を検討します。
PostgreSQL バージョン 8.4 以降、ウィンドウ関数は、単一のクエリで完全なカウント結果と制限された結果セットの両方を収集する強力な方法を提供します。 OVER()
句を count(*)
関数と組み合わせて使用すると、開発者は 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>
このアプローチは、制限された結果セットを単に取得するよりも計算コストが高くなる可能性があることに注意することが重要です。したがって、完全なカウントと制限された結果セットの両方が必要な場合は、このメソッドを使用することをお勧めします。
完全なカウントが必要ない場合は、影響を受ける行のカウントを取得する他の方法があります。 PostgreSQL は、クライアントがアクセスできる内部簿記情報を維持します。 PHP では、この目的のために pg_num_rows
関数を使用できます。さらに、plpgsql は行数を取得するための GET DIAGNOSTICS
コマンドを提供します。
SELECT
クエリが実行される順序を理解することが重要です。これは、LIMIT
句と OFFSET
句の適用方法に影響します。 WHERE
句はベース テーブルから条件を満たす行をフィルタリングし、フィルタリングされたサブセットにウィンドウ関数が適用されます。
OFFSET
はページングに便利ですが、テーブル内の行数が増えると効率が低下します。カーソルを利用したり、OFFSET
を使用してクエリを最適化するなどの代替手段の使用を検討してください。
以上がPostgreSQL で LIMIT 句を適用する前に合計結果数を効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。