PostgreSQL版本:9.3.13
考虑以下表格,索引和数据:
CREATE TABLE orders (
order_id bigint,
status smallint,
owner int,
CONSTRAINT orders_pkey PRIMARY KEY (order_id)
)
CREATE INDEX owner_index ON orders
USING btree
(owner) WHERE status > 0;
CREATE TABLE orders_appendix (
order_id bigint,
note text
)
数据
订单:
(ID,0,1337)* 1000000行
(ID,10,1337)* 1000行
(ID,10,777)* 1000行
orders_appendix:
我的问题是:
select * from orders where owner=1337 and status>0
查询计划程序估计行数为1000000,但实际行数为1000。
在更复杂的以下查询中:
SELECT note FROM orders JOIN orders_appendix using (order_id)
WHERE owner=1337 AND status>0
它不是使用内连接(对于少量行更可取),而是选择位图连接+在orders_appendix上进行全表扫描,这非常慢。
如果条件为" owner = 777",则会选择更好的内连接。
我认为这是统计数据的原因,因为AFAIK postgres只能独立收集和考虑每列的统计数据。
但是,如果我......
CREATE INDEX onwer_abs ON orders (abs(owner)) where status>0;
现在,略有改变的查询...
SELECT note FROM orders JOIN rders_appendix using (order_id)
WHERE abs(owner)=1337 AND status>0
将导致我想要的内连接。
有更好的解决方案吗?也许"有关部分索引的统计数据"?