Hi,

We have an issue with one of our partitioned tables. It has a column with 
timestamp without time zone type, and we had to partition it daily. To do that, 
we created the following constraints like this example:
CHECK (to_char(impression_time, 'YYYYMMDD'::text) = '20170202'::text)


The problem we’re facing is no matter how we’re trying to select from it, it 
scans through every partitions.

Parent table:
         Table "public.dfp_in_network_impressions"
     Column      |            Type             | Modifiers 
-----------------+-----------------------------+-----------
 impression_time | timestamp without time zone | 
 nexus_id        | character varying           | 
 line_item_id    | bigint                      | 
 creative_id     | bigint                      | 
 ad_unit_id      | bigint                      | 
Triggers:
    insert_dfp_in_network_impressions_trigger BEFORE INSERT ON 
dfp_in_network_impressions FOR EACH ROW EXECUTE PROCEDURE 
dfp_in_network_impressions_insert_function()
Number of child tables: 214 (Use \d+ to list them.)



One example of the child tables:
Table "dfp_in_network_impressions.dfp_in_network_impressions_20170202"
     Column      |            Type             | Modifiers 
-----------------+-----------------------------+-----------
 impression_time | timestamp without time zone | 
 nexus_id        | character varying           | 
 line_item_id    | bigint                      | 
 creative_id     | bigint                      | 
 ad_unit_id      | bigint                      | 
Indexes:
    "idx_dfp_in_network_impressions_20170202_creative_id" btree (creative_id)
    "idx_dfp_in_network_impressions_20170202_line_item_id" btree (line_item_id)
Check constraints:
    "dfp_in_network_impressions_20170202_impression_time_check" CHECK 
(to_char(impression_time, 'YYYYMMDD'::text) = '20170202'::text)
Inherits: dfp_in_network_impressions



Confirmed that the records are in the correct partitions.

We even tried to query with the exact same condition as it is defined in the 
check constraint:
explain select * from dfp_in_network_impressions where to_char(impression_time, 
'YYYYMMDD'::text) = '20170202'::text;
                                            QUERY PLAN                          
                   
---------------------------------------------------------------------------------------------------
 Append  (cost=0.00..18655467.21 rows=3831328 width=45)
   ->  Seq Scan on dfp_in_network_impressions  (cost=0.00..0.00 rows=1 width=64)
         Filter: (to_char(impression_time, 'YYYYMMDD'::text) = '20170202'::text)
   ->  Seq Scan on dfp_in_network_impressions_20170101  (cost=0.00..7261.48 
rows=1491 width=45)
         Filter: (to_char(impression_time, 'YYYYMMDD'::text) = '20170202'::text)
   ->  Seq Scan on dfp_in_network_impressions_20170219  (cost=0.00..20824.01 
rows=4277 width=45)
         Filter: (to_char(impression_time, 'YYYYMMDD'::text) = '20170202'::text)
   ->  Seq Scan on dfp_in_network_impressions_20170102  (cost=0.00..28899.83 
rows=5935 width=45)
         Filter: (to_char(impression_time, 'YYYYMMDD'::text) = '20170202'::text)
   ->  Seq Scan on dfp_in_network_impressions_20170220  (cost=0.00..95576.80 
rows=19629 width=45)
         Filter: (to_char(impression_time, 'YYYYMMDD'::text) = '20170202'::text)
   ->  Seq Scan on dfp_in_network_impressions_20170103  (cost=0.00..88588.22 
rows=18194 width=45)
         Filter: (to_char(impression_time, 'YYYYMMDD'::text) = '20170202'::text)
   ->  Seq Scan on dfp_in_network_impressions_20170221  (cost=0.00..116203.54 
rows=23865 width=45)
         Filter: (to_char(impression_time, 'YYYYMMDD'::text) = '20170202'::text)
   ->  Seq Scan on dfp_in_network_impressions_20170410  (cost=0.00..158102.98 
rows=32470 width=45)
         Filter: (to_char(impression_time, 'YYYYMMDD'::text) = '20170202'::text)
   ->  Seq Scan on dfp_in_network_impressions_20170531  (cost=0.00..116373.83 
rows=23900 width=45)
         Filter: (to_char(impression_time, 'YYYYMMDD'::text) = '20170202'::text)
   ->  Seq Scan on dfp_in_network_impressions_20170104  (cost=0.00..91502.48 
rows=18792 width=45)
         Filter: (to_char(impression_time, 'YYYYMMDD'::text) = '20170202'::text)
   ->  Seq Scan on dfp_in_network_impressions_20170222  (cost=0.00..106469.76 
rows=21866 width=45)
         Filter: (to_char(impression_time, 'YYYYMMDD'::text) = '20170202'::text)
   ->  Seq Scan on dfp_in_network_impressions_20170411  (cost=0.00..152244.92 
rows=31267 width=45)
         Filter: (to_char(impression_time, 'YYYYMMDD'::text) = '20170202'::text)
   ->  Seq Scan on dfp_in_network_impressions_20170601  (cost=0.00..117742.66 
rows=24181 width=45)
         Filter: (to_char(impression_time, 'YYYYMMDD'::text) = '20170202'::text)
   ->  Seq Scan on dfp_in_network_impressions_20170105  (cost=0.00..87029.80 
rows=17874 width=45)
         Filter: (to_char(impression_time, 'YYYYMMDD'::text) = '20170202'::text)
   ->  Seq Scan on dfp_in_network_impressions_20170223  (cost=0.00..105371.79 
rows=21641 width=45)
         Filter: (to_char(impression_time, 'YYYYMMDD'::text) = '20170202'::text)
   ->  Seq Scan on dfp_in_network_impressions_20170412  (cost=0.00..143897.43 
rows=29553 width=45)
         Filter: (to_char(impression_time, 'YYYYMMDD'::text) = '20170202'::text)
… Etc.

It scans through every partitions. Shouldn’t it only scan the 
dfp_in_network_impressions.dfp_in_network_impressions_20170202 child table? Or 
we missing something?
Any advice/help would highly appreciated.

System details:
Postgres version: PostgreSQL 9.4.4 on x86_64-unknown-linux-gnu, compiled by gcc 
(GCC) 4.4.7 20120313 (Red Hat 4.4.7-11), 64-bit
The constraint_exclusion parameter is set to partition, but same behavior when 
I set it to “on”.

SELECT name, current_setting(name), SOURCE
  FROM pg_settings
  WHERE SOURCE NOT IN ('default', 'override’);

             name             |             current_setting             |       
 source        
------------------------------+-----------------------------------------+----------------------
 application_name             | psql                                    | client
 archive_command              | /var/db/wal_archive.sh %p %f | configuration 
file
 archive_mode                 | on                                      | 
configuration file
 autovacuum_naptime           | 1min                                    | 
configuration file
 checkpoint_completion_target | 0.9                                     | 
configuration file
 checkpoint_segments          | 32                                      | 
configuration file
 client_encoding              | UTF8                                    | client
 DateStyle                    | ISO, MDY                                | 
configuration file
 default_text_search_config   | pg_catalog.english                      | 
configuration file
 effective_cache_size         | 96GB                                    | 
configuration file
 huge_pages                   | try                                     | 
configuration file
 lc_messages                  | en_US.UTF-8                             | 
configuration file
 lc_monetary                  | en_US.UTF-8                             | 
configuration file
 lc_numeric                   | en_US.UTF-8                             | 
configuration file
 lc_time                      | en_US.UTF-8                             | 
configuration file
 listen_addresses             | *                                       | 
configuration file
 log_autovacuum_min_duration  | 0                                       | 
configuration file
 log_checkpoints              | on                                      | 
configuration file
 log_connections              | on                                      | 
configuration file
 log_destination              | stderr                                  | 
configuration file
 log_directory                | /var/log/postgresql                     | 
configuration file
 log_duration                 | on                                      | 
configuration file
 log_file_mode                | 0640                                    | 
configuration file
 log_filename                 | postgresql-%Y%m%d.log                   | 
configuration file
 log_line_prefix              | %t [%p]: [%l-1] %h %d %u                | 
configuration file
 log_lock_waits               | on                                      | 
configuration file
 log_min_duration_statement   | 100ms                                   | 
configuration file
 log_min_error_statement      | warning                                 | 
configuration file
 log_min_messages             | warning                                 | 
configuration file
 log_rotation_age             | 1d                                      | 
configuration file
 log_rotation_size            | 0                                       | 
configuration file
 log_statement                | ddl                                     | 
configuration file
 log_timezone                 | US/Central                              | 
configuration file
 log_truncate_on_rotation     | on                                      | 
configuration file
 logging_collector            | on                                      | 
configuration file
 maintenance_work_mem         | 1GB                                     | 
configuration file
 max_connections              | 110                                     | 
configuration file
 max_locks_per_transaction    | 256                                     | 
configuration file
 max_stack_depth              | 2MB                                     | 
environment variable
 max_wal_senders              | 3                                       | 
configuration file
 port                         | 5432                                    | 
configuration file
 shared_buffers               | 64GB                                    | 
configuration file
 TimeZone                     | US/Central                              | 
configuration file
 track_activities             | on                                      | 
configuration file
 track_counts                 | on                                      | 
configuration file
 track_functions              | none                                    | 
configuration file
 track_io_timing              | off                                     | 
configuration file
 wal_keep_segments            | 2000                                    | 
configuration file
 wal_level                    | hot_standby                             | 
configuration file
 work_mem                     | 768MB                                   | 
configuration file




Linux 2.6.32-504.30.3.el6.x86_64 #1 SMP Wed Jul 15 10:13:09 UTC 2015 x86_64 
x86_64 x86_64 GNU/Linux



Thank you!
Aniko







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

Reply via email to