Re: Obligar al optimizador a usar un index en particular en un SELECT

From: "manuel lamas" <manuel3w(at)hotmail(dot)com>
To: alvherre(at)commandprompt(dot)com
Subject: Re: Obligar al optimizador a usar un index en particular en un SELECT
Date: 2006-03-07 17:22:09
Message-ID: BAY103-F25DE3524EC3161F08AC1195EE0@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

>From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
>To: manuel lamas <manuel3w(at)hotmail(dot)com>
>CC: pgsql-es-ayuda(at)postgresql(dot)org
>Subject: Re: [pgsql-es-ayuda] Obligar al optimizador a usar un index en
>particular en un SELECT
>Date: Tue, 7 Mar 2006 13:58:58 -0300
>
>manuel lamas escribió:
>
> > Van algunos años que uso Postgresql y con el tiempo me di cuenta que a
> > veces existen funcionalidades interesantes de las cuales no se encuentra
> > mucha literatura. No me sorprendería que lo que pido exista.
>
>No existe. Pueden pasar dos cosas:
>
>1. el índice que quieres usar no se puede usar por algún motivo
>
>2. el optimizador cree que no es conveniente usar el índice.
>
>Para decirte de que se trata en cada caso, podrías mostrarnos un caso de
>ejemplo y nosotros te decimos por que no usa el índice. Entonces a lo
>mejor se puede corregir esa situación.
>

Bueno.. que lastima que no exista.

Igual les puedo mostrar alguna query. Tengo una tabla DOSSIERS con 60'000
entradas. El PRIMARY KEY esta en la columna dossierid y tengo un índice en
la columna etat_ing_est_img.

Lo que sigue lo entiendo perfectamente.

Cuando pido que etat_ing_est_img = 'processing' el optimizador usa el índice
in_dossiers_etat_ing_est_img porque hay pocas lineas y sale mas barato.

Cuando pido que etat_ing_est_img = 'new' el optimizador hace un scan de la
tabla porque hay muchas lineas y en ese caso el optimizador lo ve mas
barato.

Igual me hubiera gustado ver cuanto sale en el ultimo query usando el índice
in_dossiers_etat_ing_est_img en lugar del scan de la tabla.

EXPLAIN ANALYSE SELECT dossierid FROM DOSSIERS WHERE etat_ing_est_img =
'processing' ;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------
Index Scan using in_dossiers_etat_ing_est_img on dossiers
(cost=0.00..1598.67 rows=697 width=17) (actual time=0.026..1.731 rows=624
loops=1)
Index Cond: ((etat_ing_est_img)::text = 'processing'::text)
Total runtime: 2.183 ms
(3 rows)

ECS=# EXPLAIN ANALYSE SELECT dossierid FROM DOSSIERS WHERE etat_ing_est_img
= 'new' ;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------
Seq Scan on dossiers (cost=0.00..9719.19 rows=7766 width=17) (actual
time=0.181..2004.666 rows=7316 loops=1)
Filter: ((etat_ing_est_img)::text = 'new'::text)
Total runtime: 2010.403 ms
(3 rows)

Gracias

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Juan Martínez 2006-03-07 17:50:22 Re: disculpas desde ecuador fue:(Re: Problema en accesos a BD del Servidor)
Previous Message Miguel Ortega 2006-03-07 17:01:45 PG_HBA