如何在Postgres的快速给出2列的元组之前发现的最大的元组(How find greatest

2019-09-27 17:41发布

如何提高select语句的速度在Postgres的9.0?

表已要求索引存在。 所需结果可制得使用立即指数(kuupaev,kellaaeg)。 然而Postgres的扫描所有行:

explain analyze SELECT 
    max( kuupaev||kellaaeg ) as res
  from firma2.ALGSA 
  where laonr=1 and kuupaev <=current_date and 
     (kuupaev,kellaaeg) <= ( current_date, '23 59'  )

"Aggregate  (cost=6932.65..6932.67 rows=1 width=10) (actual time=1608.590..1608.592 rows=1 loops=1)"
"  ->  Seq Scan on algsa  (cost=0.00..6571.49 rows=144464 width=10) (actual time=0.032..922.431 rows=144458 loops=1)"
"        Filter: ((laonr = 1::numeric) AND (kuupaev <= ('now'::text)::date) AND (ROW(kuupaev, kellaaeg) <= ROW(('now'::text)::date, '23 59'::bpchar)))"
"Total runtime: 1608.846 ms"

在实际的查询,而不是1,CURRENT_DATE和'23 59' 有可变参数。

表有两个指数存在,但Postgres将不会使用它们。 索引可以改变和查询可以重写,如果这有助于。 表结构不能改变。 字符列不能用VARCHAR列所取代。 kuupaev必须是日期和kellaaeg必须是char(5)型。

查询包含reduntant条件kuupaev <=current_date但仍然没有使用的索引。

我试着也SELECT max( (kuupaev,kellaaeg ))但得到错误MAX()函数不存在。

CREATE TABLE firma2.algsa
(
  id serial NOT NULL,
  laonr numeric(2,0),
  kuupaev date NOT NULL,
  kellaaeg character(5) NOT NULL DEFAULT ''::bpchar,
  osak character(10) NOT NULL,
  toode character(20) NOT NULL,
  partii character(15),
  kogus numeric(12,4) NOT NULL DEFAULT 0,
  hind numeric(15,5) NOT NULL DEFAULT 0,
  kulum numeric(15,5) NOT NULL DEFAULT 0,
  tegkogus numeric(12,4),
  stkuupaev date,
  klient character(12),
  masin character(5),
  CONSTRAINT algsa_pkey PRIMARY KEY (id)
);


CREATE INDEX algsa_kuupaev_idx
  ON firma2.algsa
  USING btree
  (kuupaev);

CREATE INDEX algsa_kuupaev_kellaaeg_idx
  ON firma2.algsa
  USING btree
  (kuupaev, kellaaeg);

运用

“PostgreSQL的9.0.3,采用Visual C ++编译建立1500,32位”

文章来源: How find greatest tuple before given 2-column tuple in postgres fast