Código SQL:
Ver original
SELECT sp.ciudad,sp.nombre_localidad AS localidad,sp.periodo,sp.nivsocio, to_char(SUM(sp.htotal),'999g999g999g999') AS htotal, to_char(SUM(sp.h0509),'999g999g999g999') AS h0509, to_char(SUM(sp.h1014),'999g999g999g999') AS h1014, to_char(SUM(sp.h1519),'999g999g999g999') AS h1519, to_char(SUM(sp.h2024),'999g999g999g999') AS h2024, to_char(SUM(sp.h2529),'999g999g999g999') AS h2529, to_char(SUM(sp.h3034),'999g999g999g999') AS h3034 FROM servcon_poblaingas_11001 sp WHERE sp.periodo IN ('2011') AND sp.nivsocio IN ('2','3','4','5') GROUP BY sp.ciudad,localidad,sp.periodo,sp.nivsocio ORDER BY localidad,periodo,nivsocio
La cual se arma dinamicamente y se ejcuta sobre una tabla de 387315 registros y posee 94 columnas, la primera que lo ejecute en pgAdmin directamente en el servidor se tardo aprox 2 minutos, de resto su tiempo esta en un rago de 1.4 a 2 segundos, primera pregunta porque?
DESPUES hice un EXPLAIN DE ESE select y me arrojo lo siguiente:
Código SQL:
Ver original
Sort (cost=70587.03..70587.21 ROWS=73 width=59) Sort KEY: nombre_localidad, periodo, nivsocio -> HashAggregate (cost=70582.21..70584.77 ROWS=73 width=59) -> Seq Scan ON servcon_poblaingas_11001 sp (cost=0.00..69937.59 ROWS=23441 width=59) FILTER: ((periodo = 2011) AND (((nivsocio)::text = '2'::text) OR ((nivsocio)::text = '3'::text) OR ((nivsocio)::text = '4'::text) OR ((nivsocio)::text = '5'::text)))
pero no es que halla entendido de a mucho. que signfica todo eso, y con base en eso como podria modificarlo, para que sea mas rapido?
actualmente esta tabla tiene 2 indices, el de nivsocio y el de periodo, despues cree un indice compuesto de estos 2 pero el tiempo fue el mismo, pero nivsocio solo puede tomar 8 valores y periodo 10 valores, por lo tanto estos se repiten muchas veces en la tabla.