Skip site navigation (1) Skip section navigation (2)

Re: Otra acerca de indices

From: Alvaro Herrera <alvherre(at)surnet(dot)cl>
To: "Juan P(dot) Aviles" <jputem(at)yahoo(dot)es>
Cc: lista postgresql <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Otra acerca de indices
Date: 2005-07-01 01:04:39
Message-ID: 20050701010439.GA12909@surnet.cl (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
[Reformateado para que se entienda que parte escribi yo en el mail
anterior]

On Fri, Jul 01, 2005 at 02:24:30AM +0200, Juan P. Aviles wrote:

> > Ahora, si las consulta con estado_tit=true son muy frecuentes, y las
> > consultas con estado_tit=false son raras, y ademas los WHERE contienen
> > el tipo_tit, entonces te puede convenir un indice asi:
> > 
> > CREATE INDEX foo_bar on titular (tipo_tit) WHERE estado_tit = true;
> > esto te sirve cuando hagas estas consultas
> > SELECT * from titular WHERE tipo_tit=X and estado_tit=true
> > pero no esta
> > SELECT * from titular WHERE tipo_tit=X and estado_tit=false
> > 
> > Obviamente si haces un indice con estado_tit=true y otro con
> > estado_tit=false nuevamente estas perdiendo, y te conviene un solo
> > indice asi
> > CREATE INDEX foo_bar on titular (tipo_tit)
> 
> A ver si entendi, basicamente necesito estos indices para definir
> filtros de seleccion de titulares, me explico por ejemplo en una
> interfaz cliente tengo una casilla de texto que me ingresa o una parte
> del rut o una parte del nombre de una persona, y mando a consultar asi 
> 
> Select * from titular where tipo_tit = 1 and nom_tit = 'Perico ' and estado_tit = True;
> O
> Select * from titular where tipo_tit = 1 and rut_tit = 'xxx' and estado_tit = True;
> 
> con los ilike o like y un limit 100, correspondientes por supuesto,
> los omiti para resaltar el asunto de los indices, ¿porque no influyen
> en ellos  cierto???.

Depende.  El LIKE si puede influir, sobre todo si tienes un locale
configurado.  En ese caso puedes necesitar definir un indice con una
clase de operadores distinta de la clase por omision.  No recuerdo la
sintaxis exacta, buscalo en el manual por "operator class",
particularmente "varchar_pattern_ops", en la seccion Indexes; y en la
pagina de CREATE INDEX.

> Bueno, para esto necesitaria  indices del tipo
> 
> CREATE INDEX foo_bar1 on titular (tipo_tit , nom_tit) WHERE estado_tit = true;
> y otro
> CREATE INDEX foo_bar2 on titular (tipo_tit , rut_tit) WHERE estado_tit = true;
> 
> Entendi?????? :)

Yo diria que si, excepto que se me olvido comentarte que es mejor poner
las columnas mas selectivas antes que las menos selectivas.  O sea
probablemente te convenga

CREATE INDEX foo_bar1 on titular (nom_tit, tipo_tit) WHERE estado_tit;
y otro
CREATE INDEX foo_bar2 on titular (rut_tit, tipo_tit) WHERE estado_tit;

Otra cosa a observar es que cuando tienes un campo booleano, no es
necesario poner "= true"

-- 
Alvaro Herrera (<alvherre[a]surnet.cl>)
"El sentido de las cosas no viene de las cosas, sino de
las inteligencias que las aplican a sus problemas diarios
en busca del progreso." (Ernesto Hernández-Novich)

In response to

Responses

pgsql-es-ayuda by date

Next:From: Jaime CasanovaDate: 2005-07-01 06:26:58
Subject: Re: Cpu al 100%
Previous:From: Juan P. AvilesDate: 2005-07-01 00:24:30
Subject: Re: Otra acerca de indices

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group