我有一个包含7个UUID列的表"ps_wms.estoque“。每一列都有一个单一索引。该表对所有列也有唯一的索引。
create unique index idx on ps_wms.estoque (endereco_id, material_id, ..., origem_id);下面的查询有一个where子句,它使用唯一索引中的所有列,但根据查询计划,它在单个列(列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);发布于 2016-12-05 16:37:37
我知道是怎么回事了。
我在where子句中使用的值是随机值。
由于列'programacao_id‘对于所有行只有一个值(n_distinct = 1),并且我在where子句中传递的值不是这个值,因此引擎根据该列预先知道这个查询将返回一个空的结果集。
如果我在where子句中使用实值,则计划会按预期选择唯一索引。
https://stackoverflow.com/questions/40965968
复制相似问题