Postgresql查询非常慢

时间:2014-11-13 14:39:20

标签: sql postgresql

我有一个包含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");

1 个答案:

答案 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