PostgreSQL:部分索引统计?

时间:2016-07-05 16:07:23

标签: postgresql partial-index

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

将导致我想要的内连接。

有更好的解决方案吗?也许"有关部分索引的统计数据"?

0 个答案:

没有答案