2016-12-05 7 views
0

私は7つのUUID列を持つテーブル "ps_wms.estoque"を持っています。 各列には索引索引があります。 表には、すべての列に固有の索引もあります。予期しないクエリプラン

create unique index idx on ps_wms.estoque (endereco_id, material_id, ..., origem_id); 

以下のクエリ句一意インデックスからすべての列を使用するが、クエリプランに応じて、それは同じ値を保持するカラムである単一の列(列programacao_id)のインデックスを使用している場合に有しますすべてのレコードについてそれは私には、このクエリは一意のインデックスを使用する必要がありますように見えますか?

select 
    * 
from 
    ps_wms.estoque a 
where 
    a.endereco_id = '8d4d99b1-98f3-4768-bbdf-3768dc2be341' 
    and a.material_id = '8d4d99b1-98f3-4768-bbdf-3768dc2be341' 
    and a.reserva_id = '8d4d99b1-98f3-4768-bbdf-3768dc2be341' 
    and a.programacao_id = '8d4d99b1-98f3-4768-bbdf-3768dc2be341' 
    and a.uma_id = '8d4d99b1-98f3-4768-bbdf-3768dc2be341' 
    and a.tipo = '8d4d99b1-98f3-4768-bbdf-3768dc2be341' 
    and a.origem_id = '8d4d99b1-98f3-4768-bbdf-3768dc2be341' 

Index Scan using estoque_fk5 on ps_wms.estoque a 
    Output: id, armazem_id, endereco_id, material_id, reserva_id, programacao_id, quantidade, version, uma_id, tipo, origem_id 
    Index Cond: ((a.programacao_id)::uuid = '8d4d99b1-98f3-4768-bbdf-3768dc2be341'::uuid) 
    Filter: (((a.endereco_id)::uuid = '8d4d99b1-98f3-4768-bbdf-3768dc2be341'::uuid) AND ((a.material_id)::uuid = '8d4d99b1-98f3-4768-bbdf-3768dc2be341'::uuid) AND ((a.reserva_id)::uuid = '8d4d99b1-98f3-4768-bbdf-3768dc2be341'::uuid) AND ((a.uma_id)::uuid = ' (...) 

DDL

CREATE INDEX estoque_fk1 ON ps_wms.estoque (endereco_id); 
CREATE INDEX estoque_fk2 ON ps_wms.estoque (material_id); 
CREATE INDEX estoque_fk3 ON ps_wms.estoque (reserva_id); 
CREATE INDEX estoque_fk4 ON ps_wms.estoque (armazem_id); 
CREATE INDEX estoque_fk5 ON ps_wms.estoque (programacao_id); 
CREATE INDEX estoque_fk6 ON ps_wms.estoque (uma_id); 
CREATE INDEX estoque_fk7 ON ps_wms.estoque (origem_id); 
CREATE UNIQUE INDEX iii ON ps_wms.estoque (endereco_id,material_id,reserva_id,programacao_id,uma_id,tipo,origem_id); 
+0

データの分布を調べる – Mihai

+0

テーブルには何行ありますか? –

+0

テーブル内に348行あります – Fabiano

答えて

1

私は何が起こっているのかを考え出しました。

where句で使用した値はランダム値でした。

列 'programacao_id'にはすべての行(n_distinct = 1)の値が1つしかなく、where句で渡された値がこの値ではないため、このクエリが返す列に基づいてエンジンが事前に認識しています空の結果セット。

where句で実際の値を使用する場合、計画は一意のインデックスを期待どおりに選択します。

関連する問題