Subject: Comment on max_locks_per_transaction

From: Josh Berkus <[email-masked]>
Date: Fri, 15 Jun 2012 11:05:30 -0700

Folks,

Way it is now:

===============

max_locks_per_transaction (integer)

    The shared lock table tracks locks on max_locks_per_transaction *
(max_connections + max_prepared_transactions) objects (e.g., tables);
hence, no more than this many distinct objects can be locked at any one
time. This parameter controls the average number of object locks
allocated for each transaction; individual transactions can lock more
objects as long as the locks of all transactions fit in the lock table.
This is not the number of rows that can be locked; that value is
unlimited. The default, 64, has historically proven sufficient, but you
might need to raise this value if you have clients that touch many
different tables in a single transaction. This parameter can only be set
at server start.

    Increasing this parameter might cause PostgreSQL to request more
System V shared memory than your operating system's default
configuration allows. See Section 17.4.1 for information on how to
adjust those parameters, if necessary.

    When running a standby server, you must set this parameter to the
same or higher value than on the master server. Otherwise, queries will
not be allowed in the standby server.

================

The way it should be:

max_locks_per_transaction (integer)

    The shared lock table tracks locks on max_locks_per_transaction *
(max_connections + max_prepared_transactions) objects (e.g., tables);
hence, no more than this many distinct objects can be locked at any one
time. This parameter controls the average number of object locks
allocated for each transaction; individual transactions can lock more
objects as long as the locks of all transactions fit in the lock table.
This is not the number of rows that can be locked; that value is
unlimited. This parameter can only be set at server start.

The default, 64, has historically proven sufficient for most databases,
but you might need to raise this value if you have clients that touch
many different tables in a single transaction.  Databases with several
tables with many partitions each can require raising this setting.  The
PostgreSQL activity log will contain a fairly clear error message
suggesting raising max_locks_per_transaction if needed.

    Increasing this parameter might cause PostgreSQL to request more
System V shared memory than your operating system's default
configuration allows. See Section 17.4.1 for information on how to
adjust those parameters, if necessary.

    When running a standby server, you must set this parameter to the
same or higher value than on the master server. Otherwise, queries will
not be allowed in the standby server.

-- 
Josh Berkus
PostgreSQL Experts Inc.
http://pgexperts.com

---

From: Jeff Davis <[email-masked]>
Date: Fri, 15 Jun 2012 12:25:14 -0700

On Fri, 2012-06-15 at 11:05 -0700, Josh Berkus wrote:
> tables with many partitions each can require raising this setting.

Is "partition" defined somewhere else in the docs?

Maybe it should say something like: "Extensive use of table inheritance
is the most common reason to increase this value from the default",
assuming that's what you meant.

Regards,
	Jeff Davis

---

From: Josh Berkus <[email-masked]>
Date: Fri, 15 Jun 2012 12:37:03 -0700

> assuming that's what you meant.

Hmmm.  I think we should also say "partitioning", as well as
"inheritance".  Maybe:

"Extensive use of table inheritance, such as for tables with many
partitions, may require raising this setting."

Works?

-- 
Josh Berkus
PostgreSQL Experts Inc.
http://pgexperts.com

---

From: Jeff Davis <[email-masked]>
Date: Fri, 15 Jun 2012 16:24:30 -0700

> partitions, may require raising this setting."

http://www.postgresql.org/docs/9.2/static/ddl-partitioning.html#DDL-PARTITIONING-CONSTRAINT-EXCLUSION

Looks like we do define it, so that's fine with me.

Regards,
	Jeff Davis

---

From: Peter Eisentraut <[email-masked]>
Date: Wed, 20 Jun 2012 00:39:52 +0300

> The way it should be:

This would be easier to process if you had sent a diff.

---

From: Josh Berkus <[email-masked]>
Date: Wed, 20 Jun 2012 14:47:04 -0700

> This would be easier to process if you had sent a diff.

Do you agree with the changes?  I can send a diff.  I personally find
SGML impossible to read, though, so I never propose changes that way.

-- 
Josh Berkus
PostgreSQL Experts Inc.
http://pgexperts.com

---

From: Peter Eisentraut <[email-masked]>
Date: Fri, 22 Jun 2012 01:49:38 +0300

> SGML impossible to read, though, so I never propose changes that way.

I don't know, because I can't see what's changed if you don't send a
diff.  It would be fine if you sent a diff between plain text, to
illustrate what you mean, even if it's not the actual source code.

---

From: Josh Berkus <[email-masked]>
Date: Thu, 21 Jun 2012 15:53:06 -0700

> illustrate what you mean, even if it's not the actual source code.

Odd; nobody else seems to have had trouble understanding my post.

-- 
Josh Berkus
PostgreSQL Experts Inc.
http://pgexperts.com

---

From: Alvaro Herrera <[email-masked]>
Date: Thu, 21 Jun 2012 23:03:31 -0400

> Odd; nobody else seems to have had trouble understanding my post.

It takes a lot more effort, though -- I, for one, would read both
versions in parallel to see what differs (and I'm not Leonardo).  If you
send a patch the differences are immediately obvious (assuming you don't
do anything silly like reflowing the whole paragraph).

-- 
Álvaro Herrera <[email-masked]>
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

---

From: Bruce Momjian <[email-masked]>
Date: Thu, 30 Aug 2012 16:56:38 -0400

I have applied the attached patch to document this issue.

---------------------------------------------------------------------------

On Fri, Jun 15, 2012 at 11:05:30AM -0700, Josh Berkus wrote:
> Sent via pgsql-docs mailing list ([email-masked])
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-docs

-- 
  Bruce Momjian  <[email-masked]>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +
diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
new file mode 100644
index d5fa94e..ade9f79
*** a/doc/src/sgml/config.sgml
--- b/doc/src/sgml/config.sgml
*************** dynamic_library_path = 'C:\tools\postgre
*** 5550,5558 ****
          fit in the lock table.  This is <emphasis>not</> the number of
          rows that can be locked; that value is unlimited.  The default,
          64, has historically proven sufficient, but you might need to
!         raise this value if you have clients that touch many different
!         tables in a single transaction. This parameter can only be set at
!         server start.
         </para>
  
         <para>
--- 5550,5558 ----
          fit in the lock table.  This is <emphasis>not</> the number of
          rows that can be locked; that value is unlimited.  The default,
          64, has historically proven sufficient, but you might need to
!         raise this value if you have queries that touch many different
!         tables in a single transaction, e.g. query of a parent table with
!         many children.  This parameter can only be set at server start.
         </para>
  
         <para>