| From: | ProPAAS DBA <dba(at)propaas(dot)com> | 
|---|---|
| To: | pgsql-performance(at)postgresql(dot)org | 
| Subject: | Re: why we do not create indexes on master | 
| Date: | 2016-12-27 17:43:24 | 
| Message-ID: | 6b423221-99e3-3a5a-cd92-952821eb0d7e@propaas.com | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-performance | 
Possibly some buffer caching is happening, what happens if you then 
remove the added index and run the query again?
On 12/27/2016 10:38 AM, Valerii Valeev wrote:
> Thank you David,
>
> I used same rationale to convince my colleague — it didn’t work :)
> Sort of “pragmatic” person who does what seems working no matter what 
> happens tomorrow.
> So I’m seeking for better understanding of what's happening to have 
> other cause to convince him.
>
> Let me break it down once again. The experience is as follows:
>
> - partitioning follows the guide
> - master empty, no indexes
> - child tables have index on field “field”
> - query like
> SELECT * FROM “master” WHERE “field” BETWEEN ‘1' AND ‘2’
> takes more than 100 sec
> - after that my mate adds index on “master”(“field”) — again, all data 
> is in child tables
> - same query takes under 1sec
>
> Questions I’d love to clarify:
>
> - Q1: is it correct that described situation happens because index 
> created on master does account data that is already there in child?
> - Q2: is it correct that index on master created before inserting 
> record to child tables will not take into account this record?
> - Q3: are there any other bad sides of indexes on master table?
>
> Regards,
> Val.
>
>> On Dec 27 2016, at 19:19, David G. Johnston 
>> <david(dot)g(dot)johnston(at)gmail(dot)com <mailto:david(dot)g(dot)johnston(at)gmail(dot)com>> wrote:
>>
>> On Tue, Dec 27, 2016 at 8:22 AM, Valerii Valeev 
>> <valerii(dot)valeev(at)mail(dot)ru <mailto:valerii(dot)valeev(at)mail(dot)ru>>wrote:
>>
>>     I have naive idea that it won’t help if index is created before
>>     the data is there  — i.e. indexes on master aren’t updated when
>>     data loaded to child table.
>>
>>
>> Indexes on the master table of a partition scheme never reflect the 
>> contents of child tables.
>>
>> In most partitioning schemes the master table is empty so even if it 
>> doesn't have an index on a particular field execution would typically 
>> be quick.  This is why #4 on the page you linked to:
>>
>> """
>> For each partition, create an index on the key column(s), as well as 
>> any other indexes you might want. (The key index is not strictly 
>> necessary, but in most scenarios it is helpful. If you intend the key 
>> values to be unique then you should always create a unique or 
>> primary-key constraint for each partition.)
>> """
>>
>> doesn't say anything about creating other indexes on the master 
>> table.  See #1 in that list for an explicit statement of this assumption.
>>
>> If the master is not empty, and of considerable size, and the field 
>> being searched is not indexed, then it is unsurprising that the query 
>> would take a long time to execute when obtaining rows from the master 
>> table.  If this is the case then you've gotten away from the expected 
>> usage of partitions and so need to do things that aren't in the 
>> manual to make them work.
>>
>> David J.
>>
>>
>>
>> David J.
>>
>
| From | Date | Subject | |
|---|---|---|---|
| Next Message | David G. Johnston | 2016-12-27 17:48:26 | Re: why we do not create indexes on master | 
| Previous Message | Valerii Valeev | 2016-12-27 17:38:05 | Re: why we do not create indexes on master |