2011-06-30 1 views
2

J'ai une table qui est partitionnée par mois et est utilisée pour contenir les informations du journal apache. Lorsque j'exécute EXPLAIN pour une requête simple qui a une clause WHERE sur le même champ que la partition CHECKs, j'obtiens le même plan si la fonction constraint_exclusion est activée ou désactivée. Vous trouverez ci-dessous les informations sur la table principale et deux exemples d'informations sur les tables filles pour février et mars 2010. Dans l'ensemble, il existe une table enfant pour chaque mois de février 2010 à juin 2011. En moyenne, chaque table enfant contient environ 100 millions d'enregistrements. Ci-dessous également la sortie de EXPLAIN pour une requête simple, une fois avec constraint_exclusion activé et une fois désactivé. Malheureusement, les contraintes CHECK ne sont pas utilisées pour réduire la taille du plan. Est-ce dû au fait que le type de données request_dt est TIMESTAMP WITH TIME ZONE mais que les contraintes CHECK sont DATES? D'autres pensées? Je n'ai pas encore créé d'index sur request_dt, mais selon la documentation qui n'est pas nécessaire. Je vais les ajouter, mais je ne pense pas qu'ils devraient avoir un impact sur l'utilisation des contraintes CHECK.Pourquoi mes contraintes de vérification sur les tables enfants ne sont-elles pas utilisées par le planificateur pour réduire la taille du plan?

J'utilise Postgres 8.3.6.

spatial_data=# \d rpt.websvcs_logs 
         Table "rpt.websvcs_logs" 
      Column   |   Type    | Modifiers 
--------------------------+-----------------------------+--------------- 
id      | bigint      | 
ins_ts     | timestamp without time zone | default now() 
server     | text      | 
host      | text      | 
request_dt    | timestamp with time zone | 
method     | text      | 
url      | text      | 
api_method    | text      | 
api_key     | text      | 
geo_type     | text      | 
geo_name     | text      | 
radius     | text      | 
lat      | text      | 
long      | text      | 
id_param     | text      | 
state     | text      | 
max      | text      | 
sort_by     | text      | 
sort_dir     | text      | 
rpp      | text      | 
page      | text      | 
ver      | text      | 
output     | text      | 
http_ver     | text      | 
status     | text      | 
size      | text      | 
x_forwarded_for   | text      | 
referrer     | text      | 
agent     | text      | 
accept_encoding   | text      | 
processing_time_sec  | text      | 
processing_time_microsec | text      | 


spatial_data=# \d rpt.websvcs_logs_201102 
        Table "rpt.websvcs_logs_201102" 
      Column   |   Type    | Modifiers 
--------------------------+-----------------------------+--------------- 
id      | bigint      | not null 
ins_ts     | timestamp without time zone | default now() 
server     | text      | 
host      | text      | 
request_dt    | timestamp with time zone | 
method     | text      | 
url      | text      | 
api_method    | text      | 
api_key     | text      | 
geo_type     | text      | 
geo_name     | text      | 
radius     | text      | 
lat      | text      | 
long      | text      | 
id_param     | text      | 
state     | text      | 
max      | text      | 
sort_by     | text      | 
sort_dir     | text      | 
rpp      | text      | 
page      | text      | 
ver      | text      | 
output     | text      | 
http_ver     | text      | 
status     | text      | 
size      | text      | 
x_forwarded_for   | text      | 
referrer     | text      | 
agent     | text      | 
accept_encoding   | text      | 
processing_time_sec  | text      | 
processing_time_microsec | text      | 
Indexes: 
    "pk_websvcs_logs_201102_id" PRIMARY KEY, btree (id) 
Check constraints: 
    "request_dt" CHECK (request_dt >= '2011-02-01'::date AND request_dt < '2011-03-01'::date) 
Inherits: rpt.websvcs_logs 


spatial_data=# \d rpt.websvcs_logs_201103 
        Table "rpt.websvcs_logs_201103" 
      Column   |   Type    | Modifiers 
--------------------------+-----------------------------+--------------- 
id      | bigint      | not null 
ins_ts     | timestamp without time zone | default now() 
server     | text      | 
host      | text      | 
request_dt    | timestamp with time zone | 
method     | text      | 
url      | text      | 
api_method    | text      | 
api_key     | text      | 
geo_type     | text      | 
geo_name     | text      | 
radius     | text      | 
lat      | text      | 
long      | text      | 
id_param     | text      | 
state     | text      | 
max      | text      | 
sort_by     | text      | 
sort_dir     | text      | 
rpp      | text      | 
page      | text      | 
ver      | text      | 
output     | text      | 
http_ver     | text      | 
status     | text      | 
size      | text      | 
x_forwarded_for   | text      | 
referrer     | text      | 
agent     | text      | 
accept_encoding   | text      | 
processing_time_sec  | text      | 
processing_time_microsec | text      | 
Indexes: 
    "pk_websvcs_logs_201103_id" PRIMARY KEY, btree (id) 
Check constraints: 
    "request_dt" CHECK (request_dt >= '2011-03-01'::date AND request_dt < '2011-04-01'::date) 
Inherits: rpt.websvcs_logs 


spatial_data=# SET constraint_exclusion = on; 
SET 
spatial_data=# EXPLAIN SELECT COUNT(*) FROM rpt.websvcs_logs WHERE request_dt = DATE '2011-03-05'; 
               QUERY 
PLAN            
------------------------------------------------------------------------------------------------------ 
Aggregate (cost=85738875.50..85738875.52 rows=1 width=0) 
    -> Append (cost=0.00..85738236.41 rows=255636 width=0) 
     -> Seq Scan on websvcs_logs (cost=0.00..11.00 rows=1 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201002 websvcs_logs (cost=0.00..564425.36 rows=1387 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201003 websvcs_logs (cost=0.00..1546537.50 rows=4287 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201004 websvcs_logs (cost=0.00..2528697.60 rows=9248 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201005 websvcs_logs (cost=0.00..3164403.20 rows=12885 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201006 websvcs_logs (cost=0.00..4476196.10 rows=12035 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201007 websvcs_logs (cost=0.00..4470579.60 rows=9543 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201008 websvcs_logs (cost=0.00..4881312.70 rows=11071 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201009 websvcs_logs (cost=0.00..4433474.70 rows=11005 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201010 websvcs_logs (cost=0.00..5419184.20 rows=13605 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201011 websvcs_logs (cost=0.00..5562311.50 rows=15424 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201012 websvcs_logs (cost=0.00..5543114.80 rows=14961 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201101 websvcs_logs (cost=0.00..7320972.20 rows=23008 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201102 websvcs_logs (cost=0.00..7413710.90 rows=23898 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201103 websvcs_logs (cost=0.00..8754694.20 rows=27241 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201104 websvcs_logs (cost=0.00..9292596.80 rows=30848 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201105 websvcs_logs (cost=0.00..9148734.80 rows=30727 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201106 websvcs_logs (cost=0.00..1217213.25 rows=4456 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 



spatial_data=# SET constraint_exclusion = off; 
SET 
spatial_data=# EXPLAIN SELECT COUNT(*) FROM rpt.websvcs_logs WHERE request_dt = DATE '2011-03-05'; 
               QUERY PLAN            
------------------------------------------------------------------------------------------------------ 
Aggregate (cost=85738875.50..85738875.52 rows=1 width=0) 
    -> Append (cost=0.00..85738236.41 rows=255636 width=0) 
     -> Seq Scan on websvcs_logs (cost=0.00..11.00 rows=1 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201002 websvcs_logs (cost=0.00..564425.36 rows=1387 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201003 websvcs_logs (cost=0.00..1546537.50 rows=4287 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201004 websvcs_logs (cost=0.00..2528697.60 rows=9248 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201005 websvcs_logs (cost=0.00..3164403.20 rows=12885 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201006 websvcs_logs (cost=0.00..4476196.10 rows=12035 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201007 websvcs_logs (cost=0.00..4470579.60 rows=9543 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201008 websvcs_logs (cost=0.00..4881312.70 rows=11071 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201009 websvcs_logs (cost=0.00..4433474.70 rows=11005 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201010 websvcs_logs (cost=0.00..5419184.20 rows=13605 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201011 websvcs_logs (cost=0.00..5562311.50 rows=15424 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201012 websvcs_logs (cost=0.00..5543114.80 rows=14961 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201101 websvcs_logs (cost=0.00..7320972.20 rows=23008 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201102 websvcs_logs (cost=0.00..7413710.90 rows=23898 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201103 websvcs_logs (cost=0.00..8754694.20 rows=27241 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201104 websvcs_logs (cost=0.00..9292596.80 rows=30848 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201105 websvcs_logs (cost=0.00..9148734.80 rows=30727 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
     -> Seq Scan on websvcs_logs_201106 websvcs_logs (cost=0.00..1217213.25 rows=4456 width=0) 
       Filter: (request_dt = '2011-03-05'::date) 
+0

Cela vous dérange remplacer votre sortie EXPLAIN ci-dessus avec les résultats de EXPLAIN ANALYZE? Je pense que cela pourrait être plus utile. –

Répondre

1

Vous devez changer le type de request_dt colonne DATE, ou modifier les contraintes de vérification travailler avec horodatage. Dans le documentation, vous pouvez voir un exemple avec une colonne de type date.

+0

Merci, ça l'a fait. J'ai changé les CONSTRAINTS de CHECK à TIMESTAMP AVEC TIME ZONE aussi bien que l'exemple de requête de base. – pixelpete

Questions connexes