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

一意でない列に一意のインデックスを作成する

    インデックスは実際の行にのみインデックスを付けることができ、集約された行にはインデックスを付けることができません。したがって、はい、目的のインデックスに関する限り、前述のような一意の値を持つテーブルを作成することが唯一のオプションです。 data.dayからの外部キー制約を使用して参照整合性を適用します days.dayへ 。これはかもしれない 完全な状況によっては、パフォーマンスにも最適です。

    ただし、これはパフォーマンスに関するものなので 、別の解決策があります。再帰CTEを使用してルーズインデックススキャンをエミュレートできます:

    WITH RECURSIVE cte AS (
       (  -- parentheses required
       SELECT day FROM data ORDER BY 1 LIMIT 1
       )
       UNION ALL
       SELECT (SELECT day FROM data WHERE day > c.day ORDER BY 1 LIMIT 1)
       FROM   cte  c
       WHERE  c.day IS NOT NULL  -- exit condition
       )
    SELECT day FROM cte;
    

    最初のSELECTをかっこで囲みます ORDER BYが添付されているため必要です およびLIMIT 条項。参照:

    これには、dayのプレーンインデックスのみが必要です 。

    実際のクエリに応じて、さまざまなバリエーションがあります:

    あなたのフォローアップ質問に対する私の答えの詳細:




    1. 単純な挿入ステートメントを使用して、バイナリファイルデータをバイナリSQLフィールドに挿入するにはどうすればよいですか?

    2. Oracle、PostgreSQL、SQLServerでタイムスタンプを比較する一般的な方法

    3. Tsrange-2つの範囲の差を計算する

    4. このmysql結合クエリを取得して目的の結果を生成できません