现在我有有一个表,表中的数据在千万条左右,表中在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没有使用索引呢?
希望高手帮忙解答!
一般对这些难调的,我都会设置
set join_collapse_limit = 1;
手工确定连接顺序,这样就能尽可能调整它的算法了。