From cb7dad1731f77e1a2a946c35263bb9aa7c6afd41 Mon Sep 17 00:00:00 2001
From: "Thomas G. Lockhart" <lockhart@fourpalms.org>
Date: Thu, 3 Jun 1999 16:13:35 +0000
Subject: [PATCH] Make separate subsection for Vadim's MVCC notes. Add timing
 info for v6.5 on my linux box.

---
 doc/src/sgml/release.sgml | 164 +++++++++++++++++++++++---------------
 1 file changed, 100 insertions(+), 64 deletions(-)

diff --git a/doc/src/sgml/release.sgml b/doc/src/sgml/release.sgml
index f8718c4aaca..d34e1c8f80f 100644
--- a/doc/src/sgml/release.sgml
+++ b/doc/src/sgml/release.sgml
@@ -39,9 +39,10 @@
 	other users.  MVCC uses the natural multi-version nature of PostgreSQL
 	to allow readers to continue reading consistent data during writer
 	activity.  Writers continue to use the compact pg_log transaction
-	system.  This is all preformed without having to allocate a lock for
+	system.  This is all performed without having to allocate a lock for
 	every row like traditional database systems.  So, basically, we no
-	longer have table-level locking, we have something better than row-level
+	longer are restricted by simple table-level locking;
+	we have something better than row-level
 	locking.
        </para>
       </listitem>
@@ -134,59 +135,61 @@
     </para>
 
     <para>
-
-     Because readers in 6.5 don't lock data, regardless of transaction
-     isolation level, data read by one transaction can be overwritten by
-     another. In the other words, if a row is returned by
-     <command>SELECT</command> it doesn't mean that this row really exists
-     at the time it is returned (i.e. sometime after the statement or
-     transaction began) nor that the row is protected from deletion or
-     updation by concurrent transactions before the current transaction does
-     a commit or rollback.
-
-    </para>
-
-    <para>
-
-     To ensure the actual existance of a row and protect it against
-     concurrent updates one must use <command>SELECT FOR UPDATE</command> or
-     an appropriate <command>LOCK TABLE</command> statement. This should be
-     taken into account when porting applications from previous releases of
-     <productname>Postgres</productname> and other environments.
-
-    </para>
-
-    <para>
-
-     Keep above in mind if you are using contrib/refint.* triggers for
-     referential integrity. Additional technics are required now. One way is
-     to use <command>LOCK parent_table IN SHARE ROW EXCLUSIVE MODE</command>
-     command if a transaction is going to update/delete a primary key and
-     use <command>LOCK parent_table IN SHARE MODE</command> command if a
-     transaction is going to update/insert a foreign key.
-
-        <note>
-        <para>
-
-     Note that if you run a transaction in SERIALIZABLE mode then you must
-     execute <command>LOCK</command> commands above before execution of any
-     DML statement
-     (<command>SELECT/INSERT/DELETE/UPDATE/FETCH/COPY_TO</command>) in the
-     transaction.
-
-        </para>
-        </note>
-
-        <para>
-
-     These inconveniences will disappear when the ability to read durty
-     (uncommitted) data, regardless of isolation level, and true referential
-     integrity will be implemented.
-
-        </para>
-
+     The new Multi-Version Concurrency Control (MVCC) features can
+     give somewhat different behaviors in multi-user
+     environments. <emphasis>Read and understand the following section 
+      to ensure that your existing applications will give you the
+      behavior you need.</emphasis>
     </para>
 
+    <sect3>
+     <title>Multi-Version Concurrency Control</title>
+
+     <para>
+      Because readers in 6.5 don't lock data, regardless of transaction
+      isolation level, data read by one transaction can be overwritten by
+      another. In the other words, if a row is returned by
+      <command>SELECT</command> it doesn't mean that this row really exists
+      at the time it is returned (i.e. sometime after the statement or
+      transaction began) nor that the row is protected from deletion or
+      updation by concurrent transactions before the current transaction does
+      a commit or rollback.
+     </para>
+
+     <para>
+      To ensure the actual existance of a row and protect it against
+      concurrent updates one must use <command>SELECT FOR UPDATE</command> or
+      an appropriate <command>LOCK TABLE</command> statement. This should be
+      taken into account when porting applications from previous releases of
+      <productname>Postgres</productname> and other environments.
+     </para>
+
+     <para>
+      Keep above in mind if you are using contrib/refint.* triggers for
+      referential integrity. Additional technics are required now. One way is
+      to use <command>LOCK parent_table IN SHARE ROW EXCLUSIVE MODE</command>
+      command if a transaction is going to update/delete a primary key and
+      use <command>LOCK parent_table IN SHARE MODE</command> command if a
+      transaction is going to update/insert a foreign key.
+
+      <note>
+       <para>
+	Note that if you run a transaction in SERIALIZABLE mode then you must
+	execute the <command>LOCK</command> commands above before execution of any
+	DML statement
+	(<command>SELECT/INSERT/DELETE/UPDATE/FETCH/COPY_TO</command>) in the
+	transaction.
+       </para>
+      </note>
+     </para>
+
+     <para>
+      These inconveniences will disappear in the future
+      when the ability to read dirty
+      (uncommitted) data (regardless of isolation level) and true referential
+      integrity will be implemented.
+     </para>
+    </sect3>
     </sect2>
 
    <sect2>
@@ -2541,22 +2544,55 @@ Initial release.
 </para>
 </sect1>
 
-<sect1>
-<title>Timing Results</title>
+  <sect1>
+   <title>Timing Results</title>
 
-<para>
-These timing results are from running the regression test with the commands
+   <para>
+    These timing results are from running the regression test with the commands
 
-<programlisting>
+    <programlisting>
 % cd src/test/regress
 % make all
 % time make runtest
-</programlisting>
-</para>
-<para>
-  Timing under Linux 2.0.27 seems to have a roughly 5% variation from run
-  to run, presumably due to the scheduling vagaries of multitasking systems.
-</para>
+    </programlisting>
+   </para>
+   <para>
+    Timing under Linux 2.0.27 seems to have a roughly 5% variation from run
+    to run, presumably due to the scheduling vagaries of multitasking systems.
+   </para>
+
+   <sect2>
+    <title>v6.5</title>
+
+    <para>
+     As has been the case for previous releases, timing between
+     releases is not directly comparable since new regression tests
+     have been added. In general, v6.5 is faster than previous
+     releases.
+    </para>
+
+    <para>
+     Timing with <function>fsync()</function> disabled:
+
+     <programlisting>
+  Time   System
+  02:00  Dual Pentium Pro 180, 224MB, UW-SCSI, Linux 2.0.36, gcc 2.7.2.3 -O2 -m486
+     </programlisting>
+    </para>
+
+    <para>
+     Timing with <function>fsync()</function> enabled:
+
+     <programlisting>
+  Time   System
+  04:21  Dual Pentium Pro 180, 224MB, UW-SCSI, Linux 2.0.36, gcc 2.7.2.3 -O2 -m486
+     </programlisting>
+
+     For the linux system above, using UW-SCSI disks rather than (older) IDE
+     disks leads to a 50% improvement in speed on the regression test.
+    </para>
+   </sect2>
+
 <sect2>
 <title>v6.4beta</title>
 
-- 
GitLab