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.

Reply via email to