ホームページ >データベース >mysql チュートリアル >PostgreSQL でページ分割されたデータの合計結果数を効率的に取得するにはどうすればよいですか?

PostgreSQL でページ分割されたデータの合計結果数を効率的に取得するにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-20 12:04:10191ブラウズ

How Can I Efficiently Retrieve the Total Result Count for Paginated Data in PostgreSQL?

ページング データの結果数の取得を最適化します

データ取得のページング機能を実装する場合、ページング コントロールを正確にレンダリングするには、合計ページ数を決定することが重要です。一般的なアプローチは 2 つのクエリを実行することです。1 つは COUNT() 関数を使用して結果の総数を取得し、もう 1 つは LIMIT 句を使用して現在のページ データを表示します。

しかし、このアプローチは非効率的です。 PostgreSQL はバージョン 8.4 以降ウィンドウ関数を導入し、より良いソリューションを提供しています。

ウィンドウ関数を使用する

ウィンドウ関数 COUNT(*) OVER() を使用すると、限られたデータを取得しながらクエリ内の結果の総数を計算できます。例は次のとおりです:

<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 句と OFFSET 句が適用される前の結果の合計数を示します。この方法では、条件を満たすすべての行をカウントする必要があるため、パフォーマンスに影響を与える可能性があることに注意してください。小さいテーブル、または full_count が OFFSET LIMIT 未満の場合、影響は最小限です。ただし、結果セットが大きい場合は、代替手段を検討する価値があります。

最終カウントの代替方法

ウィンドウ関数以外にも、完全なカウントを計算せずに最終的なカウントを取得する方法があります。

  • PostgreSQL 内部ログ: PostgreSQL は、最後の SQL コマンドによって影響を受けた行数に関する情報を保持します。クライアントは、たとえば、plpgsql の GET DIAGNOSTICS または PHP の pg_num_rows を使用して、このデータにアクセスできます。
  • LIMIT/OFFSET を使用した SQL コマンド: 元のクエリと同じ LIMIT 値と OFFSET 値を使用して別のクエリを実行します。最終的なカウントは、結果セット内の行数から取得できます。

以上がPostgreSQL でページ分割されたデータの合計結果数を効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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