如何提高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位”