2014-11-13 7 views
0

У меня есть таблица с 300000 строк, и когда я запустить простой запрос, какPostgresql Query очень Slow

select * from diario_det; 

оставляет 41041 мс для возврата строки. Это нормально? Как я могу оптимизировать запрос?

Я использую Postgresql 9.3 в Centos 7.

Вот мой стол

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"); 
+5

'select * from diario_det;' будет возвращать все строки из таблицы без применения каких-либо ограничений. Время, которое вы видите, так же быстро, как и получается. Если вам нужна более высокая производительность, вам потребуется более быстрый жесткий диск с большей памятью и более быстрой сетью. Сам запрос не может быть настроен. –

ответ

2

Очень примерно размер одной строки 231 байт, раз +300000 ... Это 69300000 байт (~ 69MB), который должен быть передан от сервера к клиенту.

Я думаю, что 41 секунда немного длинная, но все же запрос должен быть медленным из-за количества данных, которые необходимо загрузить с диска и передать.

Вы можете оптимизировать запрос,

  • выбора только что столбцы, что являются собирается использовать не все из них (если вам нужно просто cod_empresa это позволит сократить общее количество передаваемых данных в ~ 1.2Мб , но сервер еще придется перебирать все записи корыта - медленные)
  • фильтр только те строки, которые являются собирается использовать - используя WHERE по столбцам с индексами может действительно скорость запроса до

Если вы хотите знать, что происходит в вашем запросе, поиграйте с EXPLAIN and EXPLAIN EXECUTE.

Кроме того, если вы используете выделенный сервер базы данных, обязательно укажите configure it properly to use a lot of system resources.