Hello,
Partition pruning is not working on the updates query, am I missing something? 
Able get around this by manually pinning the table partition to the date 
partition but, it's a manual process. 
PostgreSQL 13.8 on AWS
Partition table using pg_partman v4.5.1Each daily partition contains about 15 
million rows which require to be processed using an update on the column 
p_state.
Table:  public.stat                              Partitioned table 
"public.stat"       Column        |            Type             | Collation | 
Nullable |         Default         
---------------------+-----------------------------+-----------+----------+-------------------------
 creationdate        | timestamp without time zone |           | not null |  
ver                 | text                        |           |          |  id  
                | text                        |           |          |  name    
            | text                        |           |          |  ip          
        | text                        |           | not null |  tags            
    | jsonb                       |           |          |  list                
| jsonb                       |           |          |  updated_tstamp      | 
timestamp without time zone |           |          |  p_state             | 
character varying           |           |          | 'N'::character varying 
insert_tstamp       | timestamp without time zone |           |          | 
CURRENT_TIMESTAMPPartition key: RANGE (creationdate)Indexes:    
"pk_public.stat" PRIMARY KEY, btree (creationdate, ip)    "idx_public.p_state" 
btree (p_state)Number of partitions: 47 (Use \d+ to list them.)

Query: explain WITH update_pr as (SELECT * FROM public.stat WHERE p_state = 'N' 
AND creationdate > current_timestamp - INTERVAL '5' day ORDER BY creationdate 
LIMIT 4000000) UPDATE public.stat s set p_state = 'PR' FROM update_pr u WHERE 
s.p_state = 'N' AND s.ip = u.ip AND s.creationdate = u.creationdate;            
                                                                  QUERY PLAN    
                                                                            
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Update on public.stat s  (cost=11.45..193994.25 rows=47 width=858)   Update on 
public.stat_p2023_06_25 s_1   Update on public.stat_p2023_06_26 s_2   ...   
Update on public.stat_p2023_08_09 s_46   Update on public.stat_default s_47   
->  Merge Join  (cost=11.45..4128.23 rows=1 width=966)         Merge Cond: 
(u.creationdate = s_1.creationdate)         Join Filter: (s_1.ip = u.ip)        
 ->  Subquery Scan on u  (cost=11.30..4036.97 rows=34432 width=322)             
  ->  Limit  (cost=11.30..3692.65 rows=34432 width=272)                     ->  
Merge Append  (cost=11.30..3692.65 rows=34432 width=272)                        
   Sort Key: public.stat.creationdate                           Subplans 
Removed: 29                           ->  Index Scan using 
public.stat_p2023_07_24_pkey on public.stat_p2023_07_24 public.stat_1  
(cost=0.29..1474.75 rows=23641 width=272)                                 Index 
Cond: (creationdate > (CURRENT_TIMESTAMP - '1 day'::interval day))              
                   Filter: ((p_state)::text = 'N'::text)                        
   ->  Index Scan using public.stat_p2023_07_25_pkey on public.stat_p2023_07_25 
public.stat_2  (cost=0.29..673.21 rows=10746 width=273)                         
        Index Cond: (creationdate > (CURRENT_TIMESTAMP - '1 day'::interval 
day))                                 Filter: ((p_state)::text = 'N'::text)     
                      ->  Index Scan using public.stat_p2023_07_26_pkey on 
public.stat_p2023_07_26 public.stat_3  (cost=0.15..11.89 rows=1 width=664) ..   
                    ->  Index Scan using public.stat_p2023_08_02_pkey on 
public.stat_p2023_08_02 public.stat_10  (cost=0.15..11.89 rows=1 width=664)     
                            Index Cond: (creationdate > (CURRENT_TIMESTAMP - '1 
day'::interval day))                                 Filter: ((p_state)::text = 
'N'::text)                           ->  Index Scan using 
public.stat_p2023_08_03_pkey on public.stat_p2023_08_03 public.stat_11  
(cost=0.15..11.89 rows=1 width=664)                                 Index Cond: 
(creationdate > (CURRENT_TIMESTAMP - '1 day'::interval day))                    
             Filter: ((p_state)::text = 'N'::text)                           -> 
 Index Scan using public.stat_p2023_08_04_pkey on public.stat_p2023_08_04 
public.stat_12  (cost=0.15..11.89 rows=1 width=664)                             
    Index Cond: (creationdate > (CURRENT_TIMESTAMP - '1 day'::interval day))    
                             Filter: ((p_state)::text = 'N'::text)              
             ->  Index Scan using public.stat_p2023_08_05_pkey on 
public.stat_p2023_08_05 public.stat_13  (cost=0.15..11.89 rows=1 width=664)     
                            Index Cond: (creationdate > (CURRENT_TIMESTAMP - '1 
day'::interval day))                                 Filter: ((p_state)::text = 
'N'::text)                           ->  Index Scan using 
public.stat_p2023_08_06_pkey on public.stat_p2023_08_06 public.stat_14  
(cost=0.15..11.89 rows=1 width=664)                                 Index Cond: 
(creationdate > (CURRENT_TIMESTAMP - '1 day'::interval day))                    
             Filter: ((p_state)::text = 'N'::text)                           -> 
 Index Scan using public.stat_p2023_08_07_pkey on public.stat_p2023_08_07 
public.stat_15  (cost=0.15..11.89 rows=1 width=664)                             
    Index Cond: (creationdate > (CURRENT_TIMESTAMP - '1 day'::interval day))    
                             Filter: ((p_state)::text = 'N'::text)              
             ->  Index Scan using public.stat_p2023_08_08_pkey on 
public.stat_p2023_08_08 public.stat_16  (cost=0.15..11.89 rows=1 width=664)     
                            Index Cond: (creationdate > (CURRENT_TIMESTAMP - '1 
day'::interval day))                                 Filter: ((p_state)::text = 
'N'::text)                           ->  Index Scan using 
public.stat_p2023_08_09_pkey on public.stat_p2023_08_09 public.stat_17  
(cost=0.15..11.89 rows=1 width=664)                                 Index Cond: 
(creationdate > (CURRENT_TIMESTAMP - '1 day'::interval day))                    
             Filter: ((p_state)::text = 'N'::text)                           -> 
 Index Scan using public.stat_default_pkey on public.stat_default 
public.stat_18  (cost=0.15..11.89 rows=1 width=664)                             
    Index Cond: (creationdate > (CURRENT_TIMESTAMP - '1 day'::interval day))    
                             Filter: ((p_state)::text = 'N'::text)         ->  
Materialize  (cost=0.15..2.18 rows=1 width=638)               ->  Index Scan 
using public.stat_p2023_06_25_pkey on public.stat_p2023_06_25 s_1  
(cost=0.15..2.17 rows=1 width=638)                     Index Cond: 
((creationdate >= (CURRENT_TIMESTAMP - '1 day'::interval day)) AND 
(creationdate <= (CURRENT_TIMESTAMP - '1 day'::interval day)))                  
   Filter: ((p_state)::text = 'N'::text)   ->  Merge Join  (cost=11.45..4128.23 
rows=1 width=966)         Merge Cond: (u_1.creationdate = s_2.creationdate)     
    Join Filter: (s_2.ip = u_1.ip)         ->  Subquery Scan on u_1  
(cost=11.30..4036.97 rows=34432 width=322)               ->  Limit  
(cost=11.30..3692.65 rows=34432 width=272)                     ->  Merge Append 
 (cost=11.30..3692.65 rows=34432 width=272)
Any help on this is appreciated...B.

Reply via email to