首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >意外的查询计划

意外的查询计划
EN

Stack Overflow用户
提问于 2016-12-05 09:48:20
回答 1查看 21关注 0票数 0

我有一个包含7个UUID列的表"ps_wms.estoque“。每一列都有一个单一索引。该表对所有列也有唯一的索引。

代码语言:javascript
复制
create unique index idx on ps_wms.estoque (endereco_id, material_id, ..., origem_id);

下面的查询有一个where子句,它使用唯一索引中的所有列,但根据查询计划,它在单个列(列programacao_id)上使用索引,该列对所有记录都保持相同的值。在我看来,这个查询应该使用唯一索引,不是吗?

代码语言:javascript
复制
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

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

发布于 2016-12-05 16:37:37

我知道是怎么回事了。

我在where子句中使用的值是随机值。

由于列'programacao_id‘对于所有行只有一个值(n_distinct = 1),并且我在where子句中传递的值不是这个值,因此引擎根据该列预先知道这个查询将返回一个空的结果集。

如果我在where子句中使用实值,则计划会按预期选择唯一索引。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40965968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档