Hi Bjorn,

I have experienced that some subqueries can be quite slow, and would suspect 
the NOT IN
clause. I occasionally rewrite 
NOT IN (select key from unwanted_candidates)
as
IN (select key from possible_candidates except select key from 
unwanted_candidates)

Admittedly, I am not running latest version

Regards
Wolfgang Hamann

>> I am trying to move a small system from Oracle to PostgreSQL and I have come 
>> upon a sql that runs really slow compared to on the Oracle database and
>> I am not able to interpret why this is slow.
>> 
>> The SQL looks like this:
>> 
>> 
>> Select a.status, a.plass, a.navn, a.avlsnr,
>>            date_part('day',(now() - s.dato)) dato_diff, v.tekst, 
>> COALESCE(a.avlsverdi,0)
>> From   sed_uttak s, sem_avlsverdi a, semin_vare v
>> where a.aktiv = 1
>> And    s.dato  = (Select Max(y.dato)
>>                           From sed_uttak y
>>                           Where y.avlsnr = s.avlsnr)
>> And    a.avlsnr = s.avlsnr
>> And    s.sedtype  = v.tallkode
>> And     a.avlsnr Not In (Select avlsnr
>>                                     From dyr_pause_mot)
>> Union
>> Select a.status, a.plass, a.navn, a.avlsnr,
>>            date_part('day',(now() - s.dato)) dato_diff, 'Tappe pause', 
>> COALESCE(a.avlsverdi,0)
>> From   sed_uttak s, sem_avlsverdi a,  dyr_pause_mot p
>> Where s.dato = (Select Max(x.dato)
>>                           From sed_uttak x
>>                           Where x.avlsnr = s.avlsnr)
>> And      a.avlsnr = s.avlsnr
>> And      a.avlsnr = p.avlsnr
>> Union
>> Select a.status, a.plass, a.navn, a.avlsnr, null dato_diff, 'IKKE TAPPET', 
>> COALESCE(a.avlsverdi,0)
>> From   sem_avlsverdi a
>> Where a.aktiv = 1
>> And   a.avlsnr Not In (Select avlsnr From sed_uttak)
>> And   a.avlsnr Not In (Select avlsnr From dyr_pause_mot)
>> 
>> 
>> 
>> And the explain result looks like this:
>> 
>> HashAggregate  (cost=7288068.92..7288092.10 rows=2318 width=36) (actual 
>> time=10740.366..10741.879 rows=6475 loops=1)                                 
>>                           
>>   Group Key: a.status, a.plass, a.navn, a.avlsnr, (date_part('day'::text, 
>> (now() - (s.dato)::timestamp with time zone))), v.tekst, 
>> (COALESCE((a.avlsverdi)::integer, 0))       
>>   ->  Append  (cost=1.46..7288028.35 rows=2318 width=36) (actual 
>> time=0.203..10730.906 rows=8915 loops=1)                                     
>>                                  
>>         ->  Nested Loop  (cost=1.46..7274678.41 rows=698 width=82) (actual 
>> time=0.203..10638.870 rows=8602 loops=1)                                     
>>                        
>>               Join Filter: (s.sedtype = v.tallkode)                          
>>                                                                              
>>                      
>>               Rows Removed by Join Filter: 127006                            
>>                                                                              
>>                      
>>               ->  Nested Loop  (cost=1.46..7274438.07 rows=698 width=26) 
>> (actual time=0.189..10607.509 rows=6164 loops=1)                             
>>                          
>>                     ->  Seq Scan on sem_avlsverdi a  (cost=1.04..153.19 
>> rows=3238 width=16) (actual time=0.024..4.027 rows=6474 loops=1)             
>>                           
>>                           Filter: ((NOT (hashed SubPlan 5)) AND (aktiv = 1)) 
>>                                                                              
>>                      
>>                           Rows Removed by Filter: 3                          
>>                                                                              
>>                      
>>                           SubPlan 5                                          
>>                                                                              
>>                      
>>                             ->  Seq Scan on dyr_pause_mot dyr_pause_mot_1  
>> (cost=0.00..1.03 rows=3 width=4) (actual time=0.002..0.003 rows=3 loops=1)   
>>                        
>>                     ->  Index Scan using idx_seduttak_avlsnr on sed_uttak s  
>> (cost=0.42..2246.53 rows=1 width=14) (actual time=1.404..1.637 rows=1 
>> loops=6474)                 
>>                           Index Cond: (avlsnr = a.avlsnr)                    
>>                                                                              
>>                      
>>                           Filter: (dato = (SubPlan 4))                       
>>                                                                              
>>                      
>>                           Rows Removed by Filter: 42                         
>>                                                                              
>>                      
>>                           SubPlan 4                                          
>>                                                                              
>>                      
>>                             ->  Aggregate  (cost=43.09..43.10 rows=1 
>> width=8) (actual time=0.037..0.037 rows=1 loops=279035)                      
>>                              
>>                                   ->  Index Scan using idx_seduttak_avlsnr 
>> on sed_uttak y  (cost=0.42..42.96 rows=52 width=8) (actual time=0.003..0.029 
>> rows=76 loops=279035)  
>>                                         Index Cond: (avlsnr = s.avlsnr)      
>>                                                                              
>>                      
>>               ->  Materialize  (cost=0.00..1.33 rows=22 width=60) (actual 
>> time=0.000..0.001 rows=22 loops=6164)                                        
>>                         
>>                     ->  Seq Scan on semin_vare v  (cost=0.00..1.22 rows=22 
>> width=60) (actual time=0.002..0.005 rows=22 loops=1)                         
>>                        
>>         ->  Nested Loop  (cost=0.70..6761.33 rows=1 width=24) (actual 
>> time=0.342..1.801 rows=3 loops=1)                                            
>>                             
>>               ->  Nested Loop  (cost=0.28..25.96 rows=3 width=20) (actual 
>> time=0.008..0.015 rows=3 loops=1)                                            
>>                         
>>                     ->  Seq Scan on dyr_pause_mot p  (cost=0.00..1.03 rows=3 
>> width=4) (actual time=0.002..0.002 rows=3 loops=1)                           
>>                      
>>                     ->  Index Scan using idx_avlsverdi_avlsnr on 
>> sem_avlsverdi a_1  (cost=0.28..8.30 rows=1 width=16) (actual 
>> time=0.003..0.003 rows=1 loops=3)                
>>                           Index Cond: (avlsnr = p.avlsnr)                    
>>                                                                              
>>                      
>>               ->  Index Scan using idx_seduttak_avlsnr on sed_uttak s_1  
>> (cost=0.42..2245.11 rows=1 width=12) (actual time=0.377..0.589 rows=1 
>> loops=3)                        
>>                     Index Cond: (avlsnr = a_1.avlsnr)                        
>>                                                                              
>>                      
>>                     Filter: (dato = (SubPlan 3))                             
>>                                                                              
>>                      
>>                     Rows Removed by Filter: 27                               
>>                                                                              
>>                      
>>                     SubPlan 3                                                
>>                                                                              
>>                      
>>                       ->  Aggregate  (cost=43.09..43.10 rows=1 width=8) 
>> (actual time=0.020..0.020 rows=1 loops=85)                                   
>>                           
>>                             ->  Index Scan using idx_seduttak_avlsnr on 
>> sed_uttak x  (cost=0.42..42.96 rows=52 width=8) (actual time=0.002..0.015 
>> rows=37 loops=85)            
>>                                   Index Cond: (avlsnr = s_1.avlsnr)          
>>                                                                              
>>                      
>>         ->  Seq Scan on sem_avlsverdi a_2  (cost=6393.04..6565.43 rows=1619 
>> width=16) (actual time=87.448..89.059 rows=310 loops=1)                      
>>                       
>>               Filter: ((NOT (hashed SubPlan 1)) AND (NOT (hashed SubPlan 2)) 
>> AND (aktiv = 1))                                                             
>>                      
>>               Rows Removed by Filter: 6167                                   
>>                                                                              
>>                      
>>               SubPlan 1                                                      
>>                                                                              
>>                      
>>                 ->  Seq Scan on sed_uttak  (cost=0.00..5694.20 rows=279120 
>> width=4) (actual time=0.005..36.384 rows=279120 loops=1)                     
>>                        
>>               SubPlan 2                                                      
>>                                                                              
>>                      
>>                 ->  Seq Scan on dyr_pause_mot  (cost=0.00..1.03 rows=3 
>> width=4) (actual time=0.002..0.003 rows=3 loops=1)                           
>>                            
>> Planning time: 0.927 ms                                                      
>>                                                                              
>>                      
>> Execution time: 10742.300ms                                                  
>>                                                                              
>>                     
>> 
>> 
>> Appreciate any pointers on where to look... :)
>> 
>> 
>> Regards,
>> 
>> BTJ
>> 
>> -- 
>> -----------------------------------------------------------------------------------------------
>> Bjørn T Johansen
>> 
>> b...@havleik.no
>> -----------------------------------------------------------------------------------------------
>> Someone wrote:
>> "I understand that if you play a Windows CD backwards you hear strange 
>> Satanic messages"
>> To which someone replied:
>> "It's even worse than that; play it forwards and it installs Windows"
>> -----------------------------------------------------------------------------------------------
>> 
>> 
>> -- 
>> Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
>> To make changes to your subscription:
>> http://www.postgresql.org/mailpref/pgsql-general






-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

Reply via email to