2017-03-23 32 views
1

ブール型カラムが1つのテーブルがあります。Postgres SQL:ブール型カラムのインデックスを作成する

productid integer 
isactive (boolean) 

私はispublish

CREATE INDEX idx_product_ispublish ON product USING btree (ispublish) 

re execute 
SELECT productid 
     FROM 
     product 
     WHERE ispublish 
     LIMIT 15 OFFSET 0 
result 

enter image description here

のインデックスを作成しAffterクエリ

SELECT productid 
    FROM 
    product 
    WHERE ispublish 
    LIMIT 15 OFFSET 0 

enter image description here

を実行します3210は=>は差 私は 試みられてきた

しかし、結果は同じ私に説明することができます

CREATE INDEX idx_product_ispublish ON product USING btree (ispublish) 

CREATE INDEX idx_product_ispublish ON product USING btree (ispublish) 

CREATE INDEX idx_product_ispublish ON product (ispublish) WHERE ispublish is TRUE 

+0

よう部分インデックスを作成するのが最善であるispublish' WHERE - これは索引のみのスキャンをトリガーする必要があります(あなたのためにほとんどの場合、これはf.exを持つ行の数に依存します)。 - 部分インデックスの述語のWHERE句**は、使用するためにあなたのクエリの述語と一致しなければなりません**。 'WHERE ispublish'、' WHERE ispublish = TRUE'、 'WHERE ispublish IS TRUE'は3つの異なる述語です。 – pozs

答えて

5

PostgreSQLは、それが安いと思う場合にのみインデックスを使用します。 booleanのインデックスは、2つの可能な値しか取ることができません。ほとんどの場合、インデックスとテーブルでランダムなI/Oを使用するよりも、テーブル全体を順番に読み取るほうが安価です。テーブルを取得する必要があります。

boolean

列の索引は、ビットマップ・インデックス・スキャンを介して他のインデックスと組み合わせることができるデータ・ウェアハウス・シナリオにおける

  1. のみ有用です。

  2. テーブルの小数部分の値がTRUE(またはそれに関してはFALSE)の場合のみです。このケースでは、CREATE INDEXを `試してみてください...製品に(商品コード)

    CREATE INDEX ON mytab((1)) WHERE boolcolumn; 
    
+0

Laurenz Albeに感謝します –

関連する問題