> Date: Tue, 29 May 2007 18:03:26 -0400> From: ebarreto(at)nexusit(dot)com(dot)py> To: pgsql-es-ayuda(at)postgresql(dot)org> Subject: [pgsql-es-ayuda] velocidad en consulta con like> > hola a todos> > estoy buscando mejorar el tiempo de una consulta sql que actualmente> lleva entre 3000 y 5000 ms, entiendo que es un tiempo razonable,> pero me gustaría saber si habría alguna posibilidad de mejorarlo aún> más> > // PostgreSQL 8.2.3 en una PC con WindowsXP> > la consulta que estoy realizando es esta:> SELECT *> FROM vw_personas> WHERE per_nombres LIKE 'EVER D%' AND per_apellidos LIKE 'BARRET%'
podrias crear indices para per_nombres y per_apellidos, estos podrian mejorar la velocidad de respuesta al select pero en contrasentido podrian ocasionar mas demora en la insercion de datos y ni te digo en la modificacion.
Martin
> > sobre una tabla con 4.140.619 registros, el explain analyze de la> consulta es esta:> "Sort (cost=138124.45..138124.46 rows=1 width=2252) (actual time=3770.737..3770.740 rows=1 loops=1)"> " Sort Key: persona.per_apellidos, persona.per_nombres"> " -> Nested Loop (cost=0.00..138124.44 rows=1 width=2252) (actual time=2663.531..3770.693 rows=1 loops=1)"> " Join Filter: (persona.idecivil = ec.idecivil)"> " -> Nested Loop (cost=0.00..138123.35 rows=1 width=2239) (actual time=2663.484..3770.631 rows=1 loops=1)"> " Join Filter: (persona.idtdoc = td.idtdoc)"> " -> Seq Scan on persona (cost=0.00..138122.29 rows=1 width=2203) (actual time=2663.411..3770.548 rows=1 loops=1)"> " Filter: (((per_nombres)::text ~~ 'EVER D%'::text) AND ((per_apellidos)::text ~~ 'BARRET%'::text))"> " -> Seq Scan on tipo_documento td (cost=0.00..1.03 rows=3 width=40) (actual time=0.029..0.034 rows=3 loops=1)"> " -> Seq Scan on estado_civil ec (cost=0.00..1.04 rows=4 width=17) (actual time=0.028..0.034 rows=4 loops=1)"> "Total runtime: 3770.985 ms"> > > y la definición del view y las tablas que la componen es esta:> -- View: "vw_personas"> > -- DROP VIEW vw_personas;> > CREATE OR REPLACE VIEW vw_personas AS > SELECT persona.idpersona, persona.idecivil, ec.ec_descripcion, persona.idtdoc, td.td_descripcion, persona.per_nrodoc, persona.per_nombres, persona.per_apellidos, persona.per_sexo, persona.per_fnac, persona.per_dl_calle, persona.per_dl_barrio, persona.per_dl_edif, persona.per_dl_piso, persona.per_dl_pta, persona.per_dl_ciudad, persona.per_dl_pais, persona.per_dl_ref, persona.per_dp_calle, persona.per_dp_barrio, persona.per_dp_edif, persona.per_dp_piso, persona.per_dp_pta, persona.per_dp_ciudad, persona.per_dp_pais, persona.per_dp_ref, persona.per_lab_telef, persona.per_lab_fax, persona.per_lab_cel, persona.per_part_telef, persona.per_part_fax, persona.per_part_cel, persona.per_email, persona.per_alta_fecha, persona.per_alta_por, persona.per_modif_fecha, persona.per_modif_por> FROM persona> JOIN estado_civil ec USING (idecivil)> JOIN tipo_documento td USING (idtdoc)> ORDER BY persona.per_apellidos, persona.per_nombres;> > ALTER TABLE vw_personas OWNER TO postgres;> > -- Table: persona> > -- DROP TABLE persona;> > CREATE TABLE persona> (> idpersona serial NOT NULL,> idecivil integer NOT NULL,> idtdoc integer NOT NULL,> per_nrodoc integer NOT NULL,> per_nombres character varying(160) NOT NULL,> per_apellidos character varying(160) NOT NULL,> per_sexo integer NOT NULL,> per_fnac date,> per_dl_calle character varying(95),> per_dl_barrio character varying(45),> per_dl_edif character varying(45),> per_dl_piso character varying(12),> per_dl_pta character varying(12),> per_dl_ciudad character varying(65),> per_dl_pais character varying(65),> per_dl_ref text,> per_dp_calle character varying(95),> per_dp_barrio character varying(45),> per_dp_edif character varying(45),> per_dp_piso character varying(12),> per_dp_pta character varying(12),> per_dp_ciudad character varying(65),> per_dp_pais character varying(65),> per_dp_ref text,> per_lab_telef character varying(18),> per_lab_fax character varying(18),> per_lab_cel character varying(18),> per_part_telef character varying(18),> per_part_fax character varying(18),> per_part_cel character varying(18),> per_email character varying(48),> per_alta_fecha timestamp with time zone DEFAULT now(),> per_alta_por character varying(65) DEFAULT "current_user"(),> per_modif_fecha timestamp with time zone DEFAULT now(),> per_modif_por character varying(65) DEFAULT "current_user"(),> temp_fnac character varying(65),> CONSTRAINT pk_persona PRIMARY KEY (idpersona),> CONSTRAINT idecivil_ecivil FOREIGN KEY (idecivil)> REFERENCES estado_civil (idecivil) MATCH SIMPLE> ON UPDATE CASCADE ON DELETE RESTRICT,> CONSTRAINT idtdoc_tdocumento FOREIGN KEY (idtdoc)> REFERENCES tipo_documento (idtdoc) MATCH SIMPLE> ON UPDATE CASCADE ON DELETE RESTRICT> ) > WITHOUT OIDS;> ALTER TABLE persona OWNER TO infosur;> > -- Table: estado_civil> > -- DROP TABLE estado_civil;> > CREATE TABLE estado_civil> (> idecivil serial NOT NULL,> ec_descripcion character varying(65) NOT NULL,> CONSTRAINT pk_ecivil PRIMARY KEY (idecivil)> ) > WITHOUT OIDS;> ALTER TABLE estado_civil OWNER TO infosur;> > -- Table: tipo_documento> > -- DROP TABLE tipo_documento;> > CREATE TABLE tipo_documento> (> idtdoc serial NOT NULL,> td_descripcion character varying(65) NOT NULL,> CONSTRAINT pk_tdocumento PRIMARY KEY (idtdoc)> ) > WITHOUT OIDS;> ALTER TABLE tipo_documento OWNER TO infosur;> > habría posibilidad de mejorarla? gracias a todos de antemano> > Cordiales saludos,> > -------------------> Ever Daniel Barreto Rojas> e.mail: ebarreto(at)nexusit(dot)com(dot)py :: Nexus Information Technologies> web: www.nexusit.com.py> 29/05/2007 05:47 p.m.> > ---------------------> Investigación es lo que hago cuando no se lo que estoy haciendo.> - Anónimo> ---------------------> > > ---------------------------(fin del mensaje)---------------------------> TIP 7: no olvides aumentar la configuración del "free space map"
_________________________________________________________________
¡Ya está aquí Windows Live Spaces! Ahora podrás crear fácilmente tu propio sitio Web.
http://spaces.live.com/signup.aspx