1307 lines
56 KiB
HTML
1307 lines
56 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
<HTML>
|
|
<HEAD>
|
|
<META name="generator" content="HTML Tidy, see www.w3.org">
|
|
<META http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
|
<TITLE>PostgreSQL FAQ</TITLE>
|
|
</HEAD>
|
|
|
|
<BODY bgcolor="#ffffff" text="#000000" link="#ff0000" vlink="#a00000"
|
|
alink="#0000ff">
|
|
<H1>Frequently Asked Questions (FAQ) for PostgreSQL</H1>
|
|
|
|
<P>Last updated: Sat Jan 29 23:15:42 EST 2005</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.postgresql.org/files/documentation/faqs/FAQ.html">
|
|
http://www.postgresql.org/files/documentation/faqs/FAQ.html</A>.</P>
|
|
|
|
<P>Platform-specific questions are answered at <A href=
|
|
"http://www.postgresql.org/docs/faq/">
|
|
http://www.postgresql.org/docs/faq/</A>.</P>
|
|
<HR>
|
|
|
|
<H2 align="center">General Questions</H2>
|
|
<A href="#1.1">1.1</A>) What is PostgreSQL? How is it pronounced?<BR>
|
|
<A href="#1.2">1.2</A>) What is the copyright on PostgreSQL?<BR>
|
|
<A href="#1.3">1.3</A>) What platforms does PostgreSQL support?<BR>
|
|
<A href="#1.4">1.4</A>) Where can I get PostgreSQL?<BR>
|
|
<A href="#1.5">1.5</A>) Where can I get support?<BR>
|
|
<A href="#1.6">1.6</A>) What is the latest release?<BR>
|
|
<A href="#1.7">1.7</A>) What documentation is available?<BR>
|
|
<A href="#1.8">1.8</A>) How do I find out about known bugs or
|
|
missing features?<BR>
|
|
<A href="#1.9">1.9</A>) How can I learn <SMALL>SQL</SMALL>?<BR>
|
|
<A href="#1.10">1.10</A>) How do I join the development team?<BR>
|
|
<A href="#1.11">1.11</A>) How do I submit a bug report?<BR>
|
|
<A href="#1.12">1.12</A>) How does PostgreSQL compare to other
|
|
<SMALL>DBMS</SMALL>s?<BR>
|
|
<A href="#1.13">1.13</A>) How can I financially assist
|
|
PostgreSQL?<BR>
|
|
|
|
|
|
<H2 align="center">User Client Questions</H2>
|
|
<A href="#2.1">2.1</A>) What interfaces are available for
|
|
PostgreSQL?<BR>
|
|
<A href="#2.2">2.2</A>) What tools are available for using
|
|
PostgreSQL with Web pages?<BR>
|
|
<A href="#2.3">2.3</A>) Does PostgreSQL have a graphical user
|
|
interface?<BR>
|
|
|
|
|
|
<H2 align="center">Administrative Questions</H2>
|
|
<A href="#3.1">3.1</A>) How do I install PostgreSQL somewhere other
|
|
than <I>/usr/local/pgsql</I>?<BR>
|
|
<A href="#3.2">3.2</A>) How do I control connections from other
|
|
hosts?<BR>
|
|
<A href="#3.3">3.3</A>) How do I tune the database engine for
|
|
better performance?<BR>
|
|
<A href="#3.4">3.4</A>) What debugging features are available?<BR>
|
|
<A href="#3.5">3.5</A>) Why do I get <I>"Sorry, too many
|
|
clients"</I> when trying to connect?<BR>
|
|
<A href="#3.6">3.6</A>) What is in the <I>pgsql_tmp</I>
|
|
directory?<BR>
|
|
<A href="#3.7">3.7</A>) Why do I need to do a dump and restore
|
|
to upgrade PostgreSQL releases?<BR>
|
|
<A href="#3.8">3.8</A>) What computer hardware should I use?<BR>
|
|
|
|
|
|
<H2 align="center">Operational Questions</H2>
|
|
<A href="#4.1">4.1</A>) How do I <SMALL>SELECT</SMALL> only the
|
|
first few rows of a query? A random row?<BR>
|
|
<A href="#4.2">4.2</A>) How do I find out what tables, indexes,
|
|
databases, and users are defined? How do I see the queries used
|
|
by <I>psql</I> to display them?<BR>
|
|
<A href="#4.3">4.3</A>) How do you remove a column from a
|
|
table, or change its data type?<BR>
|
|
<A href="#4.4">4.4</A>) What is the maximum size for a row, a
|
|
table, and a database?<BR>
|
|
<A href="#4.5">4.5</A>) How much database disk space is required
|
|
to store data from a typical text file?<BR>
|
|
<A href="#4.6">4.6</A>) Why are my queries slow? Why don't they
|
|
use my indexes?<BR>
|
|
<A href="#4.7">4.7</A>) How do I see how the query optimizer is
|
|
evaluating my query?<BR>
|
|
<A href="#4.8">4.8</A>) How do I perform regular expression
|
|
searches and case-insensitive regular expression searches? How do I
|
|
use an index for case-insensitive searches?<BR>
|
|
<A href="#4.9">4.9</A>) In a query, how do I detect if a field
|
|
is <SMALL>NULL</SMALL>?<BR>
|
|
<A href="#4.10">4.10</A>) What is the difference between the
|
|
various character types?<BR>
|
|
<A href="#4.11.0">4.11.0</A>) How do I create a
|
|
serial/auto-incrementing field?<BR>
|
|
<A href="#4.11.1">4.11.1</A>) How do I get the value of a
|
|
<SMALL>SERIAL</SMALL> insert?<BR>
|
|
<A href="#4.11.2">4.11.2</A>) Doesn't <I>currval()</I>
|
|
lead to a race condition with other users?<BR>
|
|
<A href="#4.11.3">4.11.3</A>) Why aren't my sequence numbers
|
|
reused on transaction abort? Why are there gaps in the numbering of
|
|
my sequence/SERIAL column?<BR>
|
|
<A href="#4.12">4.12</A>) What is an <SMALL>OID</SMALL>? What is a
|
|
<SMALL>TID</SMALL>?<BR>
|
|
<A href="#4.13">4.13</A>) What is the meaning of some of the terms
|
|
used in PostgreSQL?<BR>
|
|
<A href="#4.14">4.14</A>) Why do I get the error <I>"ERROR: Memory
|
|
exhausted in AllocSetAlloc()"</I>?<BR>
|
|
<A href="#4.15">4.15</A>) How do I tell what PostgreSQL version I
|
|
am running?<BR>
|
|
<A href="#4.16">4.16</A>) Why does my large-object operations get
|
|
<I>"invalid large obj descriptor"</I>?<BR>
|
|
<A href="#4.17">4.17</A>) How do I create a column that will
|
|
default to the current time?<BR>
|
|
<A href="#4.18">4.18</A>) Why are my subqueries using
|
|
<CODE><SMALL>IN</SMALL></CODE> so slow?<BR>
|
|
<A href="#4.19">4.19</A>) How do I perform an outer join?<BR>
|
|
<A href="#4.20">4.20</A>) How do I perform queries using multiple
|
|
databases?<BR>
|
|
<A href="#4.21">4.21</A>) How do I return multiple rows or columns
|
|
from a function?<BR>
|
|
<A href="#4.22">4.22</A>) Why can't I reliably create/drop
|
|
temporary tables in PL/PgSQL functions?<BR>
|
|
<A href="#4.23">4.23</A>) What encryption options are available?<BR>
|
|
|
|
|
|
<H2 align="center">Extending PostgreSQL</H2>
|
|
<A href="#5.1">5.1</A>) I wrote a user-defined function. When I run
|
|
it in <I>psql</I>, why does it dump core?<BR>
|
|
<A href="#5.2">5.2</A>) How can I contribute some nifty new types
|
|
and functions to PostgreSQL?<BR>
|
|
<A href="#5.3">5.3</A>) How do I write a C function to return a
|
|
tuple?<BR>
|
|
<A href="#5.4">5.4</A>) I have changed a source file. Why does the
|
|
recompile not see the change?<BR>
|
|
|
|
<HR>
|
|
|
|
<H2 align="center">General Questions</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 an enhancement of the POSTGRES database management
|
|
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
|
|
complete source is available.</P>
|
|
|
|
<P>PostgreSQL development is performed by a team of
|
|
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. 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/files/documentation/faqs/FAQ_DEV.html">
|
|
http://www.postgresql.org/files/documentation/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,
|
|
and enhancement of the code. The original Postgres code, from which
|
|
PostgreSQL is derived, was the effort of many graduate students,
|
|
undergraduate students, and staff programmers working under the
|
|
direction of Professor Michael Stonebraker at the University of
|
|
California, Berkeley.</P>
|
|
|
|
<P>The original name of the software at Berkeley was Postgres. When
|
|
<SMALL>SQL</SMALL> functionality was added in 1995, its name was
|
|
changed to Postgres95. The name was changed at the end of 1996 to
|
|
PostgreSQL.</P>
|
|
|
|
<H4><A name="1.2">1.2</A>) What is the copyright on
|
|
PostgreSQL?</H4>
|
|
|
|
<P>PostgreSQL is subject to the following COPYRIGHT:</P>
|
|
|
|
<P>PostgreSQL Data Base Management System</P>
|
|
|
|
<P>Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
|
|
Portions Copyright (c) 1994-6 Regents of the University of California</P>
|
|
|
|
<P>Permission to use, copy, modify, and distribute this software
|
|
and its documentation for any purpose, without fee, and without a
|
|
written agreement is hereby granted, provided that the above
|
|
copyright notice and this paragraph and the following two
|
|
paragraphs appear in all copies.</P>
|
|
|
|
<P>IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY
|
|
PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
|
|
DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS
|
|
SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
|
|
CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</P>
|
|
|
|
<P>THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY
|
|
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
|
|
SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE
|
|
UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE,
|
|
SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.</P>
|
|
|
|
<P>The above is the BSD license, the classic open-source license.
|
|
It has no restrictions on how the source code may be used. We like
|
|
it and have no intention of changing it.</P>
|
|
|
|
<H4><A name="1.3">1.3</A>) What platforms does PostgreSQL support?</H4>
|
|
|
|
<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>
|
|
|
|
<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>. MSDOS-based versions
|
|
of Windows (Win95, Win98, WinMe) can run PostgreSQL using Cygwin.
|
|
|
|
<p>There is also a Novell Netware 6 port at
|
|
<a href="http://forge.novell.com">http://forge.novell.com</a>,
|
|
and an OS/2 (eComStation) version at <a href=
|
|
"http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgreSQL&stype=all&sort=type&dir=%2F">
|
|
http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=Search&key=postgreSQL&stype=all&sort=type&dir=%2F</a>.</p>
|
|
|
|
<H4><A name="1.4">1.4</A>) Where can I get PostgreSQL?</H4>
|
|
|
|
<P>The primary anonymous ftp site for PostgreSQL is <A href=
|
|
"ftp://ftp.PostgreSQL.org/pub">ftp://ftp.PostgreSQL.org/pub</A>.
|
|
For mirror sites, see our main web site.</P>
|
|
|
|
<H4><A name="1.5">1.5</A>) Where can I get support?</H4>
|
|
|
|
<P>The main mailing list is: <A href=
|
|
"mailto:pgsql-general@PostgreSQL.org">pgsql-general@PostgreSQL.org</A>.
|
|
It is available for discussion of matters pertaining to PostgreSQL.
|
|
To subscribe, send mail with the following lines in the body (not
|
|
the subject line):</P>
|
|
<PRE>
|
|
subscribe
|
|
end
|
|
</PRE>
|
|
|
|
<P>to <A href=
|
|
"mailto:pgsql-general-request@PostgreSQL.org">pgsql-general-request@PostgreSQL.org</A>.</P>
|
|
|
|
<P>There is also a digest list available. To subscribe to this
|
|
list, send email to: <A href=
|
|
"mailto:pgsql-general-digest-request@PostgreSQL.org">pgsql-general-digest-request@PostgreSQL.org</A>
|
|
with a body of:</P>
|
|
<PRE>
|
|
subscribe
|
|
end
|
|
</PRE>
|
|
|
|
Digests are sent out to members of this list whenever the main list
|
|
has received around 30k of messages.
|
|
|
|
<P>The bugs mailing list is available. To subscribe to this list,
|
|
send email to <A href=
|
|
"mailto:pgsql-bugs-request@PostgreSQL.org">pgsql-bugs-request@PostgreSQL.org</A>
|
|
with a body of:</P>
|
|
<PRE>
|
|
subscribe
|
|
end
|
|
</PRE>
|
|
|
|
There is also a developers discussion mailing list available. To
|
|
subscribe to this list, send email to <A href=
|
|
"mailto:pgsql-hackers-request@PostgreSQL.org">pgsql-hackers-request@PostgreSQL.org</A>
|
|
with a body of:
|
|
<PRE>
|
|
subscribe
|
|
end
|
|
</PRE>
|
|
|
|
<P>Additional mailing lists and information about PostgreSQL can be
|
|
found via the PostgreSQL WWW home page at:</P>
|
|
|
|
<BLOCKQUOTE>
|
|
<A href="http://www.PostgreSQL.org">http://www.PostgreSQL.org</A>
|
|
</BLOCKQUOTE>
|
|
|
|
<P>The major IRC channel is <I>#postgresql</I> on Freenode
|
|
(<I>irc.freenode.net</I>). To connect you can use the Unix
|
|
command <CODE>irc -c '#postgresql' "$USER" irc.freenode.net</CODE>
|
|
or use any of the other popular IRC clients. A Spanish one also exists
|
|
on the same network, (<I>#postgresql-es</I>), and a French one,
|
|
(<I>#postgresqlfr</I>). There is also a PostgreSQL channel on EFNet.
|
|
|
|
<P>A list of commercial support companies is available at <A href=
|
|
"http://techdocs.postgresql.org/companies.php">http://techdocs.postgresql.org/companies.php</A>.</P>
|
|
|
|
<H4><A name="1.6">1.6</A>) What is the latest release?</H4>
|
|
|
|
<P>The latest release of PostgreSQL is version 8.0.0.</P>
|
|
|
|
<P>We plan to have major releases every six to eight months.</P>
|
|
|
|
<H4><A name="1.7">1.7</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 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>
|
|
and <A href=
|
|
"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://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>
|
|
|
|
<P>The command line client program <I>psql</I> has some \d commands to show
|
|
information about types, operators, functions, aggregates, etc. - use \? to
|
|
display the available commands.</P>
|
|
|
|
<P>Our web site contains even more documentation.</P>
|
|
|
|
<H4><A name="1.8">1.8</A>) How do I find out about known bugs or
|
|
missing features?</H4>
|
|
|
|
<P>PostgreSQL supports an extended subset of <SMALL>SQL</SMALL>-92.
|
|
See our <A href="http://developer.PostgreSQL.org/todo.php">TODO</A>
|
|
list for known bugs, missing features, and future plans.</P>
|
|
|
|
<H4><A name="1.9">1.9</A>) How can I learn
|
|
<SMALL>SQL</SMALL>?</H4>
|
|
|
|
<P>The PostgreSQL book at <A href=
|
|
"http://www.PostgreSQL.org/docs/awbook.html">http://www.PostgreSQL.org/docs/awbook.html</A>
|
|
teaches <SMALL>SQL</SMALL>. There is another PostgreSQL book at <A
|
|
href=
|
|
"http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook.</A>
|
|
There is a nice tutorial at <A href=
|
|
"http://www.intermedia.net/support/sql/sqltut.shtm">http://www.intermedia.net/support/sql/sqltut.shtm,</A>
|
|
at <A href=
|
|
"http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM">
|
|
http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM,</A>
|
|
and at <A href=
|
|
"http://sqlcourse.com/">http://sqlcourse.com.</A></P>
|
|
|
|
<P>Another one is "Teach Yourself SQL in 21 Days, Second Edition"
|
|
at <A href=
|
|
"http://members.tripod.com/er4ebus/sql/index.htm">http://members.tripod.com/er4ebus/sql/index.htm</A></P>
|
|
|
|
<P>Many of our users like <I>The Practical SQL Handbook</I>,
|
|
Bowman, Judith S., et al., Addison-Wesley. Others like <I>The
|
|
Complete Reference SQL</I>, Groff et al., McGraw-Hill.</P>
|
|
|
|
<H4><A name="1.10">1.10</A>) How do I join the development
|
|
team?</H4>
|
|
|
|
<P>First, download the latest source and read the PostgreSQL
|
|
Developers documentation on our web site, or in the distribution.
|
|
Second, subscribe to the <I>pgsql-hackers</I> and
|
|
<I>pgsql-patches</I> mailing lists. Third, submit high quality
|
|
patches to pgsql-patches.</P>
|
|
|
|
<P>There are about a dozen people who have commit privileges to the
|
|
PostgreSQL <SMALL>CVS</SMALL> archive. They each have submitted so
|
|
many high-quality patches that it was impossible for the existing
|
|
committers to keep up, and we had confidence that patches they
|
|
committed were of high quality.</P>
|
|
|
|
<H4><A name="1.11">1.11</A>) How do I submit a bug report?</H4>
|
|
|
|
<P>Visit the PostgreSQL bug form at <A href=
|
|
"http://www.postgresql.org/support/submitbug">
|
|
http://www.postgresql.org/support/submitbug</A>.</P>
|
|
|
|
<P>Also check out our ftp site <A href=
|
|
"ftp://ftp.PostgreSQL.org/pub">ftp://ftp.PostgreSQL.org/pub</A> to
|
|
see if there is a more recent PostgreSQL version or patches.</P>
|
|
|
|
<H4><A name="1.12">1.12</A>) How does PostgreSQL compare to other
|
|
<SMALL>DBMS</SMALL>s?</H4>
|
|
|
|
<P>There are several ways of measuring software: features,
|
|
performance, reliability, support, and price.</P>
|
|
|
|
<DL>
|
|
<DT><B>Features</B></DT>
|
|
|
|
<DD>PostgreSQL has most features present in large commercial
|
|
<SMALL>DBMS</SMALL>s, like transactions, subselects, triggers,
|
|
views, foreign key referential integrity, and sophisticated
|
|
locking. We have some features they do not have, like
|
|
user-defined types, inheritance, rules, and multi-version
|
|
concurrency control to reduce lock contention.<BR>
|
|
<BR>
|
|
</DD>
|
|
|
|
<DT><B>Performance</B></DT>
|
|
|
|
<DD>PostgreSQL's performance is comparable 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
|
|
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, and we continue to improve performance in every
|
|
release. <BR>
|
|
<BR>
|
|
</DD>
|
|
|
|
<DT><B>Reliability</B></DT>
|
|
|
|
<DD>We realize that a <SMALL>DBMS</SMALL> must be reliable, or it
|
|
is worthless. We strive to release well-tested, stable code that
|
|
has a minimum of bugs. Each release has at least one month of
|
|
beta testing, and our release history shows that we can provide
|
|
stable, solid releases that are ready for production use. We
|
|
believe we compare favorably to other database software in this
|
|
area.<BR>
|
|
<BR>
|
|
</DD>
|
|
|
|
<DT><B>Support</B></DT>
|
|
|
|
<DD>Our mailing lists provide contact with a large group of developers
|
|
and users to help resolve any problems encountered. While we cannot
|
|
guarantee a fix, commercial <SMALL>DBMS</SMALL>s do not always
|
|
supply a fix either. Direct access to developers, the user
|
|
community, manuals, and the source code often make PostgreSQL
|
|
support superior to other <SMALL>DBMS</SMALL>s. There is
|
|
commercial per-incident support available for those who need it.
|
|
(See <A href="#1.5">FAQ section 1.5</A>.)<BR>
|
|
<BR>
|
|
</DD>
|
|
|
|
<DT><B>Price</B></DT>
|
|
|
|
<DD>We are free for all use, both commercial and non-commercial.
|
|
You can add our code to your product with no limitations, except
|
|
those outlined in our BSD-style license stated above.<BR>
|
|
<BR>
|
|
</DD>
|
|
</DL>
|
|
|
|
<H4><A name="1.13">1.13</A>) How can I financially assist
|
|
PostgreSQL?</H4>
|
|
|
|
<P>PostgreSQL has had a first-class infrastructure since we started
|
|
in 1996. This is all thanks to Marc Fournier, who has created
|
|
and managed this infrastructure over the years.</P>
|
|
|
|
<P>Quality infrastructure is very important to an open-source
|
|
project. It prevents disruptions that can greatly delay forward
|
|
movement of the project.</P>
|
|
|
|
<P>Of course, this infrastructure is not cheap. There are a variety
|
|
of monthly and one-time expenses that are required to keep it
|
|
going. If you or your company has money it can donate to help fund
|
|
this effort, please go to <A href="http://store.pgsql.com/shopping/">http://store.pgsql.com/shopping/</A>
|
|
and make a donation.</P>
|
|
|
|
<P>Although the web page mentions PostgreSQL, Inc, the
|
|
"contributions" item is solely to support the PostgreSQL project
|
|
and does not fund any specific company. If you prefer, you can also
|
|
send a check to the contact address.</P>
|
|
|
|
<P>Also, if you have a success story about PostgreSQL, please email
|
|
it to our advocacy list at <a href="mailto:pgsql-advocacy@postgresql.org">
|
|
pgsql-advocacy@postgresql.org</a>.</P>
|
|
|
|
<HR>
|
|
|
|
<H2 align="center">User Client Questions</H2>
|
|
|
|
<H4><A name="2.1">2.1</A>) What interfaces are available for
|
|
PostgreSQL?</H4>
|
|
|
|
<P>The PostgreSQL install includes only the <SMALL>C</SMALL> and embedded
|
|
<SMALL>C</SMALL> interfaces. All other interfaces are independent projects
|
|
that are downloaded separately; being separate allows them to have their
|
|
own release schedule and development teams.</P>
|
|
|
|
<P>Some programming languages like <SMALL>PHP</SMALL> include an
|
|
interface to PostgreSQL. Interfaces for languages like Perl,
|
|
<SMALL>TCL</SMALL>, Python, and many others are available at
|
|
<a href="http://gborg.postgresql.org">http://gborg.postgresql.org</A>
|
|
in the <I>Drivers/Interfaces</I> section and via Internet search.
|
|
</P>
|
|
|
|
<H4><A name="2.2">2.2</A>) What tools are available for using
|
|
PostgreSQL with Web pages?</H4>
|
|
|
|
<P>A nice introduction to Database-backed Web pages can be seen at:
|
|
<A href="http://www.webreview.com">http://www.webreview.com</A></P>
|
|
|
|
<P>For Web integration, PHP is an excellent interface. It is at <A
|
|
href="http://www.php.net">http://www.php.net</A>.</P>
|
|
|
|
<P>For complex cases, many use the Perl interface and CGI.pm or mod_perl.</P>
|
|
|
|
<H4><A name="2.3">2.3</A>) Does PostgreSQL have a graphical user
|
|
interface?</H4>
|
|
|
|
<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 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>), TORA (<a href="http://www.globecom.net/tora/">http://www.globecom.net/tora/</a>,
|
|
partly commercial), and Rekall (<a href="http://www.rekallrevealed.org/">
|
|
http://www.rekallrevealed.org/</a>). There is also PhpPgAdmin
|
|
(<a href="http://phppgadmin.sourceforge.net/">
|
|
http://phppgadmin.sourceforge.net/ </a>), a web-based interface to
|
|
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>
|
|
|
|
<HR>
|
|
|
|
|
|
<H2 align="center">Administrative Questions</H2>
|
|
|
|
<H4><A name="3.1">3.1</A>) How do I install PostgreSQL somewhere
|
|
other than <I>/usr/local/pgsql</I>?</H4>
|
|
|
|
<P>Specify the <I>--prefix</I> option when running
|
|
<I>configure</I>.</P>
|
|
|
|
<H4><A name="3.2">3.2</A>) How do I control connections from other
|
|
hosts?</H4>
|
|
|
|
<P>By default, PostgreSQL only allows connections from the local
|
|
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.3">3.3</A>) How do I tune the database engine for
|
|
better performance?</H4>
|
|
|
|
<P>Certainly, indexes can speed up queries. The
|
|
<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
|
|
them in a large batch using the <SMALL>COPY</SMALL> command. This
|
|
is much faster than individual <SMALL>INSERTS</SMALL>. Second,
|
|
statements not in a <SMALL>BEGIN WORK/COMMIT</SMALL> transaction
|
|
block are considered to be in their own transaction. Consider
|
|
performing several statements in a single transaction block. This
|
|
reduces the transaction overhead. Also, consider dropping and
|
|
recreating indexes when making large data changes.</P>
|
|
|
|
<P>There are several tuning options in the <a href=
|
|
"http://www.postgresql.org/docs/current/static/runtime.html">
|
|
Administration Guide/Server Run-time Environment/Run-time Configuration</a>.
|
|
You can disable <I>fsync()</I> by using <i>fsync</I> option. This will
|
|
prevent <I>fsync()</I>s from flushing to disk after every
|
|
transaction.</P>
|
|
|
|
<P>You can use the <I>shared_buffers</I> option to
|
|
increase the number of shared memory buffers used by the backend
|
|
processes. If you make this parameter too high, the
|
|
<I>postmaster</I> may not start because you have exceeded your
|
|
kernel's limit on shared memory space. Each buffer is 8K and the
|
|
default is 1000 buffers.</P>
|
|
|
|
<P>You can also use the <I>sort_mem</I> (from PostgreSQL 8.0: <I>work_mem</I>)
|
|
options to increase the maximum amount of memory used by the backend
|
|
processes for each temporary sort. The default is 1024 (i.e. 1MB).</P>
|
|
|
|
<P>You can also use the <SMALL>CLUSTER</SMALL> command to group
|
|
data in tables to match an index. See the <SMALL>CLUSTER</SMALL>
|
|
manual page for more details.</P>
|
|
|
|
<H4><A name="3.4">3.4</A>) What debugging features are
|
|
available?</H4>
|
|
|
|
<P>PostgreSQL has several features that report status information
|
|
that can be valuable for debugging purposes.</P>
|
|
|
|
<P>First, by running <I>configure</I> with the --enable-cassert
|
|
option, many <I>assert()</I>s monitor the progress of the backend
|
|
and halt the program when something unexpected occurs.</P>
|
|
|
|
<P>Both <I>postmaster</I> and <I>postgres</I> have several debug
|
|
options available. First, whenever you start <I>postmaster</I>,
|
|
make sure you send the standard output and error to a log file,
|
|
like:</P>
|
|
<PRE>
|
|
cd /usr/local/pgsql
|
|
./bin/postmaster >server.log 2>&1 &
|
|
</PRE>
|
|
|
|
<P>This will put a server.log file in the top-level PostgreSQL
|
|
directory. This file contains useful information about problems or
|
|
errors encountered by the server. <I>Postmaster</I> has a <I>-d</I>
|
|
option that allows even more detailed information to be reported.
|
|
The <I>-d</I> option takes a number that specifies the debug level.
|
|
Be warned that high debug level values generate large log
|
|
files.</P>
|
|
|
|
<P>If <I>postmaster</I> is not running, you can actually run the
|
|
<I>postgres</I> backend from the command line, and type your
|
|
<SMALL>SQL</SMALL> statement directly. This is recommended
|
|
<B>only</B> for debugging purposes. Note that a newline terminates
|
|
the query, not a semicolon. If you have compiled with debugging
|
|
symbols, you can use a debugger to see what is happening. Because
|
|
the backend was not started from <I>postmaster</I>, it is not
|
|
running in an identical environment and locking/backend interaction
|
|
problems may not be duplicated.</P>
|
|
|
|
<P>If <I>postmaster</I> is running, start <I>psql</I> in one
|
|
window, then find the <SMALL>PID</SMALL> of the <I>postgres</I>
|
|
process used by <I>psql</I> using <pre>SELECT pg_backend_pid()</pre>.
|
|
Use a debugger to attach to the <I>postgres</I> <SMALL>PID</SMALL>.
|
|
You can set breakpoints in the debugger and issue queries from
|
|
<I>psql</I>. If you are debugging <I>postgres</I> startup, you can
|
|
set PGOPTIONS="-W n", then start <I>psql</I>. This will cause startup
|
|
to delay for <I>n</I> seconds so you can attach to the process with
|
|
the debugger, set any breakpoints, and continue through the startup
|
|
sequence.</P>
|
|
|
|
<P>There are several <pre>log_*</pre> server configuration variables
|
|
that enable printing of process statistics which can be very useful
|
|
for debugging and performance measurements.</P>
|
|
|
|
<P>You can also compile with profiling to see what functions are
|
|
taking execution time. The backend profile files will be deposited
|
|
in the <I>pgsql/data/base/dbname</I> directory. The client profile
|
|
file will be put in the client's current directory. Linux requires
|
|
a compile with <I>-DLINUX_PROFILE</I> for proper profiling.</P>
|
|
|
|
<H4><A name="3.5">3.5</A>) Why do I get <I>"Sorry, too many
|
|
clients"</I> when trying to connect?</H4>
|
|
|
|
<P>You need to increase <I>postmaster</I>'s limit on how many
|
|
concurrent backend processes it can start.</P>
|
|
|
|
<P>The default limit is 32 processes. You can increase it by
|
|
restarting <I>postmaster</I> with a suitable <I>-N</I> value or
|
|
modifying <I>postgresql.conf</I>.</P>
|
|
|
|
<P>Note that if you make <I>-N</I> larger than 32, you must also
|
|
increase <I>-B</I> beyond its default of 64; <I>-B</I> must be at
|
|
least twice <I>-N</I>, and probably should be more than that for
|
|
best performance. For large numbers of backend processes, you are
|
|
also likely to find that you need to increase various Unix kernel
|
|
configuration parameters. Things to check include the maximum size
|
|
of shared memory blocks, <SMALL>SHMMAX;</SMALL> the maximum number
|
|
of semaphores, <SMALL>SEMMNS</SMALL> and <SMALL>SEMMNI;</SMALL> the
|
|
maximum number of processes, <SMALL>NPROC;</SMALL> the maximum
|
|
number of processes per user, <SMALL>MAXUPRC;</SMALL> and the
|
|
maximum number of open files, <SMALL>NFILE</SMALL> and
|
|
<SMALL>NINODE</SMALL>. The reason that PostgreSQL has a limit on
|
|
the number of allowed backend processes is so your system won't run
|
|
out of resources.</P>
|
|
|
|
<H4><A name="3.6">3.6</A>) What is in the <I>pgsql_tmp</I> directory?</H4>
|
|
|
|
<P>This directory contains temporary files generated by the query
|
|
executor. For example, if a sort needs to be done to satisfy an
|
|
<SMALL>ORDER BY</SMALL> and the sort requires more space than the
|
|
backend's <I>-S</I> parameter allows, then temporary files are created
|
|
here to hold the extra data.</P>
|
|
|
|
<P>The temporary files are usually deleted automatically, but might
|
|
remain if a backend crashes during a sort. A stop and restart of the
|
|
<I>postmaster</I> will remove files from those directories.</P>
|
|
|
|
<H4><A name="3.7">3.7</A>) Why do I need to do a dump and restore
|
|
to upgrade between major PostgreSQL releases?</H4>
|
|
|
|
<P>The PostgreSQL team makes only small changes between minor releases,
|
|
so upgrading from 7.2 to 7.2.1 does not require a dump and restore.
|
|
However, major releases (e.g. from 7.2 to 7.3) often change the internal
|
|
format of system tables and data files. These changes are often complex,
|
|
so we don't maintain backward compatability for data files. A dump outputs
|
|
data in a generic format that can then be loaded in using the new internal
|
|
format.</P>
|
|
|
|
<P>In releases where the on-disk format does not change, the
|
|
<I>pg_upgrade</I> script can be used to upgrade without a dump/restore.
|
|
The release notes mention whether <I>pg_upgrade</I> is available for the
|
|
release.</P>
|
|
|
|
<H4><A name="3.8">3.8</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>
|
|
|
|
<H4><A name="4.1">4.1</A>) How do I <SMALL>SELECT</SMALL> only the
|
|
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>
|
|
|
|
<P>The entire query may have to be evaluated, even if you only want
|
|
the first few rows. Consider using a query that has an <SMALL>ORDER
|
|
BY</SMALL>. If there is an index that matches the <SMALL>ORDER
|
|
BY</SMALL>, PostgreSQL may be able to evaluate only the first few
|
|
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.2">4.2</A>) How do I find out what tables, indexes,
|
|
databases, and users are defined? How do I see the queries used
|
|
by <I>psql</I> to display them?</H4>
|
|
|
|
<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>SQL</SMALL> compliant
|
|
INFORMATION SCHEMA interface you can query to get information about the
|
|
database.</P>
|
|
|
|
<P>There are also system tables beginning with <I>pg_</I> that describe
|
|
these too. Use <I>psql -l</I> will list all databases.</P>
|
|
|
|
<P>Also try the file <I>pgsql/src/tutorial/syscat.source</I>. It
|
|
illustrates many of the <SMALL>SELECT</SMALL>s needed to get
|
|
information from the database system tables.</P>
|
|
|
|
<H4><A name="4.3">4.3</A>) How do you remove a column from a
|
|
table, or change its data type?</H4>
|
|
|
|
<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>
|
|
BEGIN;
|
|
LOCK TABLE old_table;
|
|
SELECT ... -- select all columns but the one you want to remove
|
|
INTO TABLE new_table
|
|
FROM old_table;
|
|
DROP TABLE old_table;
|
|
ALTER TABLE new_table RENAME TO old_table;
|
|
COMMIT;
|
|
</PRE>
|
|
|
|
<P>Changing the data type of a column can be done easily in 8.0
|
|
and later with <SMALL>ALTER TABLE ALTER COLUMN TYPE</SMALL>.
|
|
|
|
<P>In earlier releases, 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.4">4.4</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 (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
|
|
Maximum number of columns in a table? 250-1600 depending on column types
|
|
Maximum number of indexes on a table? unlimited
|
|
</PRE>
|
|
|
|
Of course, these are not actually unlimited, but limited to
|
|
available disk space and memory/swap space. Performance may suffer
|
|
when these values get unusually large.
|
|
|
|
<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
|
|
quadrupled by increasing the default block size to 32k.</P>
|
|
|
|
<H4><A name="4.5">4.5</A>) How much database disk space is required
|
|
to store data from a typical text file?</H4>
|
|
|
|
<P>A PostgreSQL database may require up to five times the disk
|
|
space to store data from a text file.</P>
|
|
|
|
<P>As an example, consider a file of 100,000 lines with an integer
|
|
and text description on each line. Suppose the text string
|
|
avergages twenty bytes in length. The flat file would be 2.8 MB.
|
|
The size of the PostgreSQL database file containing this data can
|
|
be estimated as 6.4 MB:</P>
|
|
<PRE>
|
|
32 bytes: each row header (approximate)
|
|
24 bytes: one int field and one text field
|
|
+ 4 bytes: pointer on page to tuple
|
|
----------------------------------------
|
|
60 bytes per row
|
|
|
|
The data page size in PostgreSQL is 8192 bytes (8 KB), so:
|
|
|
|
8192 bytes per page
|
|
------------------- = 136 rows per database page (rounded down)
|
|
60 bytes per row
|
|
|
|
100000 data rows
|
|
-------------------- = 735 database pages (rounded up)
|
|
128 rows per page
|
|
|
|
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 as bitmaps, so they
|
|
use very little space.</P>
|
|
|
|
<H4><A name="4.6">4.6</A>) Why are my queries slow? Why don't they
|
|
use my indexes?</H4>
|
|
|
|
<P>Indexes are not automatically used by every query. Indexes are only
|
|
used if the table is larger than a minimum size, and the query
|
|
selects only a small percentage of the rows in the table. This is
|
|
because the random disk access caused by an index scan can be
|
|
slower than a straight read through the table, or sequential scan.
|
|
|
|
<P>To determine if an index should be used, PostgreSQL must have
|
|
statistics about the table. These statistics are collected using
|
|
<SMALL>VACUUM ANALYZE</SMALL>, or simply <SMALL>ANALYZE</SMALL>.
|
|
Using statistics, the optimizer knows how many rows are in the
|
|
table, and can better determine if indexes should be used.
|
|
Statistics are also valuable in determining optimal join order and
|
|
join methods. Statistics collection should be performed
|
|
periodically as the contents of the table change.</P>
|
|
|
|
<P>Indexes are normally not used for <SMALL>ORDER BY</SMALL> or to
|
|
perform joins. A sequential scan followed by an explicit sort is
|
|
usually faster than an index scan of a large table.</P>
|
|
However, <SMALL>LIMIT</SMALL> combined with <SMALL>ORDER BY</SMALL>
|
|
often will use an index because only a small portion of the table
|
|
is returned. In fact, though MAX() and MIN() don't use indexes,
|
|
it is possible to retrieve such values using an index with ORDER BY
|
|
and LIMIT:
|
|
<PRE>
|
|
SELECT col
|
|
FROM tab
|
|
ORDER BY col [ DESC ]
|
|
LIMIT 1;
|
|
</PRE>
|
|
|
|
<P>If you believe the optimizer is incorrect in choosing a
|
|
sequential scan, use <CODE>SET enable_seqscan TO 'off'</CODE> and
|
|
run tests to see if an index scan is indeed faster.</P>
|
|
|
|
<P>When using wild-card operators such as <SMALL>LIKE</SMALL> or
|
|
<I>~</I>, indexes can only be used in certain circumstances:</P>
|
|
<UL>
|
|
<LI>The beginning of the search string must be anchored to the start
|
|
of the string, i.e.
|
|
<UL>
|
|
<LI><SMALL>LIKE</SMALL> patterns must not start with <I>%</I>.</LI>
|
|
<LI><I>~</I> (regular expression) patterns must start with
|
|
<I>^</I>.</LI>
|
|
</UL></LI>
|
|
<LI>The search string can not start with a character class,
|
|
e.g. [a-e].</LI>
|
|
<LI>Case-insensitive searches such as <SMALL>ILIKE</SMALL> and
|
|
<I>~*</I> do not utilize indexes. Instead, use functional
|
|
indexes, which are described in section <a href="#4.10">4.10</a>.</LI>
|
|
<LI>The default <I>C</I> locale must be used during
|
|
<i>initdb</i> because it is not possible to know the next-greater
|
|
character in a non-C locale. You can create a special
|
|
<PRE>text_pattern_ops</PRE> index for such cases that work only
|
|
for <PRE>LIKE</PRE> indexing.
|
|
</LI>
|
|
</UL>
|
|
|
|
<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.7">4.7</A>) How do I see how the query optimizer is
|
|
evaluating my query?</H4>
|
|
|
|
<P>See the <SMALL>EXPLAIN</SMALL> manual page.</P>
|
|
|
|
<H4><A name="4.8">4.8</A>) How do I perform regular expression
|
|
searches and case-insensitive regular expression searches? How do I
|
|
use an index for case-insensitive searches?</H4>
|
|
|
|
<P>The <I>~</I> operator does regular expression matching, and
|
|
<I>~*</I> does case-insensitive regular expression matching. The
|
|
case-insensitive variant of <SMALL>LIKE</SMALL> is called
|
|
<SMALL>ILIKE</SMALL>.</P>
|
|
|
|
<P>Case-insensitive equality comparisons are normally expressed
|
|
as:</P>
|
|
<PRE>
|
|
SELECT *
|
|
FROM tab
|
|
WHERE lower(col) = 'abc';
|
|
</PRE>
|
|
|
|
This will not use an standard index. However, if you create a
|
|
functional index, it will be used:
|
|
<PRE>
|
|
CREATE INDEX tabindex ON tab (lower(col));
|
|
</PRE>
|
|
|
|
<H4><A name="4.9">4.9</A>) In a query, how do I detect if a field
|
|
is <SMALL>NULL</SMALL>?</H4>
|
|
|
|
<P>You test the column with <SMALL>IS NULL</SMALL> and <SMALL>IS
|
|
NOT NULL</SMALL>.</P>
|
|
|
|
<H4><A name="4.10">4.10</A>) What is the difference between the
|
|
various character types?</H4>
|
|
<PRE>
|
|
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
|
|
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 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
|
|
stored out-of-line by <SMALL>TOAST</SMALL>, so the space on disk
|
|
might also be less than expected.</P>
|
|
|
|
<SMALL>VARCHAR(n)</SMALL> is best when storing variable-length
|
|
strings and it limits how long a string can be. <SMALL>TEXT</SMALL>
|
|
is for strings of unlimited length, with a maximum of one gigabyte.
|
|
<P><SMALL>CHAR(n)</SMALL> is for storing strings that are all the
|
|
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. All the
|
|
types described here have similar performance characteristics.</P>
|
|
|
|
<H4><A name="4.11.1">4.11.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. For example,
|
|
this:</P>
|
|
<PRE>
|
|
CREATE TABLE person (
|
|
id SERIAL,
|
|
name TEXT
|
|
);
|
|
</PRE>
|
|
|
|
is automatically translated into this:
|
|
<PRE>
|
|
CREATE SEQUENCE person_id_seq;
|
|
CREATE TABLE person (
|
|
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
|
|
name TEXT
|
|
);
|
|
</PRE>
|
|
|
|
See the <I>create_sequence</I> manual page for more information
|
|
about sequences. You can also use each row's <I>OID</I> field as a
|
|
unique value. However, if you need to dump and reload the database,
|
|
you need to use <I>pg_dump</I>'s <I>-o</I> option or <SMALL>COPY
|
|
WITH OIDS</SMALL> option to preserve the <SMALL>OID</SMALL>s.
|
|
|
|
<H4><A name="4.11.2">4.11.2</A>) How do I get the value of a
|
|
<SMALL>SERIAL</SMALL> insert?</H4>
|
|
|
|
<P>One approach is to retrieve the next <SMALL>SERIAL</SMALL> value
|
|
from the sequence object with the <I>nextval()</I> function
|
|
<I>before</I> inserting and then insert it explicitly. Using the
|
|
example table in <A href="#4.11.1">4.11.1</A>, an example in a
|
|
pseudo-language would look like this:</P>
|
|
<PRE>
|
|
new_id = execute("SELECT nextval('person_id_seq')");
|
|
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
|
|
</PRE>
|
|
|
|
You would then also have the new value stored in
|
|
<CODE>new_id</CODE> for use in other queries (e.g., as a foreign
|
|
key to the <CODE>person</CODE> table). Note that the name of the
|
|
automatically created <SMALL>SEQUENCE</SMALL> object will be named
|
|
<<I>table</I>>_<<I>serialcolumn</I>>_<I>seq</I>, where
|
|
<I>table</I> and <I>serialcolumn</I> are the names of your table
|
|
and your <SMALL>SERIAL</SMALL> column, respectively.
|
|
|
|
<P>Alternatively, you could retrieve the assigned
|
|
<SMALL>SERIAL</SMALL> value with the <I>currval()</I> function
|
|
<I>after</I> it was inserted by default, e.g.,</P>
|
|
<PRE>
|
|
execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
|
|
new_id = execute("SELECT currval('person_id_seq')");
|
|
</PRE>
|
|
|
|
<P>Finally, you could use the <A href="#4.12"><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,
|
|
and the oid value will wrap around when it reaches 4 billion.
|
|
In Perl, using DBI with the DBD::Pg module, the oid value is made
|
|
available via <I>$sth->{pg_oid_status}</I> after
|
|
<I>$sth->execute()</I>.</P>
|
|
|
|
<H4><A name="4.11.3">4.11.3</A>) Doesn't <I>currval()</I>
|
|
lead to a race condition with other users?</H4>
|
|
|
|
<P>No. <I>currval()</I> returns the current value assigned by your
|
|
backend, not by all users.</P>
|
|
|
|
<H4><A name="4.11.4">4.11.4</A>) Why aren't my sequence numbers
|
|
reused on transaction abort? Why are there gaps in the numbering of
|
|
my sequence/SERIAL column?</H4>
|
|
|
|
<P>To improve concurrency, sequence values are given out to running
|
|
transactions as needed and are not locked until the transaction
|
|
completes. This causes gaps in numbering from aborted
|
|
transactions.</P>
|
|
|
|
<H4><A name="4.12">4.12</A>) What is an <SMALL>OID</SMALL>? What is
|
|
a <SMALL>TID</SMALL>?</H4>
|
|
|
|
<P>Every row that is created in PostgreSQL gets a unique
|
|
<SMALL>OID</SMALL> unless created <SMALL>WITHOUT OIDS</SMALL>.
|
|
O<SMALL>ID</SMALL>s are autotomatically assigned unique 4-byte
|
|
integers that are unique across the entire installation. However,
|
|
they overflow at 4 billion, and then the O<SMALL>ID</SMALL>s start
|
|
being duplicated. PostgreSQL uses <SMALL>OID</SMALL>s to link its
|
|
internal system tables together.</P>
|
|
|
|
<P>To uniquely number columns in user tables, it is best to use
|
|
<SMALL>SERIAL</> rather than O<SMALL>ID</SMALL>s because
|
|
<SMALL>SERIAL<SMALL> sequences are unique only within a single
|
|
table. and are therefore less likely to overflow.
|
|
<SMALL>SERIAL8</SMALL> is available for storing eight-byte sequence
|
|
values.</P>
|
|
|
|
<P>T<SMALL>ID</SMALL>s are used to identify specific physical rows
|
|
with block and offset values. T<SMALL>ID</SMALL>s change after rows
|
|
are modified or reloaded. They are used by index entries to point
|
|
to physical rows.</P>
|
|
|
|
<H4><A name="4.13">4.13</A>) What is the meaning of some of the
|
|
terms used in PostgreSQL?</H4>
|
|
|
|
<P>Some of the source code and older documentation use terms that
|
|
have more common usage. Here are some:</P>
|
|
|
|
<UL>
|
|
<LI>table, relation, class</LI>
|
|
|
|
<LI>row, record, tuple</LI>
|
|
|
|
<LI>column, field, attribute</LI>
|
|
|
|
<LI>retrieve, select</LI>
|
|
|
|
<LI>replace, update</LI>
|
|
|
|
<LI>append, insert</LI>
|
|
|
|
<LI><SMALL>OID</SMALL>, serial value</LI>
|
|
|
|
<LI>portal, cursor</LI>
|
|
|
|
<LI>range variable, table name, table alias</LI>
|
|
</UL>
|
|
|
|
<P>A list of general database terms can be found at: <A href=
|
|
"http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary/glossary.html">http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary/glossary.html</A></P>
|
|
|
|
<H4><A name="4.14">4.14</A>) Why do I get the error <I>"ERROR:
|
|
Memory exhausted in AllocSetAlloc()"</I>?</H4>
|
|
|
|
<P>You probably have run out of virtual memory on your system,
|
|
or your kernel has a low limit for certain resources. Try this
|
|
before starting <I>postmaster</I>:</P>
|
|
<PRE>
|
|
ulimit -d 262144
|
|
limit datasize 256m
|
|
</PRE>
|
|
|
|
Depending on your shell, only one of these may succeed, but it will
|
|
set your process data segment limit much higher and perhaps allow
|
|
the query to complete. This command applies to the current process,
|
|
and all subprocesses created after the command is run. If you are
|
|
having a problem with the <SMALL>SQL</SMALL> client because the
|
|
backend is returning too much data, try it before starting the
|
|
client.
|
|
|
|
<H4><A name="4.15">4.15</A>) How do I tell what PostgreSQL version
|
|
I am running?</H4>
|
|
|
|
<P>From <I>psql</I>, type <CODE>SELECT version();</CODE></P>
|
|
|
|
<H4><A name="4.16">4.16</A>) Why does my large-object operations
|
|
get <I>"invalid large obj descriptor"</I>?</H4>
|
|
|
|
<P>You need to put <CODE>BEGIN WORK</CODE> and <CODE>COMMIT</CODE>
|
|
around any use of a large object handle, that is, surrounding
|
|
<CODE>lo_open</CODE> ... <CODE>lo_close.</CODE></P>
|
|
|
|
<P>Currently PostgreSQL enforces the rule by closing large object
|
|
handles at transaction commit. So the first attempt to do anything
|
|
with the handle will draw <I>invalid large obj descriptor</I>. So
|
|
code that used to work (at least most of the time) will now
|
|
generate that error message if you fail to use a transaction.</P>
|
|
|
|
<P>If you are using a client interface like <SMALL>ODBC</SMALL> you
|
|
may need to set <CODE>auto-commit off.</CODE></P>
|
|
|
|
<H4><A name="4.17">4.17</A>) How do I create a column that will
|
|
default to the current time?</H4>
|
|
|
|
<P>Use <I>CURRENT_TIMESTAMP</I>:</P>
|
|
<PRE>
|
|
<CODE>CREATE TABLE test (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
|
|
</CODE>
|
|
</PRE>
|
|
|
|
<H4><A name="4.18">4.18</A>) Why are my subqueries using
|
|
<CODE><SMALL>IN</SMALL></CODE> so slow?</H4>
|
|
|
|
<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 *
|
|
FROM tab
|
|
WHERE col IN (SELECT subcol FROM subtab);
|
|
</PRE>
|
|
to:
|
|
<PRE> SELECT *
|
|
FROM tab
|
|
WHERE EXISTS (SELECT subcol FROM subtab WHERE subcol = col);
|
|
</PRE>
|
|
|
|
For this to be fast, <CODE>subcol</CODE> should be an indexed column.
|
|
<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.19">4.19</A>) How do I perform an outer join?</H4>
|
|
|
|
<P>PostgreSQL supports outer joins using the SQL standard syntax.
|
|
Here are two examples:</P>
|
|
<PRE>
|
|
SELECT *
|
|
FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);
|
|
</PRE>
|
|
or
|
|
<PRE>
|
|
SELECT *
|
|
FROM t1 LEFT OUTER JOIN t2 USING (col);
|
|
</PRE>
|
|
|
|
<P>These identical queries join t1.col to t2.col, and also return
|
|
any unjoined rows in t1 (those with no match in t2). A
|
|
<SMALL>RIGHT</SMALL> join would add unjoined rows of t2. A
|
|
<SMALL>FULL</SMALL> join would return the matched rows plus all
|
|
unjoined rows from t1 and t2. The word <SMALL>OUTER</SMALL> is
|
|
optional and is assumed in <SMALL>LEFT</SMALL>,
|
|
<SMALL>RIGHT</SMALL>, and <SMALL>FULL</SMALL> joins. Ordinary joins
|
|
are called <SMALL>INNER</SMALL> joins.</P>
|
|
|
|
<P>In previous releases, outer joins can be simulated using
|
|
<SMALL>UNION</SMALL> and <SMALL>NOT IN</SMALL>. For example, when
|
|
joining <I>tab1</I> and <I>tab2</I>, the following query does an
|
|
<I>outer</I> join of the two tables:<BR>
|
|
<BR>
|
|
</P>
|
|
<PRE>
|
|
SELECT tab1.col1, tab2.col2
|
|
FROM tab1, tab2
|
|
WHERE tab1.col1 = tab2.col1
|
|
UNION ALL
|
|
SELECT tab1.col1, NULL
|
|
FROM tab1
|
|
WHERE tab1.col1 NOT IN (SELECT tab2.col1 FROM tab2)
|
|
ORDER BY col1
|
|
</PRE>
|
|
|
|
<H4><A name="4.20">4.20</A>) How do I perform queries using
|
|
multiple databases?</H4>
|
|
|
|
<P>There is no way to query a database other than the current one.
|
|
Because PostgreSQL loads database-specific system catalogs, it is
|
|
uncertain how a cross-database query should even behave.</P>
|
|
|
|
<P><I>contrib/dblink</I> allows cross-database queries using
|
|
function calls. Of course, a client can make simultaneous
|
|
connections to different databases and merge the results on the
|
|
client side.</P>
|
|
|
|
<H4><A name="4.21">4.21</A>) How do I return multiple rows or
|
|
columns from a function?</H4>
|
|
|
|
<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.22">4.22</A>) Why can't I reliably create/drop
|
|
temporary tables in PL/PgSQL functions?</H4>
|
|
<P>PL/PgSQL caches function contents, and an unfortunate side effect
|
|
is that if a PL/PgSQL function accesses a temporary table, and that
|
|
table is later dropped and recreated, and the function called
|
|
again, the function will fail because the cached function contents
|
|
still point to the old temporary table. The solution is to use
|
|
<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.23">4.23</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>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>
|
|
|
|
<HR>
|
|
|
|
<H2 align="center">Extending PostgreSQL</H2>
|
|
|
|
<H4><A name="5.1">5.1</A>) I wrote a user-defined function. When I
|
|
run it in <I>psql</I>, why does it dump core?</H4>
|
|
|
|
<P>The problem could be a number of things. Try testing your
|
|
user-defined function in a stand-alone test program first.</P>
|
|
|
|
<H4><A name="5.2">5.2</A>) How can I contribute some nifty new
|
|
types and functions to PostgreSQL?</H4>
|
|
|
|
<P>Send your extensions to the <I>pgsql-hackers</I> mailing list,
|
|
and they will eventually end up in the <I>contrib/</I>
|
|
subdirectory.</P>
|
|
|
|
<H4><A name="5.3">5.3</A>) How do I write a C function to return a
|
|
tuple?</H4>
|
|
|
|
<P>In versions of PostgreSQL beginning with 7.3, table-returning
|
|
functions are fully supported in C, PL/PgSQL, and SQL. See the
|
|
Programmer's Guide for more information. An example of a
|
|
table-returning function defined in C can be found in
|
|
<I>contrib/tablefunc</I>.</P>
|
|
|
|
<H4><A name="5.4">5.4</A>) I have changed a source file. Why does
|
|
the recompile not see the change?</H4>
|
|
|
|
<P>The <I>Makefiles</I> do not have the proper dependencies for
|
|
include files. You have to do a <I>make clean</I> and then another
|
|
<I>make</I>. If you are using <SMALL>GCC</SMALL> you can use the
|
|
<I>--enable-depend</I> option of <I>configure</I> to have the
|
|
compiler compute the dependencies automatically.</P>
|
|
</BODY>
|
|
</HTML>
|
|
|