我有一个包含300000行的表,当我运行一个像
这样的简单查询时 select * from diario_det;
它返回行留下41041毫秒。没关系呢?我如何优化查询?
我在Centos 7中使用Postgresql 9.3。
这是我的桌子
CREATE TABLE diario_det
(
cod_empresa numeric(2,0) NOT NULL,
nro_asiento numeric(8,0) NOT NULL,
nro_secue_pase numeric(4,0) NOT NULL,
descripcion_pase character varying(150) NOT NULL,
monto_debe numeric(16,3),
monto_haber numeric(16,3),
estado character varying(1) NOT NULL,
cod_pcuenta character varying(15) NOT NULL,
cod_local numeric(2,0) NOT NULL,
cod_centrocosto numeric(4,0) NOT NULL,
cod_ejercicio numeric(4,0) NOT NULL,
nro_comprob character varying(15),
conciliado_por character varying(10),
CONSTRAINT fk_diario_det_cab FOREIGN KEY (cod_empresa, cod_local, cod_ejercicio, nro_asiento)
REFERENCES diario_cab (cod_empresa, cod_local, cod_ejercicio, nro_asiento) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_diario_det_pc FOREIGN KEY (cod_empresa, cod_pcuenta)
REFERENCES plan_cuenta (cod_empresa, cod_pcuenta) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=TRUE
);
ALTER TABLE diario_det
OWNER TO postgres;
-- Index: pk_diario_det_ax
-- DROP INDEX pk_diario_det_ax;
CREATE INDEX pk_diario_det_ax
ON diario_det
USING btree
(cod_pcuenta COLLATE pg_catalog."default", cod_local, estado COLLATE pg_catalog."default");
答案 0 :(得分:2)
非常大约一行的大小为231字节,乘以300000 ...它必须从服务器传输到客户端的69300000字节(~69MB)。
我认为41秒有点长,但由于必须从磁盘加载并传输的数据量,查询必须很慢。
您可以通过
优化查询cod_empresa
,它会减少传输数据的总量大约为1.2MB,但服务器仍然必须通过所有记录进行迭代 - 慢速WHERE
真的> em>加快查询速度如果您想知道查询中发生了什么,请使用EXPLAIN
and EXPLAIN EXECUTE
。
此外,如果您正在运行专用数据库服务器,请务必configure it properly to use a lot of system resources。