Re: Force specific index disuse

From: David G Johnston <david(dot)g(dot)johnston(at)gmail(dot)com>
To: pgsql-general(at)postgresql(dot)org
Subject: Re: Force specific index disuse
Date: 2014-05-20 20:08:02
Message-ID: CAKFQuwakws_FdTroN0Bi9ejk+7szMVTmcjt8R4kDxLTYzstbEA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Tue, May 20, 2014 at 3:20 PM, Jeff Janes [via PostgreSQL] <
ml-node+s1045698n5804596h0(at)n5(dot)nabble(dot)com> wrote:

> On Tue, May 20, 2014 at 11:48 AM, Steve Crawford <[hidden email]<http://user/SendEmail.jtp?type=node&node=5804596&i=0>
> > wrote:
>
>> On 05/20/2014 10:44 AM, Alvaro Herrera wrote:
>>
>>> Steve Crawford wrote:
>>>
>>>> Is there a way to force a specific index to be removed from
>>>> consideration in planning a single query?
>>>>
>>>> Specifically, on a 60-million-row table I have an index that is a
>>>> candidate for removal. I have identified the sets of nightly queries
>>>> that use the index but before dropping it I would like to run
>>>> EXPLAIN and do timing tests on the queries to see the impact of not
>>>> having that index available and rewrite the query to efficiently use
>>>> other indexes if necessary.
>>>>
>>> If you can afford to lock the table for a while, the easiest is
>>>
>>> BEGIN;
>>> DROP INDEX bothersome_idx;
>>> EXPLAIN your_query;
>>> ROLLBACK;
>>>
>>> Interesting. But what do you mean by "a while?" Does the above keep the
>> index intact (brief lock) or does it have to rebuild it on rollback?
>>
>
> Best case, 'A while' means however long it takes the explain (possibly
> analyze) to run, and for you to then type 'rollback;'
>
> worse case, someone else is already holding an incompatible lock (i.e. any
> lock) on the table, and is going to hang on to it for a long while, so your
> drop index hangs forever waiting to acquire the lock and in the process
> brings all other desired activity (except the one already holding the lock)
> to a screeching halt because they are not allowed to jump the lock queue.
>
> worser case, you forget to enter 'rollback' at all and accidentally commit
> the index drop.
>
> I use the begin...drop...rollback on test servers a lot, but rarely on
> productions servers. If I don't want to lock for that long, you can often
> alter the query to make the index useless, for example:
>
> explain select * from pgbench_accounts where aid=87;
>
> Becomes:
>
> explain select * from pgbench_accounts where aid+0=87;
>
> Although for complex queries it can be hard to find the antimagic bullet.
>
> Cheers,
>
> Jeff
>
>
​This whole line of thought is a use-case for Jaime Casanova​'s recent
proposal:


http://postgresql.1045698.n5.nabble.com/WIP-showing-index-maintenance-on-EXPLAIN-td5803106.html

Note that disabling the index as shown, via clobbering a WHERE clause,
doesn't help when the concern is how much time is being spent updating
indexes during INSERT/UPDATE.

The risk of forgetting to issue the "BEGIN;" (not so much ROLLBACK given
typical default behavior if BEGIN is indeed issued) is probably the one
that would concern me the most if working on a production server.

David J.

--
View this message in context: http://postgresql.1045698.n5.nabble.com/Force-specific-index-disuse-tp5804564p5804601.html
Sent from the PostgreSQL - general mailing list archive at Nabble.com.

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Alvaro Herrera 2014-05-20 20:20:59 Re: Force specific index disuse
Previous Message Jeff Janes 2014-05-20 19:19:51 Re: Force specific index disuse