sql >> データベース >  >> RDS >> PostgreSQL

SELECT DISTINCTは、PostgreSQLのテーブルで予想よりも遅い

    Postgresにはまだインデックススキップスキャンはありませんが、それをエミュレートします:

    WITH RECURSIVE cte AS (
       (   -- parentheses required
       SELECT product_id
       FROM   tickers
       ORDER  BY 1
       LIMIT  1
       )
       UNION ALL
       SELECT l.*
       FROM   cte c
       CROSS  JOIN LATERAL (
          SELECT product_id
          FROM   tickers t
          WHERE  t.product_id > c.product_id  -- lateral reference
          ORDER  BY 1
          LIMIT  1
          ) l
       )
    TABLE  cte;
    

    (product_id)にインデックスを付ける およびテーブル内の40の一意の製品IDのみ これは高速である必要があります 。大文字でF
    (product_id, trade_id)のPKインデックス それにもいいです!

    product_idあたりの行数はごくわずかです。 (データ分散の反対)、DISTINCT / DISTINCT ON 同じくらい速いかもっと速いでしょう。

    インデックススキップスキャンを実装するための作業が進行中です。
    参照:

    • 各GROUPBYグループの最初の行を選択しますか?
    • GROUP BYクエリを最適化して、ユーザーごとに最新の行を取得します
    • 複合インデックスは、最初のフィールドのクエリにも適していますか?



    1. MySQLAUTO_INCREMENTはロールバックしません

    2. アプリのデータベースは常に必要ですか?

    3. エラー:複数の戻り値を持つクエリのTypedQueryを作成できません

    4. サブクエリがEXISTSで導入されていない場合、選択リストで指定できる式は1つだけです。