Re: Disable an index temporarily - Mailing list pgsql-general

From Gavin Flower
Subject Re: Disable an index temporarily
Date
Msg-id 53539A64.7000006@archidevsys.co.nz
Whole thread Raw
In response to Re: Disable an index temporarily  (Torsten Förtsch <torsten.foertsch@gmx.net>)
List pgsql-general
On 20/04/14 20:09, Torsten Förtsch wrote:
> On 20/04/14 03:02, Sergey Konoplev wrote:
>
> Thanks for you reply.
>
>>> an index can be INVALID (pg_index.indisvalid=false).
>>>
>>> I want to temporarily disable an index so that it won't be used to
>>> access data but will still be updated.
>>>
>>> Can I simply set pg_index.indisvalid=false and later turn it true again?
>> It works on a quick test, but I'm not sure how safe it is.
>>
>> If you need to test a query without the index use a transaction:
>>
>> Begin;
>> Drop index ...;
>> Explain ... select ...;
>> Rollback;
> I know about that.
>
> The problem is I have a number of indexes in a large system that are
> very similar. And I suspect some of them are superfluous.
>
> Example:
>
>      btree (fmb_id, action_type)
>      btree (fmb_id)
>
> Action_type in this case is one out of a handful of values (should
> perhaps be an ENUM but is TEXT) and for most of the table the
> combination of (fmb_id, action_type) is unique. The table itself has
> ~2E8 rows. So it takes a while to build these indexes from scratch.
>
> Now, we have several performance counters in place. I want to disable
> these indexes one by one and see what happens. I am probably not able to
> find all of the queries that use them. But I believe that nothing much
> happens if I drop one of them (preferably the former?).
>
> Torsten
>
>
You might be best off dropping all indexes, then initially adding them
back individually, then in pairs etc.  As each index used, will have to
be read in from disk and consumes RAM. The more RAM that is used to hold
indexes, the less RAM there is that can be used to hold table data and
other stuff related to your queries.

Also PostgreSQL can use multiple indexes on columns.  For example if you
have an index on column A and another on column B - then a query with
restrictions on columns A, B, and C might (if the values searched for in
A & B each hit very a low fraction of pages) result in the indexes for A
& B being used to select which pages to be read in to check on the
values for C.

So sometimes an index on A & B plus an index on C & D, could be used for
a query that has restrictions on A, B, C, & E - as the 2 indexes can be
used to search on the values of A, B, & C, so restricting the pages
needing to be read to check on E.  So possibly, depending on your data
and your query mix, an index on A, B, C, & E may not be needed in
addition to the other 2 indexes - or just the latter index would be
useful - or possibly all 3 indexes.

So in your example, you might be better off with the two indexes: btree
(fmb_id) & btree (action_type) - or just the one index: btree (fmb_id,
action_type) - or all 3!

Depends on trade-offs between the cost of testing and the time saved,
how much effort you should put in!

Can you get any insights from looking at the existing queries?


Cheers,
Gavin


pgsql-general by date:

Previous
From: Torsten Förtsch
Date:
Subject: Re: Disable an index temporarily
Next
From: Thomas Kellerer
Date:
Subject: Re: Disable an index temporarily