Avoid index rebuilds for no-rewrite ALTER TABLE ALTER TYPE

Поиск
Список
Период
Сортировка
От Noah Misch
Тема Avoid index rebuilds for no-rewrite ALTER TABLE ALTER TYPE
Дата
Msg-id 20110615050337.GA10879@tornado.leadboat.com
обсуждение исходный текст
Ответы Re: Avoid index rebuilds for no-rewrite ALTER TABLE ALTER TYPE  (Robert Haas <robertmhaas@gmail.com>)
Список pgsql-hackers
Previous version (at7-alt-index-opfamily.patch):
http://archives.postgresql.org/message-id/20110113230124.GA18733@tornado.gateway.2wire.net
Design:
http://archives.postgresql.org/message-id/20110524104029.GB18831@tornado.gateway.2wire.net

Patches committed in 2011CF1 allow ALTER TABLE ... ALTER ... SET DATA TYPE to
avoid rewriting the table in certain cases.  We still rebuild all indexes and
recheck all foreign key constraints dependent on the changing column.  This
patch avoids the rebuild for some indexes, using the operator family facility
to identify when that is safe.

Changes since last version:

* Instead of noting in comments that the operator family contracts do not make
the guarantees I desire and opining that the code is fine in practice anyway,
I amend those contracts in the documentation.  See the aforementioned design
explanation, but note that its third and fifth sentences are incorrect.  I
settled on requiring identical behavior among operators in the family after
implicit casts (of any castmethod) or binary coercion casts (of any
castcontext) on operands.  I really only need the requirement for binary
coercion casts, but implicit casts seem like a obvious extension.

* Update for per-column collations.  Index collations need to match.

* We don't assign meaning to GIN or GiST operator family groupings.  For
access methods other than btree and hash, require an index rebuild unless the
operator classes match exactly.  Even if we could do otherwise, it would
currently be academic; GIN "array_ops" is the only such family with more than
one constituent operator class.  The only practical case I've observed to be
helped here is a conversion like varchar(2)[] -> varchar(4)[] with a GIN index
on the column; operator class comparison covers that fine.

* Remove support for avoiding foreign key constraint revalidation.  This is
orthogonal to the index case, though they share many principles.  If we get
this committed, I will submit a small patch for foreign keys at a later date.

* Original patch was submitted in two forms for comment on the relative
merits.  The first form had tablecmds.c updating catalog entries pertaining to
an old index until it matched how the index would be recreated with the new
column data type.  The second form actually dropped and recreated the index
using the usual facilities, then reattached the old RelFileNode to the "new"
index.  Nobody commented, but I've come around to thinking the second approach
is clearly better.  Therefore, I'm submitting only that.

* Change the division of labor between tablecmds.c and indexcmds.c.
* Test cases removed per 2011CF1 discussion.
* Sync with variable names changed since last submission.

This patch is fully independent of the "Eliding no-op varchar length
coercions" patch I've posted recently, though they do have synergy.

Thanks,
nm

Вложения

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Robert Haas
Дата:
Сообщение: Re: procpid?
Следующее
От: Jesper Krogh
Дата:
Сообщение: Re: pg_upgrade using appname to lock out other users