Thank you Laurenz!

Regards
Thomas

Le sam. 7 avr. 2018 à 00:02, Adrian Klaver <adrian.kla...@aklaver.com> a
écrit :

> On 04/06/2018 12:09 PM, Thomas Poty wrote:
> > Thank you Laurenz !
> >
> >
> > We will certainly have to change our release management.
> >
> > Is there a way to identify the list of statements that have to rewrite
> > the table.
>
> https://www.postgresql.org/docs/10/static/sql-altertable.html
>
> Notes
>
> "Adding a column with a DEFAULT clause or changing the type of an
> existing column will require the entire table and its indexes to be
> rewritten. As an exception when changing the type of an existing column,
> if the USING clause does not change the column contents and the old type
> is either binary coercible to the new type or an unconstrained domain
> over the new type, a table rewrite is not needed; but any indexes on the
> affected columns must still be rebuilt. Adding or removing a system oid
> column also requires rewriting the entire table. Table and/or index
> rebuilds may take a significant amount of time for a large table; and
> will temporarily require as much as double the disk space."
>
>
> For the more general case of modifying a table and the locks it takes,
> search the above link for lock to see what locks are taken instead of
> the default of ACCESS EXCLUSIVE.
>
> For what the locks mean see:
>
> https://www.postgresql.org/docs/10/static/explicit-locking.html
>
> >
> > If I am right, at least these statements need to do this :
> > - create a unique index
> > - add a column with a default value
>
>
>
> >
> > Regards,
> >
> >   Thomas
> >
> >
> > 2018-04-06 17:11 GMT+02:00 Laurenz Albe <laurenz.a...@cybertec.at
> > <mailto:laurenz.a...@cybertec.at>>:
> >
> >     On Fri, 2018-04-06 at 16:58 +0200, Thomas Poty wrote:
> >     > Here is a bit of context : we are migrating from MySQL to
> PostgreSQL and we have about 1000 tables.
> >     > Some tables are quite small but some others are very large. The
> service provided to our clients
> >     > relies on a high avaiability with a minimum down time due to any
> legal deadlines.
> >     >
> >     > So, lets imagine :
> >     > in Transaction 1 : I am querying Table A (select)
> >     > in Transaction 2 : I am trying to alter Table A ( due to our
> product evolution)
> >     > in Transaction 3 : I am want to query Table1 (select)
> >     >
> >     > in MySQL : Transaction 1 retrieve data in Table A.
> >     > Transaction 2 : is trying to alter Table A but it is blocked by
> Transaction 1
> >     > Transaction 3 : Transaction 1 retrieves data in Table A (
> Retreiving data is possible until Transaction 2 commit)
> >     >
> >     > In PostgreSQL, it is a bit different : Transaction 1 retrieve data
> in Table A.
> >     > Transaction 2 : is trying to alter Table A but it is blocked by
> Transaction 1
> >     > Transaction 3 : Transaction 3 cannot retrieve data because
> Transaction 2 did not terminate its transaction.
> >     >
> >     > So, with MySQL, the application is able to keep working with the
> table until the alter table completed.
> >     >
> >     > With PostgreSQL, the application will probably be blocked (until
> having the lock on this table).
> >     > If I understand, if the alter table takes a long time (several
> hours) to execute, clients will be blocked during several hours.
> >     >
> >     > How do you deal with this problem? Maybe I missed something ?
> >
> >     The solution is to avoid ALTER TABLE statements that have to rewrite
> >     the table outside of maintenance windows.
> >
> >     If your transactions are short, as they should be, it should not be
> >     a big deal to add or drop a column, for example.
> >
> >     Yours,
> >     Laurenz Albe
> >     --
> >     Cybertec | https://www.cybertec-postgresql.com
> >     <https://www.cybertec-postgresql.com>
> >
> >
>
>
> --
> Adrian Klaver
> adrian.kla...@aklaver.com
>

Reply via email to