mejorar tiempo de consulta

From: Ever Daniel Barreto Rojas <ebarreto(at)nexusit(dot)com(dot)py>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: mejorar tiempo de consulta
Date: 2007-11-02 22:40:57
Message-ID: 1235397681.20071102184057@nexusit.com.py
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

hola a todos:

--
OS: Fedore Core 6
Versión PGSQL: PostgreSQL 8.2.3 on i686-redhat-linux-gnu, compiled
by GCC gcc (GCC) 4.1.1 20070105 (Red Hat 4.1.1-51)
--

estoy buscando mejorar el tiempo de una consulta que me toma
bastante tiempo, el tema viene de esta forma:

tengo un tabla persona con 4.140.812 registros, el esquema de la tabla
se puede ver al pie de este mail

la consulta que estoy intentando mejorar el tiempo es la siguiente
(una de ejemplo):

SELECT *
FROM persona
WHERE per_nombres LIKE '%EVER%' AND per_apellidos LIKE '%BARRET%'

el tiempo de la consulta es de 3.389 ms, el explain analyze de esta
sentencia es:

Seq Scan on persona (cost=0.00..135805.18 rows=10 width=105) (actual time=85.865..3388.869 rows=96 loops=1)
Filter: (((per_nombres)::text ~~ '%EVER%'::text) AND ((per_apellidos)::text ~~ '%BARRET%'::text))
Total runtime: 3389.125 ms

sin embargo, las consultas del tipo:
SELECT *
FROM persona
WHERE per_nombres LIKE 'EVER%' AND per_apellidos LIKE 'BARRET%'

tienen un tiempo de respuesta de 149ms (muy bueno, pude mejorarlo
gracias a las indicaciones de alvaro de crear un indice con
varchar_pattern_ops), y el explain analyze es:

Index Scan using idx_personas_apellidos on persona (cost=0.00..8.97 rows=1 width=105) (actual time=5.679..149.048 rows=22 loops=1)
Index Cond: (((per_apellidos)::text ~>=~ 'BARRET'::character varying) AND ((per_apellidos)::text ~<~ 'BARREU'::character varying))
Filter: (((per_nombres)::text ~~ 'EVER%'::text) AND ((per_apellidos)::text ~~ 'BARRET%'::text))
Total runtime: 149.145 ms

la cuestión es que me gustaría saber de qué forma podría hacer que
la consulta pueda utilizar este índice, o en todo caso, qué otro
índice debo crear para mejorar el tiempo de respuesta, o si debo
cambiar algún parámetro de la configuración (que tiene todos los
valores por defecto, no cambie nada)

les agradezco a todos por su tiempo

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_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
)
WITH (OIDS=FALSE);
ALTER TABLE persona OWNER TO everdaniel;

CREATE INDEX idx_nro_cedula
ON persona
USING btree
(per_nrodoc);

CREATE INDEX idx_personas
ON persona
USING btree
(per_apellidos varchar_pattern_ops, per_nombres varchar_pattern_ops);

CREATE INDEX idx_personas_apellidos
ON persona
USING btree
(per_apellidos varchar_pattern_ops);

CREATE INDEX idx_personas_nombre_apellido
ON persona
USING btree
(per_nombres varchar_pattern_ops, per_apellidos varchar_pattern_ops);

CREATE INDEX idx_personas_nombres
ON persona
USING btree
(per_nombres varchar_pattern_ops);


Cordiales saludos,

-------------------
Ever Daniel Barreto Rojas
e.mail: ebarreto(at)nexusit(dot)com(dot)py :: Nexus Information Technologies
web: www.nexusit.com.py
02/11/2007 06:24 p.m.

---------------------
Al sentarse para jugar dominó:
- ¿Vamos a jugar como caballeros ó como lo que somos?
Mariano Moreno (Cantinflas)
---------------------

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message pg_studio10 2007-11-03 01:15:06 Re: Duda sobre respaldo...
Previous Message Jaime Casanova 2007-11-02 22:22:39 Re: hora del servidor