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
Views: Raw Message | Whole Thread | Download mbox | Resend email
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

Browse pgsql-es-ayuda by date

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