Re: Cómo cambio el plan de ejecución de un query

From: "Carlos Beltrán V(dot)" <cbeltran(at)roldan(dot)net>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>, Jaime Casanova <jcasanov(at)systemguards(dot)com(dot)ec>, ListaPostgreSQL <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Cómo cambio el plan de ejecución de un query
Date: 2008-09-02 22:20:55
Message-ID: 48BDBC47.10604@roldan.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Alvaro Herrera wrote:
> "Carlos Beltrán V." escribió:
>
>> Alvaro Herrera wrote:
>>
>>> "Carlos Beltrán V." escribió:
>>>
>>>
>>>> Alvaro, como realmente los selects de este tipo, se están usando en
>>>> muchos scripts y son planos, ¿debo agruparlos como está el ejemplo o
>>>> podría existir otra opción?
>>>>
>>> ¿Probaste a darle un COST a la función?
>>>
>>>
>> Alvaro, en efecto hice pruebas redefiniendo las dos funciones PL
>> involucradas como IMMUTABLE / STABLE y COST 1 / COST 0.1 con sus
>> combinaciones y no cambio la planeación. Cómo se debe estimar el
>> parámetro (valor) del COST ?
>>
>
> Dale un costo alto, como 1000. El valor es usado en la estimación de
> costo del plan. Mira el explain.
>
> No juegues con los parámetros de volatilidad (stable, immutable,
> volatile); escoge el correcto, de acuerdo con las definiciones de cada
> uno, y no lo cambies más.
>
>
Alvaro en este Select

EXPLAIN ANALYZE
SELECT pd.declaraciones_importacion_id
FROM
(SELECT
di.declaraciones_importacion_id
FROM
declaraciones_importacion di,
documentos d,
documentos_do dd
WHERE
di.documentos_id = d.documentos_id AND
d.documentos_id = dd.documentos_id AND
dd.dos_id = 180000000003039842) AS pd
WHERE es_declaracion_modalidad_temporal(pd.declaraciones_importacion_id)

con la función es_declaracion_modalidad_temporal como STABLE
COST 500 produjo los siguientes resultados.

"Nested Loop (cost=0.00..155453952.95 rows=1 width=8) (actual
time=922701.957..1271623.176 rows=2 loops=1)"
" -> Nested Loop (cost=0.00..155453944.65 rows=1 width=24) (actual
time=922701.907..1271623.104 rows=2 loops=1)"
" -> Seq Scan on declaraciones_importacion di
(cost=0.00..155438062.31 rows=20725 width=16) (actual
time=2530.852..1271419.782 rows=3305 loops=1)"
" Filter:
es_declaracion_modalidad_temporal(declaraciones_importacion_id)"
" -> Index Scan using documentos_do_key on documentos_do dd
(cost=0.00..0.75 rows=1 width=8) (actual time=0.055..0.055 rows=0
loops=3305)"
" Index Cond: ((dd.documentos_id = di.documentos_id) AND
(dd.dos_id = 180000000003039842::bigint))"
" -> Index Scan using pk_documentos on documentos d (cost=0.00..8.29
rows=1 width=8) (actual time=0.025..0.026 rows=1 loops=2)"
" Index Cond: (d.documentos_id = di.documentos_id)"
"Total runtime: 1271623.313 ms"

Ahora cuando se agrega el OFFSET 0 en el SELECT interno los resultados son:

"Subquery Scan pd (cost=53.02..13537.21 rows=1 width=8) (actual
time=260.442..1011.435 rows=2 loops=1)"
" Filter:
es_declaracion_modalidad_temporal(pd.declaraciones_importacion_id)"
" -> Limit (cost=53.02..3537.18 rows=4 width=8) (actual
time=179.995..923.482 rows=5 loops=1)"
" -> Nested Loop (cost=53.02..3537.18 rows=4 width=8) (actual
time=179.991..923.460 rows=5 loops=1)"
" -> Hash Join (cost=53.02..3503.95 rows=4 width=24)
(actual time=179.931..247.426 rows=5 loops=1)"
" Hash Cond: (di.documentos_id = dd.documentos_id)"
" -> Seq Scan on declaraciones_importacion di
(cost=0.00..3217.74 rows=62174 width=16) (actual time=0.017..122.472
rows=62174 loops=1)"
" -> Hash (cost=52.86..52.86 rows=13 width=8)
(actual time=0.318..0.318 rows=25 loops=1)"
" -> Bitmap Heap Scan on documentos_do dd
(cost=4.40..52.86 rows=13 width=8) (actual time=0.101..0.268 rows=25
loops=1)"
" Recheck Cond: (dos_id =
180000000003039842::bigint)"
" -> Bitmap Index Scan on h_dos_id3
(cost=0.00..4.40 rows=13 width=0) (actual time=0.080..0.080 rows=25
loops=1)"
" Index Cond: (dos_id =
180000000003039842::bigint)"
" -> Index Scan using pk_documentos on documentos d
(cost=0.00..8.29 rows=1 width=8) (actual time=135.192..135.196 rows=1
loops=5)"
" Index Cond: (d.documentos_id = di.documentos_id)"
"Total runtime: 1011.552 ms"

Es decir no logro resultados óptimos sin usar el OFFSET, además no he
logrado un método para ir optimizando el SELECT cambiando el COST de las
funciones.

Nuevamente gracias. Carlos.

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Daniel 2008-09-02 22:47:15 Ejecutar Query periodicamente
Previous Message Reynier Perez Mira 2008-09-02 21:55:25 Cambiar "owner" en cascada