繁体   English   中英

Postgresql查询非常慢

[英]Postgresql Query is very Slow

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

非常粗略的一行大小是231字节,乘以300000 ...它必须从服务器传输到客户端的69300000字节(~69MB)。

我认为41秒有点长,但由于必须从磁盘加载并传输的数据量,查询必须很慢。

您可以优化查询

  • 只选择列您打算使用不是所有的人(如果你只需要cod_empresa将减少传输的数据总量〜1.2MB,但服务器仍然有低谷遍历所有记录-慢)
  • 筛选打算使用行-使用WHERE列上带索引才能真正加快了查询

如果您想知道查询中发生了什么,请使用EXPLAINEXPLAIN EXECUTE

此外,如果您正在运行专用数据库服务器,请确保正确配置它以使用大量系统资源

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM