Why do I need more time with partition table?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I partitioned a table, but didn't find any improvement in query timing.

The basic table was like as follows :- 

\d table1
               Table "public.table1_old"
    Column    |            Type             |     Modifiers      
--------------+-----------------------------+--------------------
 crmid        | integer                     | not null
 smcreatorid  | integer                     | not null default 0
 smownerid    | integer                     | not null default 0
 modifiedby   | integer                     | not null default 0
 module       | character varying(30)       | not null
 description  | text                        | 
 createdtime  | timestamp without time zone | not null
 modifiedtime | timestamp without time zone | not null
 viewedtime   | timestamp without time zone | 
 status       | character varying(50)       | 
 version      | integer                     | not null default 0
 presence     | integer                     | default 1
 deleted      | integer                     | not null default 0
Indexes:
    "table1_pkey" PRIMARY KEY, btree (crmid)
    "table1_createdtime_idx" btree (createdtime)
    "table1_modifiedby_idx" btree (modifiedby)
    "table1_modifiedtime_idx" btree (modifiedtime)
    "table1_module_idx" btree (module) WHERE deleted = 0
    "table1_smcreatorid_idx" btree (smcreatorid)
    "table1_smownerid_idx" btree (smownerid)
    "ftx_en_table1_description" gin (to_tsvector('vcrm_en'::regconfig, for_fts(description)))
    "table1_deleted_idx" btree (deleted)


\d table2
                                Table "public.table2"
         Column          |          Type          |                 Modifiers                 
-------------------------+------------------------+-------------------------------------------
 table2id              | integer                | not null default 0
 subject                 | character varying(250) | not null
 semodule                | character varying(20)  | 
 table2type            | character varying(200) | not null
 date_start              | date                   | not null
 due_date                | date                   | 
 time_start              | character varying(50)  | 
 time_end                | character varying(50)  | 
 sendnotification        | character varying(3)   | not null default '0'::character varying
 duration_hours          | character varying(2)   | 
 duration_minutes        | character varying(200) | 
 status                  | character varying(200) | 
 eventstatus             | character varying(200) | 
 priority                | character varying(200) | 
 location                | character varying(150) | 
 notime                  | character varying(3)   | not null default '0'::character varying
 visibility              | character varying(50)  | not null default 'all'::character varying
 recurringtype           | character varying(200) | 
 end_date                | date                   | 
 end_time                | character varying(50)  | 
 duration_seconds        | integer                | not null default 0
 phone                   | character varying(100) | 
 vip_name                | character varying(200) | 
 is_offline_call         | smallint               | default 0
 campaign_id             | bigint                 | 
 table2_classification | character varying(255) | 
Indexes:
    "table2_pkey" PRIMARY KEY, btree (table2id)
    "table2_table2type_idx" btree (table2type)
    "table2_date_start_idx" btree (date_start)
    "table2_due_date_idx" btree (due_date)
    "table2_eventstatus_idx" btree (eventstatus)
    "table2_status_idx" btree (status)
    "table2_subject_idx" btree (subject)
    "table2_time_start_idx" btree (time_start)
    "ftx_en_table2_subject" gin (to_tsvector('vcrm_en'::regconfig, for_fts(subject::text)))


As most of the queries were executed based on module.

select  module,count(*) from table1 group by module;
        module         | count  
-----------------------+--------
 Leads                 | 463237
 Calendar              | 431041
 Accounts              | 304225
 Contacts              | 299211
 Emails                | 199876
 HelpDesk              | 135977
 Potentials            |  30826
 Emails Attachment     |  28249
 Notes                 |   1029
 Accounts Attachment   |   1015


I paritioned the table based on module. And created index on each separate tables.
After parition the table structure as follows :- 

\d+ table1
                             Table "public.table1"
    Column    |            Type             |     Modifiers      | Storage  | Description 
--------------+-----------------------------+--------------------+----------+-------------
 crmid        | integer                     | not null           | plain    | 
 smcreatorid  | integer                     | not null default 0 | plain    | 
 smownerid    | integer                     | not null default 0 | plain    | 
 modifiedby   | integer                     | not null default 0 | plain    | 
 module       | character varying(30)       | not null           | extended | 
 description  | text                        |                    | extended | 
 createdtime  | timestamp without time zone | not null           | plain    | 
 modifiedtime | timestamp without time zone | not null           | plain    | 
 viewedtime   | timestamp without time zone |                    | plain    | 
 status       | character varying(50)       |                    | extended | 
 version      | integer                     | not null default 0 | plain    | 
 presence     | integer                     | default 1          | plain    | 
 deleted      | integer                     | not null default 0 | plain    | 
Indexes:
    "table1_pkey1" PRIMARY KEY, btree (crmid)
Child tables: table1_accounts,
              table1_calendar,
              table1_emails,
              table1_helpdesk,
              table1_leads,
              table1_others
Has OIDs: no



Without parition :-

explain analyze
select * 
from table1  as c
inner join table2 as a on c.crmid = a.table2id and deleted = 0
where module ='Leads'
;
                                                                        QUERY PLAN                                                                         
-----------------------------------------------------------------------------------------------------------------------------------------------------------
 Hash Join  (cost=93557.89..160291.06 rows=112087 width=506) (actual time=4013.152..4013.152 rows=0 loops=1)
   Hash Cond: (a.table2id = c.crmid)
   ->  Seq Scan on table2 a  (cost=0.00..18337.34 rows=681434 width=139) (actual time=0.028..834.189 rows=681434 loops=1)
   ->  Hash  (cost=73716.32..73716.32 rows=328765 width=367) (actual time=1620.810..1620.810 rows=287365 loops=1)
         Buckets: 1024  Batches: 128  Memory Usage: 226kB
         ->  Bitmap Heap Scan on table1 c  (cost=9489.85..73716.32 rows=328765 width=367) (actual time=83.092..1144.159 rows=287365 loops=1)
               Recheck Cond: (((module)::text = 'Leads'::text) AND (deleted = 0))
               ->  Bitmap Index Scan on table1_module_idx  (cost=0.00..9407.66 rows=328765 width=0) (actual time=79.232..79.232 rows=287365 loops=1)
                     Index Cond: ((module)::text = 'Leads'::text)
 Total runtime: 4013.932 ms
(10 rows)


With Parition :- 
 

explain analyze
select * 
from table1  as c
inner join table2 as a on c.crmid = a.table2id and deleted = 0
where module ='Leads';
                                                                                QUERY PLAN                                                                                
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Hash Join  (cost=108101.50..175252.57 rows=313256 width=506) (actual time=8430.588..8430.588 rows=0 loops=1)
   Hash Cond: (a.table2id = c.crmid)
   ->  Seq Scan on table2 a  (cost=0.00..18337.34 rows=681434 width=139) (actual time=0.054..870.554 rows=681434 loops=1)
   ->  Hash  (cost=89195.80..89195.80 rows=313256 width=367) (actual time=2751.950..2751.950 rows=287365 loops=1)
         Buckets: 1024  Batches: 128  Memory Usage: 226kB
         ->  Append  (cost=0.00..89195.80 rows=313256 width=367) (actual time=0.034..2304.191 rows=287365 loops=1)
               ->  Seq Scan on table1 c  (cost=0.00..89187.53 rows=313255 width=367) (actual time=0.032..1783.075 rows=287365 loops=1)
                     Filter: ((deleted = 0) AND ((module)::text = 'Leads'::text))
               ->  Index Scan using table1_leads_deleted_idx on table1_leads c  (cost=0.00..8.27 rows=1 width=280) (actual time=0.010..0.010 rows=0 loops=1)
                     Index Cond: (deleted = 0)
                     Filter: ((module)::text = 'Leads'::text)
 Total runtime: 8432.024 ms
(12 rows)

I set constraint_exclusion to partition.

Why do I need more time with parition?
Any experts please let me know.

[Postgresql General]     [Postgresql PHP]     [PHP Users]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Yosemite]

  Powered by Linux