Pessoal,

Estava com alguns problemas de lock e decidi atualizar minha versão do
PostgreSQL da 8.2 para a 8.4, onde muitos avanços foram feitos nesse campo.
Contudo, para minha surpresa, a performance caiu drasticamente. O curioso é
que as máquinas físicas são idênticas fisicamente e mantive exatamente os
mesmos parâmetros de configuração para o PostgreSQL. Para se ter uma ideia
da queda, vou mostrar a saída do EXPLAIN ANALYZE para a mesma consulta nos
diferentes bancos.

*Consulta no PostgreSQL 8.2*

 Sort  (cost=1029.63..1029.71 rows=33 width=42) (actual
time=3895.353..3895.361 rows=67 loops=1)
   Sort Key:
acs_object__name(apm_package__parent_id(public.forums_forums.package_id)),
public.forums_forums.name
   ->  Nested Loop  (cost=39.87..1028.80 rows=33 width=42) (actual
time=743.868..3832.291 rows=67 loops=1)
         ->  Bitmap Heap Scan on forums_forums  (cost=39.87..464.01 rows=33
width=42) (actual time=260.795..1754.423 rows=67 loops=1)
               Recheck Cond: ((package_id = ANY
('{0,840191,1486834,626929,520062,1101742,1160464,1161067,2750196,3500360,133998,3673774,3676596,368
6932,4860207,5986896,10050612,10157702,4645,93855,3186091,601355,22297512,6552691,21650654,8265465,23731964,33752302,15316177}'::integer[]))
AND (en
abled_p = 't'::bpchar))
               Filter: (subplan)
               ->  Bitmap Index Scan on forums_forums_pkg_enable_idx
 (cost=0.00..39.86 rows=66 width=0) (actual time=56.270..56.270 rows=191
loops=
1)
                     Index Cond: ((package_id = ANY
('{0,840191,1486834,626929,520062,1101742,1160464,1161067,2750196,3500360,133998,3673774,3676596
,3686932,4860207,5986896,10050612,10157702,4645,93855,3186091,601355,22297512,6552691,21650654,8265465,23731964,33752302,15316177}'::integer[]))
AND
 (enabled_p = 't'::bpchar))
               SubPlan
                 ->  Nested Loop  (cost=0.00..21724.67 rows=4088 width=0)
(actual time=25.336..25.336 rows=1 loops=67)
                       ->  Nested Loop  (cost=0.00..14348.63 rows=9292
width=4) (actual time=16.059..17.942 rows=12 loops=67)
                             Join Filter: ((pdm.privilege)::text =
(p.privilege)::text)
                             ->  Seq Scan on acs_privilege_descendant_map
pdm  (cost=0.00..9.23 rows=4 width=16) (actual time=0.103..0.103 rows=1 lo
ops=67)
                                   Filter: ((descendant)::text =
'read_private_data'::text)
                             ->  Nested Loop  (cost=0.00..3038.60
rows=43700 width=17) (actual time=15.022..17.830 rows=16 loops=67)
                                   ->  Index Scan using
acs_obj_ctx_idx_object_id_idx on acs_object_context_index c
 (cost=0.00..17.37 rows=48 width
=4) (actual time=10.316..11.088 rows=3 loops=67)
                                         Index Cond: (object_id = $0)
                                   ->  Index Scan using
acs_permissions_object_id_idx on acs_permissions p  (cost=0.00..62.32
rows=50 width=21) (actual time=1.726..1.995 rows=5 loops=226)
                                         Index Cond: (c.ancestor_id =
p.object_id)
                       ->  Index Scan using party_approved_member_map_pk on
party_approved_member_map pamm  (cost=0.00..0.78 rows=1 width=4) (actual
time=0.637..0.637 rows=0 loops=776)
                             Index Cond: ((pamm.party_id = p.grantee_id)
AND (pamm.member_id = 3443))
         ->  Index Scan using acs_objects_pk on acs_objects
 (cost=0.00..8.82 rows=1 width=4) (actual time=16.205..16.207 rows=1
loops=67)
               Index Cond: (acs_objects.object_id =
public.forums_forums.forum_id)
         SubPlan
           ->  Index Scan using site_nodes_object_id_idx on site_nodes
 (cost=0.00..8.27 rows=1 width=4) (actual time=0.581..0.582 rows=1 loops=67)
                 Index Cond: (object_id = $0)
 Total runtime: *3895.939* ms
(27 registros)


*Consulta no PostgreSQL 8.4*
*
*
 Sort  (cost=3616469.97..3616470.15 rows=72 width=39) (actual
time=95704.475..95704.486 rows=67 loops=1)
   Sort Key:
(acs_object__name(apm_package__parent_id(public.forums_forums.package_id))),
public.forums_forums.name
   Sort Method:  quicksort  Memory: 35kB
   ->  Nested Loop Semi Join  (cost=0.00..3616467.75 rows=72 width=39)
(actual time=196.064..95703.983 rows=67 loops=1)
         Join Filter: (public.forums_forums.package_id = c.object_id)
         ->  Nested Loop  (cost=0.00..663.18 rows=72 width=39) (actual
time=0.042..2.175 rows=67 loops=1)
               ->  Seq Scan on forums_forums  (cost=0.00..31.16 rows=72
width=39) (actual time=0.017..0.899 rows=67 loops=1)
                     Filter: ((enabled_p = 't'::bpchar) AND (package_id =
ANY
('{0,840191,1486834,626929,520062,1101742,1160464,1161067,2750196,3500360,133998,3673774,3676596,3686932,4860207,5986896,10050612,10157702,4645,93855,3186091,601355,22297512,6552691,21650654,8265465,23731964,33752302,15316177}'::integer[])))
               ->  Index Scan using acs_objects_pk on acs_objects
 (cost=0.00..8.77 rows=1 width=4) (actual time=0.014..0.016 rows=1 loops=67)
                     Index Cond: (acs_objects.object_id =
public.forums_forums.forum_id)
         ->  Nested Loop  (cost=0.00..982907.73 rows=397639583 width=4)
(actual time=0.102..1117.157 rows=1396734 loops=67)
               ->  Nested Loop  (cost=0.00..12218.50 rows=45973 width=4)
(actual time=0.073..0.487 rows=92 loops=67)
                     Join Filter: ((p.privilege)::text =
(pdm.privilege)::text)
                     ->  Seq Scan on acs_privilege_descendant_map pdm
 (cost=0.00..9.23 rows=3 width=13) (actual time=0.025..0.025 rows=1
loops=67)
                           Filter: ((descendant)::text =
'read_private_data'::text)
                     ->  Nested Loop  (cost=0.00..549.81 rows=281596
width=14) (actual time=0.037..0.364 rows=231 loops=67)
                           ->  Index Scan using party_member_member_idx on
party_approved_member_map pamm  (cost=0.00..25.68 rows=18 width=4) (actual
time=0.018..0.018 rows=1 loops=67)
                                 Index Cond: (member_id = 3443)
                           ->  Index Scan using acs_permissions_grantee_idx
on acs_permissions p  (cost=0.00..28.92 rows=16 width=18) (actual
time=0.015..0.255 rows=231 loops=67)
                                 Index Cond: (p.grantee_id = pamm.party_id)
               ->  Index Scan using acs_obj_ctx_idx_ancestor_idx on
acs_object_context_index c  (cost=0.00..13.14 rows=638 width=8) (actual
time=0.008..6.993 rows=15182 loops=6164)
                     Index Cond: (c.ancestor_id = p.object_id)
         SubPlan 1
           ->  Index Scan using site_nodes_object_id_idx on site_nodes
 (cost=0.00..8.52 rows=1 width=4) (actual time=0.266..0.268 rows=1 loops=67)
                 Index Cond: (object_id = $0)
 Total runtime: *95704.632* ms
(26 registros)


As diferenças entre as decisões tomadas pelo otimizador são tão absurdas
que não sei nem por onde começar.

Será que alguém pode me dar uma luz?

-- 
Eduardo Santos
Analista de Sistemas

http://eduardosan.wordpress.com
http://twitter.com/eduardosan
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a