In addition to the previous mail, I am adding here that - My Postgresql version is 9.1.2.
And one more thing, executing the following query I got two query plan where the second one looked strange to me. If showed to take 20950.579 ms, but investigating both the plan I found that it took less time in every step of second plan. explain analyze > select * > from table1 as c > inner join table2 as a on c.crmid = a.activityid and deleted = 0 > where module ='Leads'; > > QUERY PLAN > > > > ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- > Hash Join (cost=108101.50..175252.57 rows=313256 width=506) (actual > time=5194.683..5194.683 rows=0 loops=1) > Hash Cond: (a.activityid = c.crmid) > -> Seq Scan on table2 a (cost=0.00..18337.34 rows=681434 width=139) > (actual time=0.062..823.380 rows=681434 loops=1) > -> Hash (cost=89195.80..89195.80 rows=313256 width=367) (actual > time=2813.000..2813.000 rows=287365 loops=1) > Buckets: 1024 Batches: 128 Memory Usage: 226kB > -> Append (cost=0.00..89195.80 rows=313256 width=367) (actual > time=0.062..2352.646 rows=287365 loops=1) > -> Seq Scan on table1 c (cost=0.00..89187.53 rows=313255 > width=367) (actual time=0.060..1820.331 rows=287365 loops=1) > Filter: ((deleted = 0) AND ((module)::text = > 'Leads'::text)) > -> Index Scan using crmentity_leads_deleted_idx on > table1_leads c (cost=0.00..8.27 rows=1 width=280) (actual > time=11.076..11.076 rows=0 loops=1) > Index Cond: (deleted = 0) > Filter: ((module)::text = 'Leads'::text) > Total runtime: 5195.117 ms > (12 rows) > Executing the query again - *\g* > > QUERY PLAN > > > -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- > Hash Join (cost=108101.50..175252.57 rows=313256 width=506) (actual > time=20950.161..20950.161 rows=0 loops=1) > Hash Cond: (a.activityid = c.crmid) > -> Seq Scan on table2 a (cost=0.00..18337.34 rows=681434 width=139) > (actual time=0.092..835.241 rows=681434 loops=1) > -> Hash (cost=89195.80..89195.80 rows=313256 width=367) (actual > time=2774.250..2774.250 rows=287365 loops=1) > Buckets: 1024 Batches: 128 Memory Usage: 226kB > -> Append (cost=0.00..89195.80 rows=313256 width=367) (actual > time=0.061..2318.759 rows=287365 loops=1) > -> Seq Scan on table1 c (cost=0.00..89187.53 rows=313255 > width=367) (actual time=0.059..1799.937 rows=287365 loops=1) > Filter: ((deleted = 0) AND ((module)::text = > 'Leads'::text)) > -> Index Scan using crmentity_leads_deleted_idx on > table1_leads c (cost=0.00..8.27 rows=1 width=280) (actual > time=0.011..0.011 rows=0 loops=1) > Index Cond: (deleted = 0) > Filter: ((module)::text = 'Leads'::text) > Total runtime: 20950.579 ms > (12 rows) > On Tue, Jul 24, 2012 at 4:42 PM, AI Rumman <rumman...@gmail.com> wrote: > 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. >