]> granicus.if.org Git - postgresql/blobdiff - doc/src/FAQ/FAQ.html
Remove replicaiton FAQ item.
[postgresql] / doc / src / FAQ / FAQ.html
index 0bc7cd27d4db66541a02c947e0893b64556f64d2..0c25d6bc4a395f0e7a2b028926b06f3b88d802fe 100644 (file)
   alink="#0000ff">
     <H1>Frequently Asked Questions (FAQ) for PostgreSQL</H1>
 
-    <P>Last updated: Fri Feb 14 09:03:00 EST 2003</P>
+    <P>Last updated: Sun Nov 14 16:32:47 EST 2004</P>
 
     <P>Current maintainer: Bruce Momjian (<A href=
     "mailto:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us</A>)<BR>
     </P>
 
-    <P>The most recent version of this document can be viewed at <A
-    href=
-    "http://www.ca.PostgreSQL.org/docs/faq-english.html">http://www.ca.PostgreSQL.org/docs/faq-english.html</A>.</P>
+    <P>The most recent version of this document can be viewed at <A href=
+    "http://www.PostgreSQL.org/docs/faqs/FAQ.html">http://www.PostgreSQL.org/docs/faqs/FAQ.html</A>.</P>
 
     <P>Platform-specific questions are answered at <A href=
-    "http://www.ca.PostgreSQL.org/users-lounge/docs/faq.html">http://www.ca.PostgreSQL.org/users-lounge/docs/faq.html</A>.</P>
+    "http://www.PostgreSQL.org/docs/index.html">http://www.PostgreSQL.org/docs/index.html</A>.</P>
     <HR>
 
     <H2 align="center">General Questions</H2>
     directory?<BR>
      <A href="#3.10">3.10</A>) Why do I need to do a dump and restore
     to upgrade PostgreSQL releases?<BR>
+     <A href="#3.11">3.11</A>) What computer hardware should I use?<BR>
 
 
     <H2 align="center">Operational Questions</H2>
     <A href="#4.1">4.1</A>) What is the difference between binary
     cursors and normal cursors?<BR>
      <A href="#4.2">4.2</A>) How do I <SMALL>SELECT</SMALL> only the
-    first few rows of a query?<BR>
+    first few rows of a query?  A random row?<BR>
      <A href="#4.3">4.3</A>) How do I get a list of tables or other
     things I can see in <I>psql</I>?<BR>
      <A href="#4.4">4.4</A>) How do you remove a column from a
-    table?<BR>
+    table, or change it's data type?<BR>
      <A href="#4.5">4.5</A>) What is the maximum size for a row, a
     table, and a database?<BR>
      <A href="#4.6">4.6</A>) How much database disk space is required
     from a function?<BR>
      <A href="#4.26">4.26</A>) Why can't I reliably create/drop
     temporary tables in PL/PgSQL functions?<BR>
-     <A href="#4.27">4.27</A>) What replication options are available?<BR>
-     <A href="#4.28">4.28</A>) What encryption options are available?<BR>
+     <A href="#4.28">4.27</A>) What encryption options are available?<BR>
      
 
     <H2 align="center">Extending PostgreSQL</H2>
 
     <H4><A name="1.1">1.1</A>) What is PostgreSQL? How is it pronounced?</H4>
 
-    <P>PostgreSQL is pronounced <I>Post-Gres-Q-L</I>.</P>
+    <P>PostgreSQL is pronounced <I>Post-Gres-Q-L</I>.  An audio file is 
+       available at http://www.postgresql.org/postgresql.mp3 for those 
+       would like to hear the pronunciation. 
+    </P>
 
     <P>PostgreSQL is an enhancement of the POSTGRES database management
-    system, a next-generation <SMALL>DBMS</SMALL> research prototype.
+    system (and is still sometimes reffered to as simply "Postgres"), 
+    a next-generation <SMALL>DBMS</SMALL> research prototype.
     While PostgreSQL retains the powerful data model and rich data
     types of POSTGRES, it replaces the PostQuel query language with an
     extended subset of <SMALL>SQL</SMALL>. PostgreSQL is free and the
     developers who all subscribe to the PostgreSQL development mailing
     list. The current coordinator is Marc G. Fournier (<A href=
     "mailto:scrappy@PostgreSQL.org">scrappy@PostgreSQL.org</A>). (See
-    section <a href="#1.6">1.6</a> on how to join). This team is now 
-    responsible for all development of PostgreSQL.</P>
+    section <a href="#1.6">1.6</a> on how to join). This team is now
+    responsible for all development of PostgreSQL.  It is a community
+    project and is not controlled by any company.  To get involved, see
+    the developer's FAQ at <A href=
+    "http://www.PostgreSQL.org/docs/faqs/FAQ_DEV.html">http://www.PostgreSQL.org/docs/faqs/FAQ_DEV.html</A>
+    </P>
 
     <P>The authors of PostgreSQL 1.01 were Andrew Yu and Jolly Chen.
     Many others have contributed to the porting, testing, debugging,
 
     <P>PostgreSQL Data Base Management System</P>
 
-    <P>Portions copyright (c) 1996-2002, PostgreSQL Global Development
+    <P>Portions copyright (c) 1996-2004, PostgreSQL Global Development
     Group Portions Copyright (c) 1994-6 Regents of the University of
     California</P>
 
     <H4><A name="1.3">1.3</A>) What Unix platforms does PostgreSQL run
     on?</H4>
 
-    <P>In general, a modern Unix-compatible platform should be able to
+    <P>In general, any modern Unix-compatible platform should be able to
     run PostgreSQL. The platforms that had received explicit testing at
     the time of release are listed in the installation
     instructions.</P>
 
     <H4><A name="1.4">1.4</A>) What non-Unix ports are available?</H4>
 
-    <P><STRONG>Client</STRONG></P>
-
-    <P>It is possible to compile the <I>libpq</I> C library, psql, and
-    other interfaces and client applications to run on MS Windows platforms.
-    In this case, the client is running on MS Windows, and communicates
-    via TCP/IP to a server running on one of our supported Unix
-    platforms. A file <I>win32.mak</I> is included in the distribution
-    for making a Win32 <I>libpq</I> library and <I>psql</I>. PostgreSQL
-    also communicates with <SMALL>ODBC</SMALL> clients.</P>
+    <P>Starting with version 8.0, PostgreSQL now runs natively on
+    Microsoft Windows NT-based operating systems like Win2000, WinXP,
+    and Win2003.  A prepackaged installer is available at <a href=
+    "http://pgfoundry.org/projects/pginstaller">
+    http://pgfoundry.org/projects/pginstaller</a>.
 
-    <P><STRONG>Server</STRONG></P>
-
-    <P>The database server can run on Windows NT and Win2k using
-    Cygwin, the Cygnus Unix/NT porting library. See
-    <I>pgsql/doc/FAQ_MSWIN</I> in the distribution or the MS Windows FAQ
-    at <A href="http://www.PostgreSQL.org/docs/faq-mswin.html">
-    http://www.PostgreSQL.org/docs/faq-mswin.html</A>.</P>
-
-    <p>A native port to MS Win NT/2000/XP is currently being worked
-    on.</p>
+    <p>There is also a Novell Netware 6 port at
+    <a href="http://forge.novell.com">http://forge.novell.com</a>.</p>
 
     <H4><A name="1.5">1.5</A>) Where can I get PostgreSQL?</H4>
 
       <A href="http://www.PostgreSQL.org">http://www.PostgreSQL.org</A>
     </BLOCKQUOTE>
 
-    <P>There is also an IRC channel on EFNet, channel
-    <I>#PostgreSQL</I>. I use the Unix command <CODE>irc -c
-    '#PostgreSQL' "$USER" irc.phoenix.net.</CODE></P>
+    <P>There is also an IRC channel on Freenode and EFNet,
+    channel <I>#PostgreSQL</I>. You can use the Unix command <CODE>irc -c
+    '#PostgreSQL' "$USER" irc.phoenix.net.</CODE> or <CODE>irc -c
+    '#PostgreSQL' "$USER" irc.freenode.net.</CODE></P>
 
     <P>A list of commercial support companies is available at <A href=
-    "http://www.ca.PostgreSQL.org/users-lounge/commercial-support.html">http://www.ca.PostgreSQL.org/users-lounge/commercial-support.html</A>.</P>
+    "http://techdocs.postgresql.org/companies.php">http://techdocs.postgresql.org/companies.php</A>.</P>
 
     <H4><A name="1.7">1.7</A>) What is the latest release?</H4>
 
-    <P>The latest release of PostgreSQL is version 7.3.2.</P>
+    <P>The latest release of PostgreSQL is version 7.4.5.</P>
 
-    <P>We plan to have major releases every four months.</P>
+    <P>We plan to have major releases every six to eight months.</P>
 
     <H4><A name="1.8">1.8</A>) What documentation is available?</H4>
 
     <P>Several manuals, manual pages, and some small test examples are
     included in the distribution. See the <I>/doc</I> directory. You
-    can also browse the manual online at <A href=
-    "http://www.ca.PostgreSQL.org/users-lounge/docs/">http://www.ca.PostgreSQL.org/users-lounge/docs/</A>.</P>
+    can also browse the manuals online at <A href=
+    "http://www.PostgreSQL.org/docs">http://www.PostgreSQL.org/docs</A>.</P>
 
     <P>There are two PostgreSQL books available online at <A href=
     "http://www.PostgreSQL.org/docs/awbook.html">http://www.PostgreSQL.org/docs/awbook.html</A>
     "http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook/</A>.
     There is a list of PostgreSQL books available for purchase at <A
     href=
-    "http://www.ca.PostgreSQL.org/books/">http://www.ca.PostgreSQL.org/books/</A>.
+    "http://techdocs.postgresql.org/techdocs/bookreviews.php">http://techdocs.PostgreSQL.org/techdocs/bookreviews.php</A>.
     There is also a collection of PostgreSQL technical articles at <A
     href=
     "http://techdocs.PostgreSQL.org/">http://techdocs.PostgreSQL.org/</A>.</P>
       <DD>PostgreSQL has performance similar to other commercial and
       open source databases. it is faster for some things, slower for
       others. In comparison to MySQL or leaner database systems, we are
-      slower on inserts/updates because of transaction overhead. Of
-      course, MySQL does not have any of the features mentioned in the
+      faster for multiple users, complex queries, and a read/write query
+      load.  MySQL is faster for simple SELECT queries done by a few users.
+      Of course, MySQL does not have most of the features mentioned in the
       <I>Features</I> section above. We are built for reliability and
-      features, though we continue to improve performance in every
+      features, and we continue to improve performance in every
       release. There is an interesting Web page comparing PostgreSQL to
       MySQL at <A href="http://openacs.org/philosophy/why-not-mysql.html">
-      http://openacs.org/philosophy/why-not-mysql.html</A><BR>
+      http://openacs.org/philosophy/why-not-mysql.html</A>  Also, MySQL is
+      is a company that distributes its products via open source, and requires
+      a commercial license for close-source software, not an
+      open source development community like PostgreSQL.<BR>
 
       <BR>
       </DD>
     send a check to the contact address.</P>
     <HR>
 
+    <P>Also, if you have a success story about PostgreSQL, please submit
+    it to our advocacy site at <a href="http://advocacy.postgresql.org">
+    http://advocacy.postgresql.org</a>.</P>
+
+
     <H2 align="center">User Client Questions</H2>
 
     <H4><A name="2.1">2.1</A>) Are there <SMALL>ODBC</SMALL> drivers
     <H4><A name="2.3">2.3</A>) Does PostgreSQL have a graphical user
     interface?</H4>
 
-    Yes, there are several graphical interfaces to PostgreSQL available.
+    <P>Yes, there are several graphical interfaces to PostgreSQL available.
     These include PgAccess <a href="http://www.pgaccess.org">
-    http://www.pgaccess.org</a>), PgAdmin II (<a
-    href="http://www.pgadmin.org">http://www.pgadmin.org</a>,
-    Win32-only), RHDB Admin (<a
+    http://www.pgaccess.org</a>), PgAdmin III (<a
+    href="http://www.pgadmin.org">http://www.pgadmin.org</a>, RHDB Admin (<a
     href="http://sources.redhat.com/rhdb/">http://sources.redhat.com/rhdb/
     </a>) and Rekall (<a href="http://www.thekompany.com/products/rekall/">
     http://www.thekompany.com/products/rekall/</a>, proprietary). There is 
-    also PHPPgAdmin (<a href="http://phppgadmin.sourceforge.net/">
+    also PhpPgAdmin (<a href="http://phppgadmin.sourceforge.net/">
     http://phppgadmin.sourceforge.net/ </a>), a web-based interface to 
-    PostgreSQL.
+    PostgreSQL.</P>
+
+    <P>See <a href="http://techdocs.postgresql.org/guides/GUITools">http://techdocs.postgresql.org/guides/GUITools</a> for a more detailed list.</P>
 
     <H4><A name="2.4">2.4</A>) What languages are able to communicate with 
     PostgreSQL?</H4>
     <I>postmaster</I>. For most systems, with default numbers of
     buffers and processes, you need a minimum of ~1 MB. See the <A
     href=
-    "http://www.postgresql.org/idocs/index.php?kernel-resources.html">PostgreSQL
+    "http://www.PostgreSQL.org/docs/view.php?version=current&amp;idoc=1&amp;file=kernel-resources.html">PostgreSQL
     Administrator's Guide</A> for more detailed information about
     shared memory and semaphores.</P>
 
     hosts?</H4>
 
     <P>By default, PostgreSQL only allows connections from the local
-    machine using Unix domain sockets. Other machines will not be able
-    to connect unless you add the <I>-i</I> flag to <I>postmaster</I>,
-    <B>and</B> enable host-based authentication by modifying the file
-    <I>$PGDATA/pg_hba.conf</I> accordingly. This will allow TCP/IP
-    connections.</P>
+    machine using Unix domain sockets or TCP/IP connections. Other
+    machines will not be able to connect unless you modify
+    listen_addresses in the postgresql.conf <B>and</B> enable
+    host-based authentication by modifying the file
+    <I>$PGDATA/pg_hba.conf</I> accordingly.</P>
 
     <H4><A name="3.6">3.6</A>) How do I tune the database engine for
     better performance?</H4>
 
     <P>Certainly, indexes can speed up queries. The
-    <SMALL>EXPLAIN</SMALL> command allows you to see how PostgreSQL is
+    <SMALL>EXPLAIN ANALYZE</SMALL> command allows you to see how PostgreSQL is
     interpreting your query, and which indexes are being used.</P>
 
     <P>If you are doing many <SMALL>INSERTs</SMALL>, consider doing
     The release notes mention whether <I>pg_upgrade</I> is available for the
     release.</P>
 
+    <H4><A name="3.11">3.11</A>) What computer hardware should I use?</H4>
+
+    <P>Because PC hardware is mostly compatible, people tend to believe that
+    all PC hardware is of equal quality.  It is not.  ECC RAM, SCSI, and
+    quality motherboards are more reliable and have better performance than
+    less expensive hardware.  PostgreSQL will run on almost any hardware,
+    but if reliability and performance are important it is wise to
+    research your hardware options thoroughly.  Our email lists can be used
+    to discuss hardware options and tradeoffs.</P>
+
     <HR>
 
     <H2 align="center">Operational Questions</H2>
     description.</P>
 
     <H4><A name="4.2">4.2</A>) How do I <SMALL>SELECT</SMALL> only the
-    first few rows of a query?</H4>
+    first few rows of a query?  A random row?</H4>
 
     <P>See the <SMALL>FETCH</SMALL> manual page, or use
     <SMALL>SELECT</SMALL> ... <SMALL>LIMIT</SMALL>....</P>
     records requested, or the entire query may have to be evaluated
     until the desired rows have been generated.</P>
 
+    <P>To <SMALL>SELECT</SMALL> a random row, use:
+<PRE>
+    SELECT col
+    FROM tab
+    ORDER BY random()
+    LIMIT 1;
+</PRE>
+
     <H4><A name="4.3">4.3</A>) How do I get a list of tables or other
     things I can see in <I>psql</I>?</H4>
 
-    <P>You can read the source code for <I>psql</I> in file
-    <I>pgsql/src/bin/psql/describe.c</I>. It contains
-    <SMALL>SQL</SMALL> commands that generate the output for psql's
-    backslash commands. You can also start <I>psql</I> with the
-    <I>-E</I> option so it will print out the queries it uses to
-    execute the commands you give.</P>
+    <P>Use the \dt command to see tables in <I>psql</I>. For a complete list of
+    commands inside psql you can use \?. Alternatively you can read the source 
+    code for <I>psql</I> in file <I>pgsql/src/bin/psql/describe.c</I>, it 
+    contains <SMALL>SQL</SMALL> commands that generate the output for 
+    <I>psql</I>'s backslash commands. You can also start <I>psql</I> with the
+    <I>-E</I> option so it will print out the queries it uses to execute the 
+    commands you give. PostgreSQL also provides an <SMALL>SQLi</SMALL> compliant
+    INFORMATION SCHEMA interface you can query to get information about the
+    database.</P>
 
     <H4><A name="4.4">4.4</A>) How do you remove a column from a
-    table?</H4>
+    table, or change its data type?</H4>
 
-    <P>This functionality was added in release 7.3 with
+    <P><SMALL>DROP COLUMN</SMALL> functionality was added in release 7.3 with
     <SMALL>ALTER TABLE DROP COLUMN</SMALL>.  In earlier versions,
     you can do this:</P>
 <PRE>
     COMMIT;
 </PRE>
 
+    <P>To change the data type of a column, do this:</P>
+<PRE>
+    BEGIN;
+    ALTER TABLE tab ADD COLUMN new_col <i>new_data_type</i>;
+    UPDATE tab SET new_col = CAST(old_col AS <i>new_data_type</i>);
+    ALTER TABLE tab DROP COLUMN old_col;
+    COMMIT;
+</PRE>
+    <P>You might then want to do <I>VACUUM FULL tab</I> to reclaim the
+    disk space used by the expired rows.</P>
+    
     <H4><A name="4.5">4.5</A>) What is the maximum size for a row, a
     table, and a database?</H4>
 
     <P>These are the limits:</P>
 <PRE>
-    Maximum size for a database?             unlimited (1 TB databases exist)
-    Maximum size for a table?                16 TB
+    Maximum size for a database?             unlimited (32 TB databases exist)
+    Maximum size for a table?                32 TB
     Maximum size for a row?                  1.6TB
     Maximum size for a field?                1 GB
     Maximum number of rows in a table?       unlimited
     available disk space and memory/swap space. Performance may suffer
     when these values get unusually large. 
 
-    <P>The maximum table size of 16 TB does not require large file
+    <P>The maximum table size of 32 TB does not require large file
     support from the operating system. Large tables are stored as
     multiple 1 GB files so file system size limits are not
     important.</P>
 
     <P>The maximum table size and maximum number of columns can be
-    increased if the default block size is increased to 32k.</P>
+    quadrupled by increasing the default block size to 32k.</P>
 
     <H4><A name="4.6">4.6</A>) How much database disk space is required
     to store data from a typical text file?</H4>
     The size of the PostgreSQL database file containing this data can
     be estimated as 6.4 MB:</P>
 <PRE>
-    36 bytes: each row header (approximate)
+    32 bytes: each row header (approximate)
     24 bytes: one int field and one text field
    + 4 bytes: pointer on page to tuple
    ----------------------------------------
-    64 bytes per row
+    60 bytes per row
 
    The data page size in PostgreSQL is 8192 bytes (8 KB), so:
 
    8192 bytes per page
-   -------------------   =  128 rows per database page (rounded down)
-     64 bytes per row
+   -------------------   =  136 rows per database page (rounded down)
+     60 bytes per row
 
    100000 data rows
-   --------------------  =  782 database pages (rounded up)
+   --------------------  =  735 database pages (rounded up)
       128 rows per page
 
-782 database pages * 8192 bytes per page  =  6,406,144 bytes (6.4 MB)
+735 database pages * 8192 bytes per page  =  6,021,120 bytes (6 MB)
 </PRE>
 
     <P>Indexes do not require as much overhead, but do contain the data
     that is being indexed, so they can be large also.</P>
 
-    <P><SMALL>NULL</SMALL>s are stored in bitmaps, so they
+    <P><SMALL>NULL</SMALL>s are stored as bitmaps, so they
     use very little space.</P>
     
     <H4><A name="4.7">4.7</A>) How do I find out what tables, indexes,
     </UL>
     <P>
 
+    <P>In pre-8.0 releases, indexes often can not be used unless the data
+    types exactly match the index's column types.  This is particularly
+    true of int2, int8, and numeric column indexes.</P>
+
     <H4><A name="4.9">4.9</A>) How do I see how the query optimizer is
     evaluating my query?</H4>
 
@@ -1037,14 +1079,14 @@ Type            Internal Name   Notes
 VARCHAR(n)      varchar         size specifies maximum length, no padding
 CHAR(n)         bpchar          blank padded to the specified fixed length
 TEXT            text            no specific upper limit on length
-"char"          char            one character
 BYTEA           bytea           variable-length byte array (null-byte safe)
+"char"          char            one character
 </PRE>
 
     <P>You will see the internal name when examining system catalogs
     and in some error messages.</P>
 
-    <P>The last four types above are "varlena" types (i.e., the first
+    <P>The first four types above are "varlena" types (i.e., the first
     four bytes on disk are the length, followed by the data). Thus the
     actual space used is slightly greater than the declared size.
     However, these data types are also subject to compression or being
@@ -1058,14 +1100,14 @@ BYTEA           bytea           variable-length byte array (null-byte safe)
     same length. <SMALL>CHAR(n)</SMALL> pads with blanks to the specified
     length, while <SMALL>VARCHAR(n)</SMALL> only stores the characters
     supplied.  <SMALL>BYTEA</SMALL> is for storing binary data,
-    particularly values that include <SMALL>NULL</SMALL> bytes. These
-    types have similar performance characteristics.</P>
+    particularly values that include <SMALL>NULL</SMALL> bytes. All the
+    types described here have similar performance characteristics.</P>
 
     <H4><A name="4.15.1">4.15.1</A>) How do I create a
     serial/auto-incrementing field?</H4>
 
     <P>PostgreSQL supports a <SMALL>SERIAL</SMALL> data type. It
-    auto-creates a sequence and index on the column. For example,
+    auto-creates a sequence For example,
     this:</P>
 <PRE>
     CREATE TABLE person ( 
@@ -1081,7 +1123,6 @@ BYTEA           bytea           variable-length byte array (null-byte safe)
         id   INT4 NOT NULL DEFAULT nextval('person_id_seq'),
         name TEXT 
     );
-    CREATE UNIQUE INDEX person_id_key ON person ( id );
 </PRE>
 
     See the <I>create_sequence</I> manual page for more information
@@ -1121,7 +1162,8 @@ BYTEA           bytea           variable-length byte array (null-byte safe)
 
     Finally, you could use the <A href="#4.16"><SMALL>OID</SMALL></A>
     returned from the <SMALL>INSERT</SMALL> statement to look up the
-    default value, though this is probably the least portable approach.
+    default value, though this is probably the least portable approach,
+    and the oid value will wrap around when it reaches 4 billion.
     In Perl, using DBI with Edmund Mergl's DBD::Pg module, the oid
     value is made available via <I>$sth-&gt;{pg_oid_status}</I> after
     <I>$sth-&gt;execute()</I>.
@@ -1166,16 +1208,12 @@ BYTEA           bytea           variable-length byte array (null-byte safe)
     of the table, with the original <SMALL>OID</SMALL>s, there is no
     reason you can't do it:</P>
 <PRE>
-        CREATE TABLE new_table(old_oid oid, mycol int);
-        SELECT old_oid, mycol INTO new FROM old;
-        COPY new TO '/tmp/pgtable';
-        DELETE FROM new;
-        COPY new WITH OIDS FROM '/tmp/pgtable';
+        CREATE TABLE new_table(mycol int);
+        SELECT oid AS old_oid, mycol INTO tmp_table FROM old_table;
+        COPY tmp_table TO '/tmp/pgtable';
+        COPY new_table WITH OIDS FROM '/tmp/pgtable';
+        DROP TABLE tmp_table;
 </PRE>
-<!--
-    CREATE TABLE new_table (mycol int);
-    INSERT INTO new_table (oid, mycol) SELECT oid, mycol FROM old_table;
--->
     <P>O<SMALL>ID</SMALL>s are stored as 4-byte integers, and will
     overflow at 4 billion. No one has reported this ever happening, and
     we plan to have the limit removed before anyone does.</P>
@@ -1266,10 +1304,10 @@ BYTEA           bytea           variable-length byte array (null-byte safe)
     <H4><A name="4.22">4.22</A>) Why are my subqueries using
     <CODE><SMALL>IN</SMALL></CODE> so slow?</H4>
 
-    <P>Currently, we join subqueries to outer queries by sequentially
-    scanning the result of the subquery for each row of the outer
-    query. If the subquery returns only a few rows and the outer query
-    returns many rows, <CODE><SMALL>IN</SMALL></CODE> is fastest.  To
+    <P>In versions prior to 7.4, subqueries were joined to outer queries
+    by sequentially scanning the result of the subquery for each row of
+    the outer query. If the subquery returns only a few rows and the outer
+    query returns many rows, <CODE><SMALL>IN</SMALL></CODE> is fastest.  To
     speed up other queries, replace <CODE>IN</CODE> with
     <CODE>EXISTS</CODE>:</P>
 <PRE>    SELECT *
@@ -1283,7 +1321,9 @@ BYTEA           bytea           variable-length byte array (null-byte safe)
 </PRE>
 
     For this to be fast, <CODE>subcol</CODE> should be an indexed column.
-    This preformance problem will be fixed in 7.4.
+    <P>In version 7.4 and later,  <CODE>IN</CODE> actually uses the same
+    sophisticated join techniques as normal queries, and is prefered
+    to using <CODE>EXISTS</CODE>.
 
     <H4><A name="4.23">4.23</A>) How do I perform an outer join?</H4>
 
@@ -1340,11 +1380,10 @@ BYTEA           bytea           variable-length byte array (null-byte safe)
     <H4><A name="4.25">4.25</A>) How do I return multiple rows or
     columns from a function?</H4>
 
-    <P>You can return result sets from PL/pgSQL functions using
-    <I>refcursors</I>. See <A href=
-    "http://www.PostgreSQL.org/idocs/index.php?plpgsql-cursors.html">
-    http://www.PostgreSQL.org/idocs/index.php?plpgsql-cursors.html</A>,
-    section 23.7.3.3.</P>
+    <P>In 7.3, you can easily return multiple rows or columns from a
+    function,
+    <a href="http://techdocs.postgresql.org/guides/SetReturningFunctions">
+    http://techdocs.postgresql.org/guides/SetReturningFunctions</a>.
 
     <H4><A name="4.26">4.26</A>) Why can't I reliably create/drop
     temporary tables in PL/PgSQL functions?</H4>
@@ -1356,25 +1395,20 @@ BYTEA           bytea           variable-length byte array (null-byte safe)
     <SMALL>EXECUTE</SMALL> for temporary table access in PL/PgSQL. This
     will cause the query to be reparsed every time.</P>
 
-    <H4><A name="4.27">4.27</A>) What replication options are available?
-    </H4>
-    <P>There are several master/slave replication options available.
-    These allow only the master to make database changes and the slave
-    can only do database reads. The bottom of <a
-    href="http://gborg.PostgreSQL.org/genpage?replication_research">
-    http://gborg.PostgreSQL.org/genpage?replication_research</a> lists
-    them. A multi-master replication solution is being worked on at <a
-    href="http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php">http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php</a>.</P>
-
-    <H4><A name="4.28">4.28</A>) What encryption options are available?
+    <H4><A name="4.27">4.27</A>) What encryption options are available?
     </H4>
     <UL>
     <LI><I>contrib/pgcrypto</I> contains many encryption functions for
     use in <SMALL>SQL</SMALL> queries.</LI>
-    <LI>The only way to encrypt transmission from the client to the
-    server is by using <I>hostssl</I> in <I>pg_hba.conf</I>.</LI>
-    <LI>Database user passwords are automatically encrypted when stored
-    in version 7.3. In previous versions, you must enable the option
+    <LI>To encrypt transmission from the client to the server, the server
+    must have the <I>ssl</I> option set to <I>true</I> in <I>postgresql.conf,
+    </I> and an applicable <I>host</I> or <I>hostssl</I> record must exist in
+    <I>pg_hba.conf</I>, and the client <I>sslmode</I> must not be
+    <I>disable.</I> (Note that it is also possible to use a third-party
+    encrypted transport, such as stunnel or ssh, rather than PostgreSQL's
+    native SSL connections.)
+    <LI>Database user passwords are automatically encrypted when stored in
+    version 7.3. In previous versions, you must enable the option
     <I>PASSWORD_ENCRYPTION</I> in <I>postgresql.conf</I>.</LI>
     <LI>The server can run using an encrypted file system.</LI>
     </UL>