velocidad en consulta con like

From: Ever Daniel Barreto Rojas <ebarreto(at)nexusit(dot)com(dot)py>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: velocidad en consulta con like
Date: 2007-05-29 22:03:26
Message-ID: 1486362398.20070529180326@nexusit.com.py
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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%'

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

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message mario vargas careaga 2007-05-29 22:12:10 Re: no puedo conseguir que me devuelva mas tuplas....
Previous Message Lenin Aguirre 2007-05-29 21:55:52 como hacerle seguimiento a una funcion