El día 10 de noviembre de 2008 11:09, Edwin Quijada
<[EMAIL PROTECTED]> 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...
-- 
§~^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