2008/11/10 Edwin Quijada <[EMAIL PROTECTED]>:
>
>> Date: Mon, 10 Nov 2008 11:36:49 -0400
>> From: [EMAIL PROTECTED]
>> To: pgsql-es-ayuda@postgresql.org
>> Subject: Re: [pgsql-es-ayuda] SELECT muy LENTO
>>
>> El día 10 de noviembre de 2008 11:09, Edwin Quijada
>>  escribió:
>>>
>>> ten go un select el cual usando un indice en una tabla de 3,000,000 dura 
>>> mas de 30 seg. El problema es que el no usa el indice en esta tabla y se va 
>>> por una busqueda secuencial
>>>
>>> Este es el select y el EXPLAIN de cada uno
>>> SELECT
>>>
>>>
>>> B.fid_disposition,
>>>
>>> COUNT(1)
>>> FROM
>>>
>>>    aegon.ttransaction_head A,
>>>
>>> aegon.ttransaction_det B
>>> WHERE
>>> 1=1
>>>            AND
>>> A.fdate_proccess=NOW()::DATE-90
>>>    AND
>>> b.fdate_proccess=A.fdate_proccess
>>>            AND
>>> B.fsec_doc=A.fsec_doc
>>> GROUP BY
>>> B.fid_disposition
>>>
>>> QUERY
>>> PLAN
>>> HashAggregate
>>> (cost=179822.04..179822.05 rows=1 width=8) (actual time=196.783..196.803 
>>> rows=26
>>> loops=1)
>>>  ->  Hash Join
>>> (cost=74707.34..179818.22 rows=763 width=8) (actual time=67.516..172.596
>>> rows=34075 loops=1)
>>>        Hash Cond: (b.fsec_doc =
>>> a.fsec_doc)
>>>        ->  Bitmap Heap Scan on
>>> ttransaction_det b  (cost=744.97..104756.35 rows=44887 width=16) (actual
>>> time=7.545..36.134 rows=34075 loops=1)
>>>              Recheck Cond:
>>> (fdate_proccess = ((now())::date - 90))
>>>              ->  Bitmap Index
>>> Scan on ttransaction_det_idx3  (cost=0.00..733.75 rows=44887 width=0) 
>>> (actual
>>> time=6.046..6.046 rows=34075 loops=1)
>>>                    Index Cond:
>>> (fdate_proccess = ((now())::date - 90))
>>>        ->  Hash
>>> (cost=73109.94..73109.94 rows=51955 width=8) (actual time=59.944..59.944
>>> rows=34649 loops=1)
>>>              ->  Bitmap Heap
>>> Scan on ttransaction_head a  (cost=1459.53..73109.94 rows=51955 width=8) 
>>> (actual
>>> time=6.694..35.741 rows=34649 loops=1)
>>>                    Recheck Cond:
>>> (fdate_proccess = ((now())::date - 90))
>>>                    ->  Bitmap
>>> Index Scan on ttransaction_head_idx  (cost=0.00..1446.54 rows=51955 width=0)
>>> (actual time=5.860..5.860 rows=34649 loops=1)
>>>                          Index
>>> Cond: (fdate_proccess = ((now())::date - 90))
>>> Total runtime: 196.904
>>> msEn este la busqueda es totalmente indexada pero tuve que agregar la fecha 
>>> en el detalle. El modelo que estoy usando es Header/Detalle. Mi tabla de 
>>> header 3.5 millones de records
>>>
>>> Ahora veamos como deberia ser por normalizacion:
>>> SELECT
>>>
>>>
>>> B.fid_disposition,
>>>
>>> COUNT(1)
>>> FROM
>>>
>>>
>>> aegon.ttransaction_head A,
>>>
>>> aegon.ttransaction_det B
>>> WHERE
>>> 1=1
>>>            AND
>>> A.fdate_proccess=NOW()::DATE-90
>>>            AND
>>> B.fsec_doc=A.fsec_doc
>>> GROUP BY
>>> B.fid_disposition
>>>
>>>
>>>  QUERY
>>> PLAN
>>> HashAggregate
>>> (cost=494710.46..494710.62 rows=13 width=8) (actual 
>>> time=30808.479..30808.498
>>> rows=26 loops=1)
>>>  ->  Hash Join
>>> (cost=73937.37..493899.45 rows=162201 width=8) (actual 
>>> time=106.614..30780.621
>>> rows=34075 loops=1)
>>>        Hash Cond: (b.fsec_doc =
>>> a.fsec_doc)
>>>        ->  Seq Scan on
>>> ttransaction_det b  (cost=0.00..274669.35 rows=9541235 width=12) (actual
>>> time=0.010..21649.412 rows=9541235 loops=1)
>>>        ->  Hash
>>> (cost=73109.94..73109.94 rows=51955 width=4) (actual time=58.139..58.139
>>> rows=34649 loops=1)
>>>              ->  Bitmap Heap
>>> Scan on ttransaction_head a  (cost=1459.53..73109.94 rows=51955 width=4) 
>>> (actual
>>> time=6.664..34.658 rows=34649 loops=1)
>>>                    Recheck Cond:
>>> (fdate_proccess = ((now())::date - 90))
>>>                    ->  Bitmap
>>> Index Scan on ttransaction_head_idx  (cost=0.00..1446.54 rows=51955 width=0)
>>> (actual time=5.825..5.825 rows=34649 loops=1)
>>>                          Index
>>> Cond: (fdate_proccess = ((now())::date - 90))
>>> Total runtime: 30808.604
>>> ms
>>> La pregunta porque el en la tabla
>>> ttransaction_det usa seq si existe un indice para ser usado en el campo 
>>> B.fsec_doc y cuando agrego la fecha a esta tabla, como se muestra en el 
>>> query anterior, tuve que agregar la fecha a la tabla de detalle para lograr 
>>> esos tiempos, obviamente esto no es muy deseable pero funciona.
>>>
>>>
>>>
>>>
>>>
>>>
>>> *-------------------------------------------------------*
>>> *-Edwin Quijada
>>> *-Developer DataBase
>>> *-JQ Microsistemas
>>> *-809-849-8087
>>> * " Si deseas lograr cosas excepcionales debes de hacer cosas fuera de lo 
>>> comun"
>>> *-------------------------------------------------------*
>>
>> Puedes probar esto:
>>
>> SELECT
>>       B.fid_disposition,
>>       COUNT(1)
>> FROM
>>     aegon.ttransaction_head A left join aegon.ttransaction_det B
>>       on (B.fsec_doc=A.fsec_doc)
>> WHERE
>>      A.fdate_proccess=NOW()::DATE-90
>> GROUP BY
>>       B.fid_disposition
>>
>> Y pasar su explain...
>> Un abrazo...
>
> QUERY
> PLAN
> HashAggregate
> (cost=1912625.95..1912626.11 rows=13 width=8) (actual 
> time=70053.267..70053.288
> rows=27 loops=1)
>  ->  Merge Left
> Join  (cost=1893364.90..1911814.94 rows=162201 width=8) (actual
> time=69865.481..70028.299 rows=34649 loops=1)
>        Merge Cond:
> (a.fsec_doc = b.fsec_doc)
>        ->  Sort
> (cost=41212.03..41341.92 rows=51955 width=4) (actual time=85.736..126.155
> rows=34649 loops=1)
>              Sort Key:
> a.fsec_doc
>              Sort
> Method:  external merge  Disk: 536kB
>              ->
> Bitmap Heap Scan on ttransaction_head a  (cost=863.18..36519.67 rows=51955
> width=4) (actual time=6.515..33.626 rows=34649
> loops=1)
>
>    Recheck Cond: (fdate_proccess = ((now())::date -
> 90))
>
> ->  Bitmap Index Scan on ttransaction_head_idx  (cost=0.00..850.19 rows=51955
> width=0) (actual time=5.715..5.715 rows=34649
> loops=1)
>
> Index Cond: (fdate_proccess = ((now())::date - 90))
>        ->
> Materialize  (cost=1821037.54..1940302.98 rows=9541235 width=12) (actual
> time=53054.609..65731.956 rows=7197404 loops=1)
>              ->
> Sort  (cost=1821037.54..1844890.63 rows=9541235 width=12) (actual
> time=53054.599..59054.449 rows=7197404 loops=1)
>
> Sort Key: b.fsec_doc
>
> Sort Method:  external merge  Disk: 223744kB
>
> ->  Seq Scan on ttransaction_det b  (cost=0.00..274669.35 rows=9541235
> width=12) (actual time=0.011..23617.133 rows=9541235
> loops=1)
> Total runtime:
> 70156.264 ms

Uf, nada optimo, podrías enviar las setencias create table de tus tablas?


-- 
§~^Calabaza^~§ from Villa Elisa, Paraguay
----------------
A hendu hína: artist - Track 05
http://foxytunes.com/artist/artist/track/track+05
--
TIP 9: visita nuestro canal de IRC #postgresql-es en irc.freenode.net

Responder a