ホームページ > バックエンド開発 > PHPチュートリアル > PostgreSQL で LIMIT を適用する前に合計行数を効率的に取得するにはどうすればよいですか?

PostgreSQL で LIMIT を適用する前に合計行数を効率的に取得するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-19 02:22:11
オリジナル
425 人が閲覧しました

How to Efficiently Get Total Row Count Before Applying LIMIT in PostgreSQL?

LIMIT を適用する前に結果の数を決定する最良の方法

データベース クエリでは、LIMIT を適用する前に結果の総数を決定することがページネーションにとって重要です。現在、一般的なアプローチでは、クエリを 2 回実行します。1 回目はすべての結果をカウントし、もう 1 回目は制限付きで目的のページを取得します。ただし、この方法は非効率的になる可能性があります。

幸いなことに、PostgreSQL 8.4 では、ウィンドウ関数というより効率的なソリューションが導入されました。ウィンドウ関数を使用すると、単一のクエリで合計結果数と制限された結果の両方を取得できます。

SELECT foo
     , count(*) OVER() AS full_count
FROM   bar
WHERE  <some condition>
ORDER  BY <some col>
LIMIT  <pagesize>
OFFSET <offset>;
ログイン後にコピー

この方法では必要な情報が得られますが、すべての点で計算コストが高くなる可能性があることに注意してください。行は、LIMIT によって除外される場合でも処理する必要があります。

SELECT 内のイベントのシーケンスQuery

SELECT クエリ内のイベントのシーケンスを理解すると、ウィンドウ関数の動作を理解するのに役立ちます。 Postgres での操作の順序は次のとおりです。

  1. WHERE 句に基づいて行をフィルタリング
  2. ウィンドウ関数を適用
  3. ORDER BY に基づいて結果を並べ替え
  4. LIMIT に基づいて結果を制限し、 OFFSET

数を取得するための代替方法

ウィンドウ関数に加えて、影響を受ける行数を取得する代替方法があります。

  • plpgsql: 診断の取得 integer_var = ROW_COUNT;
  • PHP: pg_num_rows

これらのメソッドは、LIMIT 適用前の完全な数ではなく、クエリによって影響を受ける行数を提供します。

関連リソース:

  • [大きなテーブルで OFFSET を使用してクエリを最適化する](https://dba.stackexchange.com/questions/128089/optimize-query-with-offset-on-large-table)
  • [バッチクエリの影響を受ける行数を計算します。 PostgreSQL](https://stackoverflow.com/questions/4644316/calculate-number-of-rows-affected-by-batch-query-in-postgresql)

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート