如何在postgres中快速给出2列元组之前找到最大的元组

时间:2014-10-02 16:58:14

标签: sql postgresql indexing

如何在Postgres 9.0中增加select语句速度?

表格中存在必需的索引。可以立即使用指数(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不会使用它们。 如果有帮助,索引可以更改,查询可以重写。 表结构不能改变。 char列不能替换为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 ++ build 1500,32位编译”

0 个答案:

没有答案