在postgresql中为什么索引没有被使用

现在我有有一个表,表中的数据在千万条左右,表中在direct_zone_id 上有一个索引 具体的描述如下:

CREATE TABLE common_order
(
  id bigint NOT NULL,
  version bigint NOT NULL,
  direct_zone_id bigint NOT NULL, -- 区域code(公司名称)
  order_channel character varying(255), -- 销售渠道
  order_code character varying(255) NOT NULL, -- 订单号
  order_price numeric(19,2) NOT NULL, -- 订单价格
  order_type character varying(255) NOT NULL,
  CONSTRAINT common_order_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);

-- DROP INDEX idx_direct_zone_id;

CREATE INDEX idx_direct_zone_id
  ON common_order
  USING btree
  (direct_zone_id);
  

我使用了一个sql,如下:

select * from common_order, 
( 
    select 
       (array[8,90]) [idx.n] as id 
    from 
       generate_series(1,7) idx(n)
) as t 
where direct_zone_id  = t.id limit 10

通过执行计划如下图:

图片描述

发现居然没有使用idx_direct_zone_id这个索引。
如果是简单的

select * from   common_order where direct_zone_id  = 10

就会使用 idx_direct_zone_id 索引。

我的问题就是,这里为啥第一个sql没有使用索引呢?
希望高手帮忙解答!

阅读 8.3k
2 个回答

一般对这些难调的,我都会设置

set join_collapse_limit = 1;

手工确定连接顺序,这样就能尽可能调整它的算法了。

新手上路,请多包涵

你两个sql明显的区别是上边的sql没有where条件,无法匹配索引

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏