Re: Leer plan de ejecución

From: Horacio Miranda <hmiranda(at)gmail(dot)com>
To: Stephen Amell <mrstephenamell(at)gmail(dot)com>, Hamilton Marenco <hagonma2000(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Leer plan de ejecución
Date: 2019-03-22 04:15:47
Message-ID: c6b83fa2-a04b-9791-c3a5-312b8d5cf93c@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


On 22/03/2019 6:33 AM, Stephen Amell wrote:
> Hola,
>
> Conoces explain.depesz.com?
>
Estes es un buen lugar para visualizar los explain plan
> https://explain.depesz.com/s/Tr3k
>
> Ahi lo vas a poder ver un poco mas comodo, en la parte de stats, vas a
> ver en que se te va el plan... en este caso hay un "CTE Scan" y al
> usar fact_acct se va de viaje leyendo.
>
En lo persona me fijo que los where tengan indices y me fijo en los seq
scans.

A todo esto, esto tiene pinta de Adempiere ( puedo estar equivocado ).

Seq Scan
<http://www.depesz.com/2013/04/27/explaining-the-unexplainable-part-2/#seq-scan>
on fact_acct (cost=0.00..2,225.25 rows=2,317 width=11) (actual
time=17.046..23.482 rows=2,136 loops=211)

* Filter: (c_period_id = $9)
* Rows Removed by Filter: 46524

Revisa que tengas indices aquí.

Sobre el CTE Scan no es mucho lo que puedes hacer, estas haciendo OR, y
usando <> le estas diciendo a la maquina hace un full scan..  puedes
crear un indice compuesto para ayudar la busqueda.

create index on fact_acct (c_period_id) ;
create index on CTE_SCAN (inicio,debe,haber,fin) ;

Y ve como te va, corre el plan de execution de nuevo y sigues
optimizando, haciendo esto hace poco baje un reporte de 1 hora a 2 min.
( 10 segundos en la base de datos y casi dos minutos moviendo datos
entre la aplicación y la base de datos ).
OJO: Lo mejor que puedes hacer es ponerte a leer planes y a crear
indices en reportes, pero ten en cuenta que para updates, delete los
indices se deben actualizar ( es rapido pero siempre y cuando tu Storage
no tenga problemas de rendimiento ), un sinple IO de disco que falte
puede ser mucho cuando no se tiene...  ( no creo que sea tu caso ).

>
> On 2019-03-21 12:36, Hamilton Marenco wrote:
>> "CTE Scan on data (cost=751548.65..751551.65 rows=100 width=1036)
>> (actual time=208954.192..208956.133 rows=866 loops=1)"
>> "  Filter: ((inicio <> '0'::numeric) OR (debe <> '0'::numeric) OR
>> (haber <> '0'::numeric) OR (fin <> '0'::numeric))"
>> "  Rows Removed by Filter: 1617"
>> "  CTE parameters"
>> "    -> Seq Scan on c_period  (cost=0.00..6.40 rows=1 width=14)
>> (actual time=0.103..0.120 rows=1 loops=1)"
>> " Filter: (c_period_id = '1000394'::numeric)"
>> " Rows Removed by Filter: 191"
>> "  CTE data"
>> "    -> Sort  (cost=751542.00..751542.25 rows=100 width=350) (actual
>> time=208954.182..208954.561 rows=2483 loops=1)"
>> " Sort Key: val.value"
>> " Sort Method: quicksort  Memory: 464kB"
>> " ->  Hash Join  (cost=124.76..751538.68 rows=100 width=350) (actual
>> time=99.584..208932.477 rows=2483 loops=1)"
>> "     Hash Cond: ("substring"((val.value)::text, 1, 4) =
>> (gp.value)::text)"
>> "     ->  Nested Loop  (cost=2.54..7.18 rows=100 width=190) (actual
>> time=47.159..90.465 rows=2483 loops=1)"
>> "           ->  Nested Loop  (cost=2.26..4.28 rows=1 width=186)
>> (actual time=47.138..53.093 rows=2483 loops=1)"
>> "                 ->  CTE Scan on parameters p (cost=0.00..0.02
>> rows=1 width=154) (actual time=0.110..0.111 rows=1 loops=1)"
>> "                 ->  HashAggregate  (cost=2.26..3.26 rows=100
>> width=32) (actual time=47.024..51.500 rows=2483 loops=1)"
>> "                       Group Key:
>> unnest(getrecursiveacctsi(getrecursiveacctslvl('{1003174,1003452,1003569,1003605,1003652,1003972,1004173}'::numeric[],
>> '1'::numeric, '4'::numeric)))"
>> "                       ->  Result  (cost=0.00..1.01 rows=100
>> width=32) (actual time=45.289..45.708 rows=2483 loops=1)"
>> "           ->  Index Scan using c_elementvalue_pkey on
>> c_elementvalue val  (cost=0.28..2.90 rows=1 width=36) (actual
>> time=0.010..0.011 rows=1 loops=2483)"
>> "                 Index Cond: (c_elementvalue_id =
>> (unnest(getrecursiveacctsi(getrecursiveacctslvl('{1003174,1003452,1003569,1003605,1003652,1003972,1004173}'::numeric[],
>> '1'::numeric, '4'::numeric)))))"
>> "     ->  Hash  (cost=88.21..88.21 rows=2721 width=29) (actual
>> time=2.358..2.358 rows=2721 loops=1)"
>> "           Buckets: 4096  Batches: 1  Memory Usage: 199kB"
>> "           ->  Seq Scan on c_elementvalue gp (cost=0.00..88.21
>> rows=2721 width=29) (actual time=0.022..1.194 rows=2721 loops=1)"
>> "     SubPlan 2"
>> "       ->  Result  (cost=0.00..0.26 rows=1 width=32) (actual
>> time=0.876..0.876 rows=1 loops=2483)"
>> "     SubPlan 3"
>> "       ->  Result  (cost=0.00..0.26 rows=1 width=32) (actual
>> time=0.801..0.801 rows=1 loops=2483)"
>> "     SubPlan 5"
>> "       ->  Result  (cost=0.26..0.52 rows=1 width=32) (actual
>> time=167.654..167.655 rows=1 loops=211)"
>> "             InitPlan 4 (returns $4)"
>> "               ->  Result  (cost=0.00..0.26 rows=1 width=32) (actual
>> time=1.539..1.540 rows=1 loops=211)"
>> "     SubPlan 6"
>> "       ->  Result  (cost=0.00..0.26 rows=1 width=32) (actual
>> time=9.366..9.366 rows=1 loops=2272)"
>> "     SubPlan 7"
>> "       ->  Result  (cost=0.00..0.26 rows=1 width=32) (actual
>> time=0.892..0.892 rows=1 loops=2483)"
>> "     SubPlan 10"
>> "       ->  Aggregate  (cost=2238.58..2238.59 rows=1 width=32)
>> (actual time=25.526..25.526 rows=1 loops=211)"
>> "             InitPlan 8 (returns $9)"
>> "               ->  CTE Scan on parameters  (cost=0.00..0.02 rows=1
>> width=16) (actual time=0.002..0.003 rows=1 loops=1)"
>> "             ->  Hash Semi Join  (cost=3.02..2237.79 rows=309
>> width=4) (actual time=24.567..25.496 rows=14 loops=211)"
>> "                   Hash Cond: (fact_acct.account_id = (unnest($11)))"
>> "                   ->  Seq Scan on fact_acct (cost=0.00..2225.25
>> rows=2317 width=11) (actual time=17.046..23.482 rows=2136 loops=211)"
>> "                         Filter: (c_period_id = $9)"
>> "                         Rows Removed by Filter: 46524"
>> "                   ->  Hash  (cost=1.77..1.77 rows=100 width=32)
>> (actual time=1.616..1.616 rows=19 loops=211)"
>> "                         Buckets: 1024  Batches: 1  Memory Usage: 9kB"
>> "                         ->  Result  (cost=0.26..0.77 rows=100
>> width=32) (actual time=1.604..1.607 rows=19 loops=211)"
>> "                               InitPlan 9 (returns $11)"
>> "                                 ->  Result (cost=0.00..0.26 rows=1
>> width=32) (actual time=1.598..1.598 rows=1 loops=211)"
>> "     SubPlan 12"
>> "       ->  Aggregate  (cost=1517.00..1517.01 rows=1 width=32)
>> (actual time=6.580..6.580 rows=1 loops=2272)"
>> "             InitPlan 11 (returns $12)"
>> "               ->  CTE Scan on parameters parameters_1
>> (cost=0.00..0.02 rows=1 width=16) (actual time=0.003..0.021 rows=1
>> loops=1)"
>> "             ->  Index Scan using factacct_idxmayor2 on fact_acct
>> fact_acct_1  (cost=0.41..1516.97 rows=3 width=4) (actual
>> time=6.149..6.574 rows=1 loops=2272)"
>> "                   Index Cond: (account_id = val.c_elementvalue_id)"
>> "                   Filter: (c_period_id = $12)"
>> "                   Rows Removed by Filter: 20"
>> "     SubPlan 13"
>> "       ->  Result  (cost=0.00..0.26 rows=1 width=32) (actual
>> time=0.861..0.862 rows=1 loops=2483)"
>> "     SubPlan 16"
>> "       ->  Aggregate  (cost=2238.58..2238.59 rows=1 width=32)
>> (actual time=25.647..25.647 rows=1 loops=211)"
>> "             InitPlan 14 (returns $15)"
>> "               ->  CTE Scan on parameters parameters_2
>> (cost=0.00..0.02 rows=1 width=16) (actual time=0.003..0.003 rows=1
>> loops=1)"
>> "             ->  Hash Semi Join  (cost=3.02..2237.79 rows=309
>> width=5) (actual time=24.698..25.620 rows=14 loops=211)"
>> "                   Hash Cond: (fact_acct_2.account_id = (unnest($17)))"
>> "                   ->  Seq Scan on fact_acct fact_acct_2
>> (cost=0.00..2225.25 rows=2317 width=12) (actual time=17.178..23.602
>> rows=2136 loops=211)"
>> "                         Filter: (c_period_id = $15)"
>> "                         Rows Removed by Filter: 46524"
>> "                   ->  Hash  (cost=1.77..1.77 rows=100 width=32)
>> (actual time=1.626..1.626 rows=19 loops=211)"
>> "                         Buckets: 1024  Batches: 1  Memory Usage: 9kB"
>> "                         ->  Result  (cost=0.26..0.77 rows=100
>> width=32) (actual time=1.614..1.618 rows=19 loops=211)"
>> "                               InitPlan 15 (returns $17)"
>> "                                 ->  Result (cost=0.00..0.26 rows=1
>> width=32) (actual time=1.608..1.608 rows=1 loops=211)"
>> "     SubPlan 18"
>> "       ->  Aggregate  (cost=1517.00..1517.01 rows=1 width=32)
>> (actual time=6.568..6.568 rows=1 loops=2272)"
>> "             InitPlan 17 (returns $18)"
>> "               ->  CTE Scan on parameters parameters_3
>> (cost=0.00..0.02 rows=1 width=16) (actual time=0.004..0.004 rows=1
>> loops=1)"
>> "             ->  Index Scan using factacct_idxmayor2 on fact_acct
>> fact_acct_3  (cost=0.41..1516.97 rows=3 width=5) (actual
>> time=6.133..6.562 rows=1 loops=2272)"
>> "                   Index Cond: (account_id = val.c_elementvalue_id)"
>> "                   Filter: (c_period_id = $18)"
>> "                   Rows Removed by Filter: 20"
>> "     SubPlan 19"
>> "       ->  Result  (cost=0.00..0.26 rows=1 width=32) (actual
>> time=0.855..0.856 rows=1 loops=2483)"
>> "     SubPlan 21"
>> "       ->  Result  (cost=0.26..0.52 rows=1 width=32) (actual
>> time=289.982..289.982 rows=1 loops=211)"
>> "             InitPlan 20 (returns $22)"
>> "               ->  Result  (cost=0.00..0.26 rows=1 width=32) (actual
>> time=1.553..1.554 rows=1 loops=211)"
>> "     SubPlan 22"
>> "       ->  Result  (cost=0.00..0.26 rows=1 width=32) (actual
>> time=17.417..17.417 rows=1 loops=2272)"
>> "Planning time: 14.832 ms"
>> "Execution time: 208957.198 ms"
>

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jairo Graterón 2019-03-23 14:23:31 No se puede acceder a la BD
Previous Message Stephen Amell 2019-03-21 17:33:51 Re: Leer plan de ejecución