| From: | "Dean Gibson (DB Administrator)" <postgresql4(at)ultimeth(dot)com> | 
|---|---|
| To: | pgsql-general <pgsql-general(at)postgresql(dot)org> | 
| Subject: | Re: Planner regression in 8.0.x ? | 
| Date: | 2005-10-17 19:17:03 | 
| Message-ID: | 4353F8AF.5060002@ultimeth.com | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-general | 
I don't have the plan for the original query under 7.4, but you will 
note I've posted a work-around for 8.0.4 that runs in a fraction of a 
second on 8.0.4, and here's the plan for that:
 Sort  (cost=2393.24..2393.25 rows=2 width=114)
   Sort Key: "_Pending".receipt_date, 
"substring"(("_Pending".callsign)::text, '[0-9]'::text), 
"_Pending".callsign, "_Pending".uls_file_num, "_Pending".seq_num
   ->  Nested Loop  (cost=0.00..2393.23 rows=2 width=114)
         Join Filter: (("outer".prediction)::text ~~ 
("inner".prediction)::text)
         ->  Seq Scan on "_Pending"  (cost=0.00..2266.61 rows=10 width=112)
               Filter: ((((((vanity_type)::text || ' - '::text) || 
(COALESCE((subplan), '???'::character 
varying))::text))::bpchar)::character(1) = 'A'::bpchar)
               SubPlan
                 ->  Limit  (cost=0.00..1.07 rows=1 width=19)
                       ->  Seq Scan on "_VanityType"  (cost=0.00..1.07 
rows=1 width=19)
                             Filter: (vanity_id = $8)
         ->  Seq Scan on "_Prediction"  (cost=0.00..1.21 rows=21 width=18)
         SubPlan
           ->  Index Scan using "_HD_pkey" on "_HD"  (cost=0.00..3.01 
rows=1 width=6)
                 Index Cond: (unique_system_identifier = $7)
           ->  Limit  (cost=0.00..1.01 rows=1 width=0)
                 ->  Seq Scan on "_ReservedCall"  (cost=0.00..1.01 
rows=1 width=0)
                       Filter: ($2 ~ (pattern)::text)
           ->  Subquery Scan archivejb  (cost=22.04..22.20 rows=2 width=0)
                 ->  Unique  (cost=22.04..22.18 rows=2 width=229)
                       ->  Sort  (cost=22.04..22.04 rows=2 width=229)
                             Sort Key: callsign, fcc_reg_num, 
licensee_id, prev_callsign, trustee_callsign, applicant_type, 
operator_class, prev_class, radio_service, license_status, geo_region, 
grant_date, effective_date, cancel_date, expire_date, last_action_date, 
entity_name, first_name, middle_init, last_name, name_suffix, address, 
po_box, city, state, zip9, sys_id
                             ->  Append  (cost=0.00..22.03 rows=2 width=229)
                                   ->  Subquery Scan "*SELECT* 1"  
(cost=0.00..12.12 rows=1 width=229)
                                         ->  Nested Loop  
(cost=0.00..12.11 rows=1 width=229)
                                               ->  Nested Loop  
(cost=0.00..9.04 rows=1 width=107)
                                                     ->  Index Scan 
using "_HD_callsign" on "_HD"  (cost=0.00..6.01 rows=1 width=49)
                                                           Index Cond: 
($2 = callsign)
                                                           Filter: 
(grant_date < $5)
                                                     ->  Index Scan 
using "_AM_pkey" on "_AM"  (cost=0.00..3.02 rows=1 width=58)
                                                           Index Cond: 
("_AM".unique_system_identifier = "outer".unique_system_identifier)
                                                           Filter: ($2 = 
callsign)
                                               ->  Index Scan using 
"_EN_pkey" on "_EN"  (cost=0.00..3.02 rows=1 width=158)
                                                     Index Cond: 
("_EN".unique_system_identifier = "outer".unique_system_identifier)
                                                     Filter: ((callsign 
= $2) AND (licensee_id = $6))
                                   ->  Subquery Scan "*SELECT* 2"  
(cost=0.00..9.91 rows=1 width=186)
                                         ->  Index Scan using 
"_Lic_pkey" on "_Lic"  (cost=0.00..9.90 rows=1 width=186)
                                               Index Cond: (callsign = $2)
                                               Filter: ((licensee_id = 
$6) AND ((COALESCE((grant_date)::timestamp without time zone, 
(expire_date - '10 years'::interval)))::date < $5))
           ->  Subquery Scan archivejb  (cost=18.21..18.38 rows=1 width=0)
                 Filter: (license_status = 'A'::bpchar)
                 ->  Unique  (cost=18.21..18.35 rows=2 width=229)
                       ->  Sort  (cost=18.21..18.22 rows=2 width=229)
                             Sort Key: callsign, fcc_reg_num, 
licensee_id, prev_callsign, trustee_callsign, applicant_type, 
operator_class, prev_class, radio_service, license_status, geo_region, 
grant_date, effective_date, cancel_date, expire_date, last_action_date, 
entity_name, first_name, middle_init, last_name, name_suffix, address, 
po_box, city, state, zip9, sys_id
                             ->  Append  (cost=0.00..18.20 rows=2 width=229)
                                   ->  Subquery Scan "*SELECT* 1"  
(cost=0.00..12.12 rows=1 width=229)
                                         ->  Nested Loop  
(cost=0.00..12.11 rows=1 width=229)
                                               ->  Nested Loop  
(cost=0.00..9.04 rows=1 width=107)
                                                     ->  Index Scan 
using "_HD_callsign" on "_HD"  (cost=0.00..6.01 rows=1 width=49)
                                                           Index Cond: 
($4 = callsign)
                                                           Filter: 
(grant_date < $5)
                                                     ->  Index Scan 
using "_AM_pkey" on "_AM"  (cost=0.00..3.02 rows=1 width=58)
                                                           Index Cond: 
("_AM".unique_system_identifier = "outer".unique_system_identifier)
                                                           Filter: 
((previous_callsign = $2) AND ($4 = callsign))
                                               ->  Index Scan using 
"_EN_pkey" on "_EN"  (cost=0.00..3.02 rows=1 width=158)
                                                     Index Cond: 
("_EN".unique_system_identifier = "outer".unique_system_identifier)
                                                     Filter: (callsign = $4)
                                   ->  Subquery Scan "*SELECT* 2"  
(cost=0.00..6.09 rows=1 width=186)
                                         ->  Index Scan using 
"_Lic_pcall" on "_Lic"  (cost=0.00..6.08 rows=1 width=186)
                                               Index Cond: 
(prev_callsign = $2)
                                               Filter: ((callsign = $4) 
AND ((COALESCE((grant_date)::timestamp without time zone, (expire_date - 
'10 years'::interval)))::date < $5))
           ->  Index Scan using "_HD_pkey" on "_HD"  (cost=0.00..5.91 
rows=1 width=8)
                 Index Cond: (unique_system_identifier = $3)
           ->  Seq Scan on "_GeoRestrict"  (cost=0.00..1.20 rows=1 width=1)
                 Filter: ($2 ~ (pattern)::text)
           ->  Limit  (cost=0.00..1.05 rows=1 width=9)
                 ->  Seq Scan on "_CallsignGroup"  (cost=0.00..1.05 
rows=1 width=9)
                       Filter: (group_id = $1)
           ->  Limit  (cost=0.00..2.17 rows=1 width=14)
                 ->  Nested Loop  (cost=0.00..2.17 rows=1 width=14)
                       Join Filter: ("inner".group_id = "outer".group_id)
                       ->  Seq Scan on "_OperatorClass"  
(cost=0.00..1.07 rows=1 width=5)
                             Filter: (class_id = $0)
                       ->  Seq Scan on "_CallsignGroup"  
(cost=0.00..1.04 rows=4 width=14)
           ->  Limit  (cost=0.00..1.07 rows=1 width=13)
                 ->  Seq Scan on "_OperatorClass"  (cost=0.00..1.07 
rows=1 width=13)
                       Filter: (class_id = $0)
Sorry about the post to pgsql-general;  since this appeared to be a 8.0 
regression, I posted it there.  I guess I should subscribe to 
pgsql-perform ... ???
If/when you think this will be fixed in 8.1, I'll be glad to try it 
there (assuming there's an RPM build for it).  I have three PostgreSQL 
servers supporting duplicate copies of the database, and I can easily 
take one off-line to test.  Obviously no rush, as I've got a perfectly 
good work-around.
Note that going back to 7.4.8 is not as easy, as postgresql.conf has 
changed going to 8.0, and my installation automatically migrates 
configuration files to all servers.
-- Dean
On 2005-10-17 11:56, Tom Lane wrote:
> "Dean Gibson (DB Administrator)" <postgresql4(at)ultimeth(dot)com> writes:
>   
>> The following query ran in a fraction of a second on 7.4.8:
>> ...
>> On 8.0.4, it runs for hours (stopped after two hours).  Here's the plan:
>>     
>
> Do you have the plan used by 7.4?
>
> BTW, this is not really on-topic for pgsql-general; pgsql-perform would
> be a more appropriate forum.
>   
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Robert Bernier | 2005-10-17 19:22:49 | Re: Oracle buys Innobase | 
| Previous Message | Matthew Peter | 2005-10-17 19:06:31 | Re: searching array |