mirror of
https://github.com/postgres/postgres.git
synced 2025-09-05 02:22:28 +03:00
1068 lines
55 KiB
HTML
1068 lines
55 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
|
<title>PostgreSQL FAQ</title>
|
|
</head>
|
|
<body bgcolor="#FFFFFF" text="#000000" link="#FF0000" vlink="#A00000" alink="#0000FF">
|
|
|
|
<h1>Häufig gestellte Fragen (FAQ) zu PostgreSQL</h1>
|
|
|
|
<p>Current maintainer: Bruce Momjian (<a href="mailto:bruce@momjian.us">bruce@momjian.us</a>).</p>
|
|
|
|
<p>Deutsche Übersetzung von Ian Barwick (<a href="mailto:barwick@gmail.com">barwick@gmail.com</a>).</p>
|
|
|
|
<p>Letzte Aktualisierung der deutschen Übersetzung: Fr., den 19.10.2007, 17:00 MEZ</p>
|
|
|
|
<p>Die aktuellste Version dieses Dokuments liegt auf der PostgreSQL-Website:</p>
|
|
<ul>
|
|
<li><a href="http://www.postgresql.org/docs/faqs.FAQ.html">http://www.postgresql.org/docs/faqs.FAQ.html</a> (engl.)</li>
|
|
<li><a href="http://www.postgresql.org/docs/faqs.FAQ_german.html">http://www.postgresql.org/docs/faqs.FAQ_german.html</a> (dt.)</li>
|
|
</ul>
|
|
<p>Übersetzungen dieses Dokuments in anderen Sprachen sowie plattform-
|
|
spezifische FAQs können unter
|
|
<a href="http://www.postgresql.org/docs/faq/">http://www.postgresql.org/docs/faq/</a>
|
|
eingesehen werden.</p>
|
|
|
|
<hr />
|
|
|
|
<h2 align="center">Allgemeine Fragen</h2>
|
|
|
|
<a href="#1.1">1.1</a>) Was ist PostgreSQL? Wie wird es ausgesprochen?<br />
|
|
<a href="#1.2">1.2</a>) Wer kontrolliert PostgreSQL?<br />
|
|
<a href="#1.3">1.3</a>) Welchem Copyright unterliegt PostgreSQL?<br />
|
|
<a href="#1.4">1.4</a>) Auf welchen Plattformen läuft PostgreSQL?<br />
|
|
<a href="#1.5">1.5</a>) Woher bekomme ich PostgreSQL?<br />
|
|
<a href="#1.6">1.6</a>) Was ist die neueste Version von PostgreSQL?<br />
|
|
<a href="#1.7">1.7</a>) Wo bekomme ich Support für PostgreSQL?<br />
|
|
<a href="#1.8">1.8</a>) Wie kann ich einen Fehlerbericht abgeben?<br />
|
|
<a href="#1.9">1.9</a>) Wie erfahre ich von bekannten Bugs oder fehlenden Features?<br />
|
|
<a href="#1.10">1.10</a>) Welche Dokumentation ist für PostgreSQL verfügbar?<br />
|
|
<a href="#1.11">1.11</a>) Wie kann ich SQL lernen?<br />
|
|
<a href="#1.12">1.12</a>) Wie kann ich im Entwicklerteam mitarbeiten?<br />
|
|
<a href="#1.13">1.13</a>) Wie läuft PostgreSQL im Vergleich zu anderen Datenbanksystemen?<br />
|
|
<a href="#1.14">1.14</a>) Kommt PostgreSQL mit den Anpassungen der Sommerzeit in verschiedenen Ländern klar?<br />
|
|
|
|
<h2 align="center">Fragen zu Benutzerprogrammen</h2>
|
|
|
|
<a href="#2.1">2.1</a>) Welche Schnittstellen gibt es für PostgreSQL?<br />
|
|
|
|
<a href="#2.2">2.2</a>) Wie kann man PostgreSQL mit einer Website nutzen?<br />
|
|
<a href="#2.3">2.3</a>) Hat PostgreSQL eine grafische Benutzerschnittstelle?<br />
|
|
|
|
<h2 align="center">Administrative Fragen</h2>
|
|
|
|
<a href="#3.1">3.1</a>) Wie installiere ich PostgreSQL woanders als in /usr/local/pgsql?<br />
|
|
<a href="#3.2">3.2</a>) Wie regle ich Zugriffe von anderen Rechnern?<br />
|
|
<a href="#3.3">3.3</a>) Wie kann ich eine bessere Performanz erreichen?<br />
|
|
<a href="#3.4">3.4</a>) Welche Debugging-Funktionen sind für PostgreSQL verfügbar?<br />
|
|
<a href="#3.5">3.5</a>) Ich bekomme die Meldung "<em>Sorry, too many clients</em>", wenn ich eine Verbindung aufzubauen versuche. Warum?<br />
|
|
<a href="#3.6">3.6</a>) Wie wird PostgreSQL aktualisiert?<br />
|
|
<a href="#3.7">3.7</a>) Welche Hardware eignet sich für den Betrieb mit PostgreSQL?<br />
|
|
|
|
<h2 align="center">Fragen zum Betrieb</h2>
|
|
|
|
<a href="#4.1">4.1</a>) Wie wähle ich per <small>SELECT</small>-Anweisung nur die ersten paar
|
|
Zeilen bzw. eine beliebige Zeile in einer Abfrage aus?<br />
|
|
<a href="#4.2">4.2</a>) Wie finde ich heraus, welche Tabellen, Indexe, Datenbanken oder
|
|
Benutzer in der Datenbank definiert sind? Wie bekomme ich die von <em>psql</em> verwendeten
|
|
Abfragen?<br />
|
|
<a href="#4.3">4.3</a>) Wie ändere ich den Datentyp einer Spalte?<br />
|
|
<a href="#4.4">4.4</a>) Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine Datenbank?<br />
|
|
<a href="#4.5">4.5</a>) Wieviel Plattenplatz wird benötigt, um die Daten aus einer typischen
|
|
Textdatei abzuspeichern?<br />
|
|
<a href="#4.6">4.6</a>) Meine Abfragen sind langsam oder benutzen die Indexe nicht. Warum?<br />
|
|
<a href="#4.7">4.7</a>) Auf welche Weise kann ich sehen, wie der Abfrage-Optimierer meine
|
|
Abfrage auswertet?<br />
|
|
<a href="#4.8">4.8</a>) Wie verfahre ich bei der Suche mit regulären Ausdrücken und bei einer
|
|
Suche, bei der Groß- und Kleinschreibweisen ignoriert werden? Wie verwende
|
|
ich einen Index bei solchen Suchabfragen?<br />
|
|
<a href="#4.9">4.9</a>) Wie ermittle ich in einer Abfrage, ob ein Feld NULL ist?<br />
|
|
<a href="#4.10">4.10</a>) Was ist der Unterschied zwischen den verschiedenen <small>CHAR</small>-Typen?<br />
|
|
|
|
<a href="#4.11.1">4.11.1</a>) Wie erzeuge ich ein serielles Feld mit automatischer Erhöhung des Wertes?<br />
|
|
<a href="#4.11.2">4.11.2</a>) Wie bekomme ich den Wert einer SERIAL-Sequenz?<br />
|
|
<a href="#4.11.3">4.11.3</a>) Führt currval() zu einer Race-Condition mit anderen Nutzern?<br />
|
|
<a href="#4.11.4">4.11.4</a>) Warum werden die Sequenzwerte nach einem Transaktionsabbruch nicht
|
|
zurückgesetzt? Warum gibt es Lücken in der Nummerierung meiner
|
|
Sequenz-/<small>SERIAL</small>-Spalte?<br />
|
|
<a href="#4.12">4.12</a>) Was ist ein <small>OID</small>? Was ist ein <small>CTID</small>?<br />
|
|
<a href="#4.13">4.13</a>) Wieso bekomme ich den Fehler: "<em>FATAL: Memory exhausted in AllocSetAlloc()</em>"?<br />
|
|
<a href="#4.14">4.14</a>) Wie kann ich feststellen, welche PostgreSQL-Version bei mir läuft?<br />
|
|
<a href="#4.15">4.15</a>) Wie kann ich eine Spalte erstellen, deren Default-Wert immer
|
|
die aktuelle Uhrzeit enthalten soll?<br />
|
|
<a href="#4.16">4.16</a>) Wie führe ich eine <small>OUTER JOIN</small> durch?<br />
|
|
<a href="#4.17">4.17</a>) Wie kann ich Abfragen über mehrere Datenbanken hinweg ausführen?<br />
|
|
<a href="#4.18">4.18</a>) Wie kann ich mehrere Zeilen bzw. Spalten von einer Funktion
|
|
zurückgeben lassen?<br />
|
|
<a href="#4.19">4.19</a>) Warum bekomme ich eine Fehlermeldung wie <br />
|
|
"relation with OID ##### does not exist" wenn ich temporäre Tabellen in<br />
|
|
PL/PgSQL-Funktionen benutze?<br />
|
|
<a href="#4.20">4.20</a>) Welche Replikationslösungen gibt es?<br />
|
|
<a href="#4.21">4.21</a>) Warum werden die Tabellen- und Spaltennamen in meiner
|
|
Abfrage nicht erkannt? Warum werden Großbuchstaben umgewandelt?<br />
|
|
|
|
<hr />
|
|
|
|
<h2 align="center">Allgemeine Fragen</h2>
|
|
<h3><a name="1.1">1.1</a>) Was ist PostgreSQL? Wie wird es ausgesprochen?</h3>
|
|
<p>Die (englische) Aussprache ist "Post-Gres-Q-L". Im allgemeinen
|
|
Sprachgebrauch hat sich die Kurzform "Postgres" auch durchgesetzt.
|
|
(Für diejenigen, die es interessiert: eine MP3-Datei mit der amerikanischen
|
|
Aussprache befindet sich hier:
|
|
<a href="http://www.postgresql.org/files/postgresql.mp3">http://www.postgresql.org/files/postgresql.mp3</a>
|
|
</p>
|
|
|
|
<p>PostgreSQL ist ein objektrelationales Datenbanksystem, das die
|
|
Vorzüge von kommerziellen Datenbanksystemen mit zukunftsweisenden
|
|
Innovationen kombiniert. PostgreSQL ist freie Software und dessen
|
|
kompletter Quellcode ist öffentlich verfügbar.</p>
|
|
|
|
<p>Die PostgreSQL-Entwicklung wird von einem Team von meist freiwilligen
|
|
Entwicklern durchgeführt.
|
|
Dieses Team ist für die Gesamtentwicklung von PostgreSQL
|
|
verantwortlich. Es handelt sich um ein Gemeinschaftsprojekt, das nicht
|
|
von einer bestimmten Firma kontrolliert wird. Lesen Sie die Entwickler-FAQ:
|
|
<a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html">http://www.postgresql.org/docs/faqs.FAQ_DEV.html</a>
|
|
wenn Sie an einer Mitarbeit interessiert sind.</p>
|
|
|
|
|
|
<h3><a name="1.2">1.2</a>) Wer kontrolliert PostgreSQL?</h3>
|
|
|
|
<p>Falls Sie nach dem Namen eines etwaigen Inhabers bzw. nach einem
|
|
allmächtigen Zentralkommittee suchen - sparen Sie sich die Mühe, sowas
|
|
existiert gar nicht. Es gibt zwar das "Core Committee" sowie Entwickler,
|
|
die CVS-Schreibberechtigung haben, jedoch haben diese Gruppen eher nur eine
|
|
administrative Rolle. Das Projekt wird durch die Community gesteuert, die
|
|
aus den Entwicklern sowie natürlich auch den Nutzern besteht - jeder
|
|
kann daran teilnehmen. (Lesen Sie die Entwickler-FAQ:
|
|
<a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html">http://www.postgresql.org/docs/faqs.FAQ_DEV.html</a>
|
|
wenn Sie an der PostgreSQL-Entwicklung teilnehmen möchten).</p>
|
|
|
|
<h3><a name="1.3">1.3</a>) Welchem Copyright unterliegt PostgreSQL?</h3>
|
|
|
|
<p>PostgreSQL wird unter der klassischen BSD-Lizenz herausgegeben. Im Grunde
|
|
genommen erlaubt diese den Nutzern, beliebig mit dem Code umzugehen,
|
|
auch der Weiterverkauf von Binärversionen ohne Quellcode ist erlaubt.
|
|
Die einzige Einschränkung besteht darin, dass PostgreSQL auf keinen Fall
|
|
für etwaige Probleme mit der Software haftet. Außerdem muß der Copyright-
|
|
Text in allen Kopien der Software enthalten sein. Dies ist der Originaltext
|
|
der BSD-Lizenz:</p>
|
|
|
|
<p>PostgreSQL Data Base Management System</p>
|
|
|
|
<P>Portions Copyright (c) 1996-2008, 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>Es gilt die Copyright-Klausel im Original!</p>
|
|
|
|
<h3><a name="1.4">1.4</a>) Auf welchen Plattformen läuft PostgreSQL?</h3>
|
|
|
|
<p>Normalerweise kann PostgreSQL auf jeder modernen UNIX-kompatiblen
|
|
Plattform eingesetzt werden. Diejenigen Plattformen, die bei der
|
|
jeweiligen Versionsfreigabe getestet wurden, sind in den
|
|
Installationsanleitungen aufgelistet.</p>
|
|
|
|
<p>PostgreSQL läuft auch auf Microsoft NT-basierten Betriebssystemen
|
|
wie Windows 2000 SP4, XP und Server 2003. Ein vorgefertigtes Installationspaket
|
|
kann von <a href="http://pgfoundry.org/projects/pginstaller">http://pgfoundry.org/projects/pginstaller</a> heruntergeladen werden.
|
|
DOS-basierte Windows-Versionen (Win95, Win98, WinMe) können PostgreSQL nur mit
|
|
Hilfe der Cygwin-Umgebung ausführen.</p>
|
|
|
|
<p>Eine Portierung für Novell Netware 6 gibt es unter <a href="http://forge.novell.com">http://forge.novell.com</a> sowie eine OS/2 (eComStation) version unter
|
|
<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>
|
|
|
|
<h3><a name="1.5">1.5</a>) Woher bekomme ich PostgreSQL?</h3>
|
|
|
|
<p>Per Web-Browser hier: <a href="http://www.postgresql.org/ftp/">http://www.postgresql.org/ftp/</a>
|
|
und per FTP hier: <a href="ftp://ftp.postgresql.org/pub/">ftp://ftp.postgresql.org/pub/</a>.</p>
|
|
|
|
<h3><a name="1.6">1.6</a>) Was ist die neueste Version von PostgreSQL?</h3>
|
|
|
|
<p>Die neueste Version von PostgreSQL ist 8.2.5.</p>
|
|
|
|
<p>Die Freigabe einer neuen Hauptversion erfolgt in der Regel jährlich, kleinere
|
|
Korrekturversionen alle paar Monaten.</p>
|
|
|
|
|
|
<h3><a name="1.7">1.7</a>) Wo bekomme ich Support für PostgreSQL?</h3>
|
|
|
|
<p>Die PostgreSQL-Community bietet Unterstützung per Mailing-Liste. Die Web-Seite
|
|
<a href="http://www.postgresql.org/community/lists/">http://www.postgresql.org/community/lists/</a> bietet einen Überblick.
|
|
Die Listen <i>general</i> und <i>bugs</i> bieten einen guten Einstieg.</p>
|
|
|
|
<p>Eine deutschsprachige Mailing-Liste gibt es hier:
|
|
<a href="http://archives.postgresql.org/pgsql-de-allgemein/">http://archives.postgresql.org/pgsql-de-allgemein/</a>.</p>
|
|
|
|
<p>Der wichtigsten IRC-Channel ist <em>#postgresql</em> auf Freenode
|
|
(<em>irc.freenode.net</em>). Unter UNIX/Linux können Sie mit z.B.
|
|
<small>irc -c '#postgresql' "$USER" irc.freenode.net.</small>
|
|
daran teilnehmen. Auf Freenode gibt es einen spanischsprachigen Channel
|
|
<em>#postgresql-es</em>, einen französischen, <em>#postgresqlfr</em> sowie einen brasilianischen, <em>#postgresql-br</em> .
|
|
Es gibt außerdem einen PostgreSQL-Channel bei EFNet.</p>
|
|
|
|
<p>Eine Liste von Unternehmen, die Support für PostgreSQL auf kommerzieller
|
|
Basis leisten, kann unter
|
|
<a href="http://www.postgresql.org/support/professional_support">http://www.postgresql.org/support/professional_support</a>
|
|
eingesehen werden.</p>
|
|
|
|
|
|
<h3><a name="1.8">1.8</a>) Wie kann ich einen Fehlerbericht abgeben?</h3>
|
|
|
|
<p>Nutzen Sie das Formular unter <a href="http://www.postgresql.org/support/submitbug">http://www.postgresql.org/support/submitbug</a>.
|
|
Schauen Sie aber vorher unter <a href="ftp://ftp.postgresql.org/pub/">ftp://ftp.postgresql.org/pub/</a> nach,
|
|
ob es mittlerweile eine neuere PostgreSQL-Version gibt, in der der Fehler behoben wurde.</p>
|
|
|
|
<p>Bugs, die über das Formular bzw. eine der Mailing-Listen bekanntgegeben wurden,
|
|
erhalten typischerweise einer der folgenden Reaktionen:</p>
|
|
|
|
<ul>
|
|
<li>es ist kein Bug, der Grund wird benannt</li>
|
|
<li>es ist ein bereits bekannter Bug, der bereits auf der
|
|
<a href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</a>-Liste aufgenommen wurde</li>
|
|
<li>der Bug wurde in der aktuellen Version behoben</li>
|
|
|
|
<li>der Bug wurde bereits behoben, befindet sich aber noch nicht in
|
|
einer offiziell veröffentlichten Version</li>
|
|
<li>es wird um eingehendere Informationen gebeten, z.B.:
|
|
<ul>
|
|
<li>Betriebssystem</li>
|
|
<li>PostgreSQL-Version</li>
|
|
<li>reproduzierbarer Fallbeispiel</li>
|
|
<li>Debugging-Information</li>
|
|
<li>Debugger-Backtrace-Ausgabe</li>
|
|
</ul>
|
|
</li>
|
|
<li>der Bug ist neu. Folgendes könnte passieren:
|
|
<ul>
|
|
<li>ein Patch wird erstellt und in der nächsten Version
|
|
eingebaut;</li>
|
|
<li>oder der Bug kann nicht sofort behoben werden und wird auf die
|
|
<a href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</a>-Liste gesetzt</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
|
|
<h3><a name="1.9">1.9</a>) Wie erfahre ich von bekannten Bugs oder fehlenden Features?</h3>
|
|
|
|
<p>PostgreSQL unterstützt eine erweiterte Teilmenge von SQL:2003. Siehe
|
|
unsere TODO-Liste unter <a href="http://www.postgresql.org/docs/faqs.TODO.html">http://www.postgresql.org/docs/faqs.TODO.html</a> für eine Auflistung
|
|
der bekannten Bugs, fehlenden Features und zukünftigen Pläne.</p>
|
|
|
|
<p>Eine Anfrage nach einem neuen Feature führt normalerweise zu einer der
|
|
folgenden Antworten:</p>
|
|
<ul>
|
|
<li>das Feature ist bereits auf der <a href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</a>-Liste</li>
|
|
<li>das Feature ist nicht wünschenswert, weil:
|
|
<ul>
|
|
<li>es vorhandene Funktionalität dupliziert, welche bereits dem
|
|
SQL-Standard folgt</li>
|
|
<li>es würde die Komplexität der Code-Basis erhöhen, ohne nennenswerte
|
|
Vorteile zu bringen</li>
|
|
<li>es wäre unsicher bzw. unzuverlässig</li>
|
|
</ul>
|
|
</li>
|
|
<li>das neue Feature wird der <a href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</A>-Liste hinzugefügt</li>
|
|
|
|
</ul>
|
|
|
|
<p>PostgreSQL verwendet kein Bugtracking-System, da es sich als effizienter
|
|
erwiesen hat, E-Mails direkt zu beantworten und die <a href="http://www.postgresql.org/docs/faqs.TODO.html">TODO</a>-Liste
|
|
aktuell zu halten. In der Praxis werden Bugs sehr schnell beseitigt, und
|
|
diejenigen Bugs, die Auswirkungen auf eine große Anzahl von Nutzern haben,
|
|
werden meist kurzfristig korrigiert. Der einzige Überblick über alle Änderungen,
|
|
Verbesserungen und Korrekturen in einer PostgreSQL-Version befindet sich in
|
|
den <a href="http://www.postgresql.org/developer/sourcecode/">CVS</a>-Log-Meldungen.
|
|
Auch die Release-Notes listen nicht jede Änderung in der Software auf.</p>
|
|
|
|
<h3><a name="1.10">1.10</a>) Welche Dokumentation ist für PostgreSQL verfügbar?</h3>
|
|
|
|
<p>PostgreSQL bietet umfangreiche Dokumentation, darunter ein großes
|
|
Handbuch, man-Pages und einige kleine Testprogramme. Siehe das <em>/doc</em>-
|
|
Verzeichnis. Ausserdem sind alle Handbücher online unter <a href="http://www.postgresql.org/docs/">http://www.postgresql.org/docs/</a>
|
|
verfügbar.</p>
|
|
|
|
<p>Zwei Bücher zu PostgreSQL sind online verfügbar unter
|
|
<a href="http://www.postgresql.org/docs/books/awbook.html">http://www.postgresql.org/docs/books/awbook.html</a> und
|
|
<a href="http://www.commandprompt.com/ppbook/">http://www.commandprompt.com/ppbook/</a> .</p>
|
|
|
|
<p>Eine Liste lieferbarer PostgreSQL-Bücher befindet sich unter
|
|
<a href="http://www.postgresql.org/docs/books">http://www.postgresql.org/docs/books</a>
|
|
Diverse technische Artikel befinden sich unter
|
|
<a href="http://www.postgresql.org/docs/techdocs">http://www.postgresql.org/docs/techdocs</a> .</p>
|
|
|
|
<p><em>psql</em> hat einige nützliche <em>\d</em>-Befehle, um Informationen über Typen,
|
|
Operatoren, Funktionen, Aggregate, usw. zu zeigen. </p>
|
|
|
|
<p>Die PostgreSQL-Website enthält noch mehr Dokumentation.</p>
|
|
|
|
|
|
<h3><a name="1.11">1.11</a>) Wie kann ich <small>SQL</small> lernen?</h3>
|
|
|
|
<p>Die oben erwähnten PostgreSQL-spezifische Bücher bieten einen guten Einstieg.
|
|
Viele PostgreSQL-Anwender mögen "The Practical SQL Handbook" (Bowman
|
|
et al., Addison Wesley). Andere dagegen mögen "The Complete Reference SQL"
|
|
(Groff et al., McGraw-Hill).</p>
|
|
|
|
<p>Es gibt ausserdem einige nützliche Online-Tutorials:</p>
|
|
<ul>
|
|
<li><a href="http://www.intermedia.net/support/sql/sqltut.shtm">http://www.intermedia.net/support/sql/sqltut.shtm</a></li>
|
|
<li><a href="http://sqlcourse.com/">http://sqlcourse.com</a></li>
|
|
<li><a href="http://www.w3schools.com/sql/default.asp">http://www.w3schools.com/sql/default.asp</a></li>
|
|
<li><a href="http://mysite.verizon.net/Graeme_Birchall/id1.html">http://mysite.verizon.net/Graeme_Birchall/id1.html</a></li>
|
|
</ul>
|
|
|
|
<h3><a name="1.12">1.12</a>) Wie kann ich im Entwicklerteam mitarbeiten?</h3>
|
|
|
|
<p>Lesen Sie in der Entwickler-FAQ unter <a href="http://www.postgresql.org/docs/faqs.FAQ_DEV.html">http://www.postgresql.org/docs/faqs.FAQ_DEV.html</a> nach.
|
|
|
|
<h3><a name="1.13">1.13</a>) Wie läuft PostgreSQL im Vergleich zu anderen Datenbanksystemen?</h3>
|
|
|
|
<p>Es gibt verschiedene Methoden, Software zu messen: Eigenschaften,
|
|
Performanz, Zuverlässigkeit, Support und Preis.</p>
|
|
|
|
<dl>
|
|
<dt><b>Eigenschaften</b></dt>
|
|
<dd><p>PostgreSQL besitzt die meisten Eigenschaften - wie Transaktionen,
|
|
Unterabfragen (Subqueries), Trigger, Views, referenzielle Integrität bei Fremdschlüsseln und verfeinertes Locking -
|
|
die bei großen kommerziellen DBMS vorhanden sind. Es bietet außerdem
|
|
einige anderen Eigenschaften, die diese nicht immer haben, wie
|
|
benutzerbestimmte Typen, Vererbung, Regeln, und die
|
|
Multi-Versionen-Steuerung zum Verringern konkurrierender Locks.</p>
|
|
</dd>
|
|
|
|
<dt><b>Performanz</b></dt>
|
|
|
|
<dd><p>Die Performanz von PostgreSQL ist mit der von kommerziellen
|
|
und anderen Open-Source-Datenbanken vergleichbar. In manchen
|
|
Bereichen ist es schneller, in anderen langsamer. In der Regel
|
|
beträgt der Unterschied +/-10%.</p>
|
|
</dd>
|
|
|
|
<dt><b>Zuverlässigkeit</b></dt>
|
|
<dd><p>Es ist selbstredend, dass ein DBMS wertlos ist, wenn es nicht
|
|
zuverlässig arbeitet. Daher bemühen wir uns, nur streng geprüften und
|
|
beständigen Code freizugeben, der nur ein Minimum an Programmfehlern
|
|
aufweist. Jede Freigabe hat mindestens einen Monat Betatest-Phase
|
|
hinter sich, und unsere Freigabehistorie beweist, dass wir stabile und
|
|
solide Versionen freigeben, die im Produktionsbetrieb genutzt werden
|
|
können. Wir glauben, dass wir im Vergleich mit anderer
|
|
Datenbanksoftware vorteilhaft dastehen.</p>
|
|
</dd>
|
|
|
|
<dt><b>Support</b></dt>
|
|
|
|
<dd><p>Unsere Mailinglisten bieten die Möglichkeit, gemeinsam mit einer
|
|
großen Gruppe von Entwicklern und Benutzern mögliche Probleme
|
|
zu lösen. Wir können nicht immer eine Fehlerbehebung
|
|
garantieren, kommerzielle DBMS tun dies aber auch nicht.
|
|
Der direkte Kontakt zur Entwickler- und Benutzergemeinschaft und der
|
|
Zugriff auf die Handbücher und den Quellcode ermöglicht einen
|
|
im Vergleich zu anderen DBMS höherwertigeren Support. Es gibt jedoch auch
|
|
Anbieter von kommerziellen Support-Leistungen (siehe FAQ-Punkt <a href="#1.7">1.7</a>).</p>
|
|
</dd>
|
|
<dt><b>Preis</b></dt>
|
|
<dd><p>PostgreSQL ist frei verfügbar, sowohl für die kommerzielle wie
|
|
auch für die nicht-kommerzielle Nutzung. Sie können den PostgreSQL-Code
|
|
ohne Einschränkungen (außer denjenigen, die in der oben angegebene
|
|
BSD-artigen Lizenz erwähnt werden) in Ihr Produkt integrieren.</p>
|
|
</dd>
|
|
</dl>
|
|
|
|
<h3><a name="1.14">1.14</a>) Kommt PostgreSQL mit den Anpassungen der Sommerzeit in verschiedenen Ländern klar?</h3>
|
|
|
|
<p>Änderungen bei der US-Sommerzeit sind ab PostgreSQL Version 8.0.4
|
|
berücksichtigt. Änderungen in Canada und Western Australia sind ab 8.0.10
|
|
bzw. 8.1.6 berücksichtigt. PostgreSQL-Versionen vor 8.0 nutzen die
|
|
Zeitzonendatenbank des Betriebssystems, um die Sommerzeit zu berechnen.</p>
|
|
|
|
<h2 align="center">Fragen zu Benutzerprogrammen</h2>
|
|
|
|
<h3><a name="2.1">2.1</a>) Welche Schnittstellen gibt es für PostgreSQL?</h3>
|
|
|
|
<p>Die PostgreSQL-Installation stellt nur Schnittstellen für <code>C</code> und
|
|
<code>Embedded C</code> bereit. Alle weitere Schnittstellen sind unabhängige
|
|
Projekte, die einzeln heruntergeladen werden werden müssen. Diese Trennung
|
|
ermöglicht individuelle Entwickler-Teams und Entwicklungszyklen für die
|
|
jeweiligen Projekte.</p>
|
|
|
|
<p>Einige Programmiersprachen wie <code>PHP</code> haben eine PostgreSQL-
|
|
Schnittstelle bereits eingebaut. Schnittstellen für Sprachen wie <code>Perl</code>, <code>TCL</code>,
|
|
<code>Python</code> und viele anderen sind unter <a href="http://gborg.postgresql.org">http://gborg.postgresql.org</a>
|
|
im Bereich <em>Drivers/Interfaces</em> verfügbar sowie per Internet-Suche.</p>
|
|
|
|
|
|
<h3><a name="2.2">2.2)</a> Wie kann man PostgreSQL in einer Website nutzen?</H3>
|
|
<p>Eine nette Einführung zu datenbank-gestützten Webseiten kann unter
|
|
<a href="http://www.webreview.com"> http://www.webreview.com</a> (engl.) eingesehen werden.</p>
|
|
|
|
<p>Für die Web-Integration ist PHP eine ausgezeichnete Schnittstelle.
|
|
PHP gibt es bei <a href="http://www.php.net">http://www.php.net</a></p>
|
|
|
|
<p>Für komplexere Aufgaben bietet sich die Perl-Schnittstelle mit CGI.pm
|
|
oder mod_perl.</p>
|
|
|
|
<h3><a name="2.3">2.3</a>) Hat PostgreSQL eine grafische Benutzerschnittstelle?</h3>
|
|
|
|
<p>Es gibt eine große Anzahl von GUI-Programmen für PostgreSQL -
|
|
sowohl kommerziell als auch Open-Source. Eine ausführliche Liste
|
|
befindet sich unter <a href="http://www.postgresql.org/docs/techdocs.54">http://www.postgresql.org/docs/techdocs.54</a> .</p>
|
|
|
|
<hr />
|
|
|
|
<h2 align="center">Administrative Fragen</h2>
|
|
|
|
<h3><a name="3.1">3.1</a>) Wie installiere ich PostgreSQL woanders als in /usr/local/pgsql?</h3>
|
|
|
|
<p>Bei der Ausführung von <em>configure</em> die Option <em>--prefix</em> mit dem Zielverzeichnis
|
|
angeben.</p>
|
|
|
|
<h3><a name="3.2">3.2</a>) Wie regle ich Zugriffe von anderen Rechnern?</h3>
|
|
|
|
<p>PostgreSQL ist standardmäßig so eingestellt, dass Verbindungen nur vom
|
|
lokalen Rechner über Unix Domain Sockets bzw. TCP/IP möglich sind.
|
|
Verbindungen von anderen Rechnern werden erst dann ermöglicht, wenn Sie
|
|
in der Datei <em>postgresql.conf</em> die Einstellung <tt>listen_addresses</tt>
|
|
anpassen, in der Datei <em>$PGDATA/pg_hba.conf</em> host-basierte
|
|
Authentifizierung einschalten und den Server neu starten.</p>
|
|
|
|
<h3><a name="3.3">3.3</a>) Wie kann ich eine bessere Performanz erreichen?</h3>
|
|
|
|
<p>Es gibt drei große Bereiche, in denen Performanzverbesserungen
|
|
erzielt werden können:</p>
|
|
|
|
<dl>
|
|
<dt><b>Abfrageoptimierung</b></dt>
|
|
|
|
<dd>Die Modifizierung von Abfragen kann eine bessere Performanz
|
|
erzielen:
|
|
<ul>
|
|
|
|
<li>Erstellung von Indexen, einschliesslich partieller Indexe
|
|
sowie Expressionsindexe</li>
|
|
<li>Einsatz von <tt>COPY</tt> anstelle multipler <tt>INSERT</tt>-Anweisungen</li>
|
|
<li>Gruppierung von mehreren Abfragen innerhalb einer Transaktion,
|
|
um Aufwand beim Abschluss von Transaktionen einzusparen</li>
|
|
<li>Einsatz von <tt>CLUSTER</tt> beim Holen von einer großen Anzahl
|
|
von Datenreihen aus einem Index</li>
|
|
<li>Einsatz von <tt>LIMIT</tt>, um eine Untermenge der Abfragen-
|
|
ergebnisse zurückzuliefern</li>
|
|
<li>Einsatz von vorbereiteten Befehlen (prepared queries)</li>
|
|
<li>Einsatz von <tt>ANALYZE</tt>, um die Datenbankstatistik für
|
|
den Abfragenplaner aktuell zu halten</li>
|
|
<li>Regelmäßiger Einsatz von <tt>VACUUM</tt> bzw. <em>pg_autovacuum</em></li>
|
|
<li>Bei großen Datenveränderungen die Löschung von Indexen</li>
|
|
</ul><br/>
|
|
|
|
<br/>
|
|
</dd>
|
|
|
|
<dt><b>Server-Konfiguration</b></dt>
|
|
|
|
<dd>Einige Einstellungen in der Datei <em>postgresql.conf</em>
|
|
|
|
wirken auf die Performanz aus. Das Handbuch enthält unter
|
|
<a href="http://www.postgresql.org/docs/current/static/runtime-config.html">http://www.postgresql.org/docs/current/static/runtime-config.html</a> eine
|
|
komplette Auflistung. Kommentare zu den jeweiligen Einstellungen
|
|
gibt es unter
|
|
<a href="http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html">http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html</a>
|
|
und <a href="http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html">http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html</a>.
|
|
<br/>
|
|
<br/>
|
|
</dd>
|
|
|
|
<dt><b>Hardware-Auswahl</b></dt>
|
|
|
|
<dd>Die Auswirkung von Hardware auf Performanz wird unter
|
|
<a href="http://momjian.us/main/writings/pgsql/hw_performance/index.html">http://momjian.us/main/writings/pgsql/hw_performance/index.html</a> und
|
|
<a href="http://www.powerpostgresql.com/PerfList/">http://www.powerpostgresql.com/PerfList/</a> erläutert.
|
|
<br/>
|
|
<br/>
|
|
</dd>
|
|
|
|
</dl>
|
|
|
|
<h3><a name="3.4">3.4</a>) Welche Debugging-Funktionen sind für PostgreSQL verfügbar?</h3>
|
|
|
|
<p>Unter den Optionen für die Server-Konfigurierung gibt es zahlreiche
|
|
<tt>log_*</tt>-Variablen, die die Ausgabe von Abfrage- und Prozessstatistiken
|
|
ermöglichen. Diese können für Debugging-Zwecke sowie Performanz-Tests sehr
|
|
nützlich sein.</p>
|
|
|
|
<h3><a name="3.5">3.5</a>) Ich bekomme die Meldung "<em>Sorry, too many clients</em>", wenn ich eine
|
|
Verbindung aufzubauen versuche. Warum?</h3>
|
|
|
|
<p>Ihr System hat die maximal zulässige Anzahl von Datenbankverbindungen
|
|
erreicht (Voreinstellung 100). Sie müssen die maximale Anzahl der
|
|
gleichzeitig ausführbaren Backend-Prozesse hochsetzen, indem Sie in
|
|
<em>postgresql.conf</em> den Wert <tt>max_connections</tt> ändern und
|
|
den Server neustarten.</p>
|
|
|
|
|
|
<h3><a name="3.6">3.6</a>) Wie wird PostgreSQL aktualisiert?</h3>
|
|
|
|
<p>Allgemeine Informationen zur Aktualisierung von PostgreSQL gibt es auf der
|
|
Seite <a href="http://www.postgresql.org/support/versioning">http://www.postgresql.org/support/versioning</a>.
|
|
Detaillierte technische Informationen gibt es auf der Seite
|
|
<a href="http://www.postgresql.org/docs/current/static/install-upgrading.html">http://www.postgresql.org/docs/current/static/install-upgrading.html</a>
|
|
</p>
|
|
|
|
<!--
|
|
<p>Zwischen "kleinen" PostgreSQL-Versionsänderungen (z.B. zwischen
|
|
7.4.8 und 7.4.9) werden nur Bugs behoben, wodurch ein erneutes Aus-
|
|
und Einlesen der Daten nicht erforderlich ist. Es müssen lediglich die
|
|
neue Software installiert sowie der Server neugestartet werden.</p>
|
|
|
|
<p>Alle Nutzer sollten sobald wie möglich die neueste "kleine"
|
|
Version installieren. Zwar birgt eine Server-Aktualisierung immer
|
|
einige Risiken, doch die "kleinen" Versionsänderungen zielen darauf,
|
|
mit dem kleinsten Risiko die häufigsten Bugs zu beheben. Allgemein
|
|
wird es als riskanter betrachtet, <em>nicht</em> zu aktualisieren
|
|
als zu aktualisieren.</p>
|
|
|
|
<p>Bei "großen" Versionsänderungen (z.B. zwischen 7.3 und 7.4) wird
|
|
oft das interne Format der Systemtabellen und Datendateien
|
|
angepasst. Diese Änderungen sind oft sehr komplex, wodurch die
|
|
Rückwärtskompatibilität der Datendateien nicht gewährleistet werden kann.
|
|
Bei der Aktualisierung zwischen "großen" Versionen muss die
|
|
Datenbank exportiert und neu importiert werden.</p>
|
|
-->
|
|
<h3><a name="3.7">3.7</a>) Welche Hardware eignet sich für den Betrieb mit PostgreSQL?</h3>
|
|
|
|
<p>PostgreSQL läuft auf fast jeder Hardware-Kombination. Im PC-Bereich
|
|
gibt es allerdings sehr große Abweichungen in der Qualität. Für einen
|
|
Arbeitsplatz- oder Entwicklungsrechner mag dies nicht so bedeutend sein,
|
|
im Server-Betrieb jedoch lohnt sich auf jeden Fall die Investition
|
|
in teurere Bestandteile (Stichwörter ECC-Speicher, SCSI, Hauptplatinen
|
|
und Netzteile von namhaften Herstellern). Nutzen Sie unsere Mailing-Listen,
|
|
um Hardware-Optionen zu diskutieren.
|
|
</p>
|
|
|
|
<hr />
|
|
|
|
<h2 align="center">Fragen zum Betrieb</h2>
|
|
|
|
<h3><a name="4.1">4.1</a>) Wie wähle ich per <small>SELECT</small>-Anweisung nur die ersten paar
|
|
Zeilen bzw. eine beliebige Zeile in einer Abfrage aus?</h3>
|
|
|
|
<p>Wenn Sie bei der Ausführung der Abfrage die Anzahl der anzufordenden
|
|
Reihen bereits kennen, nutzen Sie <tt>LIMIT</tt>. Wenn die <tt>ORDER BY</tt>-
|
|
Anweisung mit einem Index verwendet wird, ist es möglich, dass die
|
|
gesamte Abfrage nicht ausgeführt werden muss. Wenn Sie die Anzahl der
|
|
der anzufordenden Reihen nicht kennen, verwenden Sie einen Cursor
|
|
und <tt>FETCH</tt>.
|
|
|
|
<p>Um eine beliebige Zeile auszuwählen, nutzen Sie <small>ORDER BY random()</small>:</p>
|
|
<pre>
|
|
SELECT spalte
|
|
FROM tabelle
|
|
ORDER BY random()
|
|
LIMIT 1
|
|
</pre>
|
|
|
|
<h3><a name="4.2">4.2</a>) Wie finde ich heraus, welche Tabellen, Indexe, Datenbanken oder
|
|
Benutzer in der Datenbank definiert sind? Wie bekomme ich die von <em>psql</em> verwendeten Abfragen?</h3>
|
|
|
|
<p>In psql zeigt der Befehl \dt eine Liste der Datenbanktabellen. Weitere psql-Befehle
|
|
lassen sich mit \? anzeigen. Sie können sich die Datei <em>pgsql/src/bin/psql/describe.c</em>
|
|
mit dem Quellcode für <em>psql</em> ansehen. Sie enthält die <small>SQL</small>-Abfragen, die die
|
|
Backslash-Kommandos (\) ausführen. Sie können <em>psql</em> auch mit der <em>-E</em>
|
|
Option starten. Danach gibt <em>psql</em> die Abfragen aus, die es bei der Ausführung der Befehle
|
|
benutzt. Außerdem biete PostgreSQL ein <small>SQL</small>-kompatibles INFORMATION SCHEMA,
|
|
das Metainformation über die Datenbank zur Verfügung stellt.</p>
|
|
|
|
<p>Mit <tt>psql -l</tt> können Sie alle Datenbanken anzeigen lassen.</p>
|
|
|
|
<p>Die Datei <em>pgsql/src/tutorial/syscat.source</em> enthält außerdem viele <small>SELECT</small>-
|
|
Abfragen, mit deren Hilfe man Information über die Systemtabellen erhalten kann.</p>
|
|
|
|
<h3><a name="4.3">4.3</a>) Wie ändere ich den Datentyp einer Spalte?</h3>
|
|
|
|
<p>Ab Version 8.0 kann der Datentyp einer Spalte mit <tt>ALTER TABLE ALTER COLUMN TYPE</tt>
|
|
geändert werden, sofern der neue Datentyp die Werte des alten Datentype aufnehmen
|
|
kann.</p>
|
|
|
|
<p>Bei früheren Versionen gehen Sie wie folgt vor:</p>
|
|
|
|
<pre>
|
|
BEGIN;
|
|
ALTER TABLE <em>tabelle</em> ADD COLUMN <em>neue_spalte</em> <em>neuer_datentyp</em>;
|
|
UPDATE <em>tabelle</em> SET <em>neue_spalte</em> = CAST(<em>alte_spalte</em> AS <em>neuer_datentyp</em>);
|
|
ALTER TABLE <em>tabelle</em> DROP COLUMN <em>alte_spalte</em>;
|
|
COMMIT;
|
|
</pre>
|
|
|
|
<p>Um den Speicherplatz freizugeben, der von der gelöschten Spalte verwendet
|
|
wurde, führen Sie <small>VACUUM FULL</small> aus.</p>
|
|
|
|
<h3><a name="4.4">4.4</a>) Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine Datenbank?</h3>
|
|
|
|
<p>Es bestehen folgende Obergrenzen:</p>
|
|
<pre>
|
|
Maximale Größe eine Datenbank? unbeschränkt (es existieren
|
|
Datenbanken mit 32 TB)
|
|
Maximale Größe einer Tabelle? 32 TB
|
|
Maximale Größe einer Zeile? 400 GB
|
|
Maximale Größe einer Spalte? 1 GB
|
|
Maximale Anzahl von Zeilen in einer Tabelle?
|
|
unbeschränkt
|
|
Maximale Anzahl von Spalten in einer Tabelle?
|
|
250-1600 je nach Spaltentyp
|
|
Maximale Anzahl von Indexen für eine Tabelle?
|
|
unbeschränkt
|
|
|
|
</pre>
|
|
<p>Selbstverständlich sind dies theoretische Werte, die oft durch die
|
|
verfügbaren Platten- und Speicherressourcen beschränkt werden.
|
|
Extreme Größen können zu Leistungseinbußen führen.</p>
|
|
|
|
<p>Die maximale Tabellengröße von 32 TB benötigt keine Large-File-Unterstützung
|
|
im Betriebssystem. Große Tabellen werden in Dateien mit einer Größe von
|
|
je 1 GB aufgeteilt, wodurch etwaige dateisystem-bedingte Beschränkungen nicht
|
|
relevant sind.</p>
|
|
|
|
<p>Die maximale Tabellengröße und die maximale Anzahl von Spalten können
|
|
vervierfacht werden, indem man die Default-Blockgröße auf 32 KB heraufsetzt.
|
|
Die Tabellengröße kann auch durch Tabellenpartitionierung vergrößert
|
|
werden.</p>
|
|
|
|
<p>Eine Einschränkung ist, dass Indexe nur auf Spalten erstellt werden
|
|
können, die bis etwa 2.000 Zeichen groß sind. Um auf größere Spalten
|
|
eine <small>UNIQUE</small>-Constraint setzen zu können, nutzen
|
|
Sie einen funktionalen Index mit dem MD5-Hash-Wert der Spalte.
|
|
Um innerhalb einer großen, mit Text belegten Spalte suchen zu können,
|
|
verwenden Sie einen Volltext-Index.</p>
|
|
|
|
<h3><a name="4.5">4.5</a>) Wieviel Plattenplatz wird benötigt, um die Daten aus einer typischen
|
|
Textdatei abzuspeichern? </h3>
|
|
|
|
<p>Eine PostgreSQL-Datenbank kann beim Abspeichern einer einfachen Textdatei
|
|
bis zu fünfmal mehr Platz gegenüber der eigentlichen Größe der Datei
|
|
beanspruchen.</p>
|
|
|
|
<p>Betrachten wir eine Datei mit 100.000 Zeilen mit einem Integer und einer
|
|
Textbeschreibung pro Zeile. Gehen wir davon aus, dass die durchschnittliche
|
|
Länge der Textbeschreibung 20 Byte beträgt. Die einfache Datei würde 2,8 MB
|
|
groß sein. Die Größe der PostgreSQL-Datenbankdatei, die diese Daten enthält,
|
|
liegt ungefähr bei 5,2 MB:</p>
|
|
<pre>
|
|
24 Bytes: jeder Zeilenkopf (ungefähr)
|
|
+24 Bytes: ein Integer-Feld und ein Textfeld
|
|
+ 4 Bytes: Zeiger auf der Datenseite auf den Tupel
|
|
-----------------------------------------------
|
|
52 Bytes pro Zeile
|
|
</pre>
|
|
<p>Die Größe einer Datenseite in PostgreSQL beträgt 8192 Bytes (8 KB), also:</p>
|
|
|
|
<pre>
|
|
8192 Bytes pro Seite
|
|
--------------------- = 146 Zeilen pro Seite (abgerundet)
|
|
52 Bytes pro Zeile
|
|
|
|
100.000 Datenzeilen
|
|
------------------------ = 685 Datenbankseiten (aufgerundet)
|
|
158 Zeilen pro Seite
|
|
|
|
633 Datenbankseiten * 8192 Bytes pro Seite = 5,185,536 bytes (5,2 MB)
|
|
</pre>
|
|
<p>Indexe beanspruchen nicht so viel Platz. Da sie jedoch die
|
|
Daten beinhalten, die sie indizieren, können auch sie sehr groß werden.</p>
|
|
|
|
<p>NULL-Werte werden als Bitmaps gespeichert, wodurch sie sehr wenig
|
|
Platz in Anspruch nehmen.</p>
|
|
|
|
<h3><a name="4.6">4.6</a>) Meine Abfragen sind langsam oder benutzen die Indexe nicht. Warum?</h3>
|
|
|
|
<p>Indexe werden nicht automatisch bei jeder Abfrage verwendet. Indexe werden
|
|
nur dann verwendet, wenn die abzufragende Tabelle eine bestimmte Größe
|
|
übersteigt, und die Abfrage nur eine kleine Prozentzahl der Tabellenzeilen
|
|
abfragt. Der Grund hierfür ist der, dass die durch einen Index verursachten
|
|
Festplattenzugriffe manchmal länger dauern würden als ein einfaches Auslesen
|
|
aller Tabellenzeilen (sequentieller Scan).</p>
|
|
|
|
<p>Um festzustellen, ob ein Index verwendet werden soll, braucht PostgreSQL
|
|
Statistiken über die Tabelle. Diese Statistiken werden durch die Anweisungen
|
|
<small>VACUUM ANALYZE</small> bzw. <small>ANALYZE</small> berechnet. Anhand der Statistiken kennt der
|
|
Abfragenoptimierer die Anzahl der Tabellenzeilen und kann besser
|
|
entscheiden, ob Indexe verwendet werden sollen. Statistiken sind auch
|
|
bei der Ermittlung der optimalen <small>JOIN</small>-Reihenfolgen und
|
|
-Methoden wertvoll. Daher sollten diese regelmässig durchgeführt werden, da
|
|
sich der Inhalt einer Tabelle ja auch verändert.</p>
|
|
|
|
<p>Indexe werden normalerweise nicht in <small>ORDER BY</small>-Abfrage oder in JOINs
|
|
verwendet. Ein sequentieller Scan mit anschließendem explizitem
|
|
Sortiervorgang ist normalerweise schneller als ein Index-Scan einer
|
|
großen Tabelle. Jedoch wird bei einer Abfrage, in der <small>LIMIT</small> zusammen mit
|
|
<small>ORDER BY</small> verwendet wird, oftmals ein Index verwendet, da nur ein
|
|
kleiner Abschnitt der Tabelle zurückgeliefert wird.</p>
|
|
|
|
<p>Sollte es danach aussehen, also ob der Optimierer irrtümlich einen sequentiellen
|
|
Scan ausführt, führen Sie <small>SET enable_seqscan TO 'off'</small> aus und prüfen
|
|
Sie, ob die Indexabfrage dadurch scheller geworden ist.</p>
|
|
|
|
<p>Bei der Nutzung von Wildcard-Operatoren wie <small>LIKE</small> oder <small>~</small>, können
|
|
Indexe nur unter bestimmten Umständen verwendet werden:</p>
|
|
<ul>
|
|
|
|
<li>Das Suchmuster muss sich an Anfang des Strings befinden, d.h.:
|
|
<ul>
|
|
<li><small>LIKE</small>-Suchmuster dürfen nicht mit <em>%</em> anfangen;</li>
|
|
<li><small>~</small> (reguläre Ausdrücke) müssen mit <em>^</em> anfangen.</li>
|
|
</ul>
|
|
</li>
|
|
<li>Das Suchmuster darf nicht mit einer Zeichenklasse (z.B. <em>[a-e]</em>)
|
|
beginnen.</li>
|
|
<li>Suchmuster, die Gross- und Kleinschreibung nicht berücksichtigen (z.B.
|
|
<small>ILIKE</small> bzw. <small>~*</small>), verwenden keine Indexe. Stattdessen können
|
|
funktionale Indexe verwendet werden, die im Punkt <a href="#4.8">4.8</a> beschrieben werden.</li>
|
|
<li>Die Standard-Locale "C" muss während der Datenbank-Initialisierung mit <em>initdb</em>
|
|
verwendet worden sein, da andere <em>locales</em> den nächstgrößten Wert nicht
|
|
ermitteln können. Es ist allerdings möglich, einen besonderen <small>text_pattern_ops</small>-Index
|
|
für solche Fälle zu erstellen.</li>
|
|
</ul>
|
|
<p>In Versionen vor 8.0 werden Indexe oft nicht benutzt, wenn die
|
|
jeweiligen Datentypen nicht genau übereinstimmen. Dies gilt besonders für
|
|
Indexe auf Spalten mit den Datentypen <small>INT2</small>, <small>INT8</small> und <small>NUMERIC</small></p>
|
|
|
|
|
|
<h3><a name="4.7">4.7</a>) Auf welche Weise kann ich sehen, wie der Abfrage-Optimierer meine
|
|
Abfrage auswertet?</h3>
|
|
|
|
<p>Vgl. die <em>EXPLAIN</em> Man-Page.</p>
|
|
|
|
<h3><a name="4.8">4.8</a>) Wie verfahre ich bei der Suche mit regulären Ausdrücken und bei einer
|
|
Suche, bei der Groß- und Kleinschreibweisen ignoriert werden? Wie verwende
|
|
ich einen Index bei solchen Suchabfragen?</h3>
|
|
|
|
<p>Der Operator <em>~</em> wendet einen regulären Ausdruck an und <em>~*</em> wendet ihn an, ohne die Groß- und Kleinschreibung zu beachten.
|
|
Ebenso beachtet <small>LIKE</small> die Groß- und Kleinschreibung, und <small>ILIKE</small> nicht.</p>
|
|
|
|
<p>Gleichheitsvergleiche, die Groß- und Kleinschreibung ignorieren, werden
|
|
in der Regel so ausgedruckt:</p>
|
|
|
|
<pre>
|
|
SELECT *
|
|
FROM tabelle
|
|
WHERE LOWER(spalte) = 'abc'
|
|
</pre>
|
|
<p>Hier wird kein normaler Index benutzt. Legt man hingegen einen funktionalen
|
|
Index an, so wird er auf jeden Fall verwendet:</p>
|
|
<pre>
|
|
CREATE INDEX tabelle_index ON tabelle (LOWER(spalte))
|
|
</pre>
|
|
<p>Falls der obige Index als einen <small>UNIQUE</small>-Index angelegt
|
|
wird, können keine Werte in die Spalte eingefügt werden, die sich nur
|
|
durch ihre Groß- und Kleinschreibung unterscheiden. Um Fehler zu
|
|
vermeiden muß ein <small>CHECK</small>-Constraint oder ein Trigger
|
|
eingesetzt werden.</p>
|
|
|
|
<h3><a name="4.9">4.9</a>) Wie ermittle ich in einer Abfrage, ob ein Feld NULL ist?
|
|
Kann nach der NULL-Belegung sortiert werden?</h3>
|
|
|
|
<p>Testen Sie die Spalte mit <small>IS NULL</small> bzw. <small>IS NOT NULL</small>.</p>
|
|
<pre>
|
|
SELECT *
|
|
FROM tabelle
|
|
WHERE spalte IS NULL
|
|
</pre>
|
|
<p>Um die Spalte danach zu sortieren, ob sie mit NULL belegt ist oder nicht,
|
|
verwenden Sie die Bedingungen <small>IS NULL</small> bzw. <small>IS NOT NULL</small>
|
|
in der <small>ORDER BY</small>-Klausel. Da Bedingungen, die wahr sind, höher
|
|
als das Gegenteil sortiert werden, bewirkt die folgende Abfrage, dass die
|
|
<small>NULL</small>-Spalten zuerst gelistet werden:</p>
|
|
<pre>
|
|
SELECT *
|
|
FROM tabelle
|
|
ORDER BY (spalte IS NOT NULL)
|
|
|
|
</pre>
|
|
|
|
<h3><a name="4.10">4.10</a>) Was ist der Unterschied zwischen den verschiedenen <small>CHAR</small>-Typen?</h3><pre>
|
|
Typ interner Name Bemerkungen
|
|
-------------------------------------------------
|
|
VARCHAR(n) varchar die Größe legt die Maximallänge fest; kein
|
|
Auffüllen mit Leerzeichen
|
|
CHAR(n) bpchar mit Leerzeichen gefüllt bis zur angegebenen Länge
|
|
TEXT text keine obere Schranke für die Länge
|
|
BYTEA bytea Bytearray mit variabler Länge (auch für
|
|
'\0'-Bytes geeignet)
|
|
"char" char 1 Zeichen
|
|
</pre>
|
|
<p>Der <em>interne Name</em> kommt vor allem in den Systemkatalogen und in manchen
|
|
Fehlermeldungen vor.</p>
|
|
|
|
<p>Die ersten vier Typen sind "<em>varlena</em>"-Typen (d.h. die ersten vier
|
|
Bytes geben die Länge an, gefolgt von den Daten). Daher ist der tatsächlich
|
|
belegte Platz immer etwas mehr als die deklarierte Feldgröße. Allerdings
|
|
wird unter Umständen auf diese Datentypen Datenkompression durch das <small>TOAST</small>-
|
|
Verfahren angewendet, womit der tatsächlich belegte Platz auch geringer
|
|
als erwartet ausfallen kann.</p>
|
|
|
|
<p>Für die Speicherung von Zeichenketten variabler Länge empfiehlt sich <small>VARCHAR(n)</small>.
|
|
Die maximale Länge eines <small>VARCHAR(n)</small>-Felds wird bei der Tabellendefinition
|
|
festgelegt. <small>TEXT</small> setzt keine Längengrenze, allerdings gibt es
|
|
eine systembedingte Obergrenze von 1 GB. </p>
|
|
|
|
<p><small>CHAR(n)</small> ist geeignet für die Speicherung von Zeichenketten, die alle
|
|
die gleiche Länge haben. Bitte beachten Sie, dass <small>CHAR(n)</small> automatisch Zeichenketten
|
|
bis zur definierten Feldlänge mit Leerzeichen ausfüllt, während bei <small>VARCHAR(n)</small> nur
|
|
die tatsächlich eingegebene Zeichenkette gespeichert wird.</p>
|
|
|
|
<p><small>BYTEA</small> ist für binäre Daten, besonders für Werte, die <small>NULL</small>-Bytes haben. </p>
|
|
|
|
<p>Alle der hier erwähnten Typen weisen ähnliche Performanzeigenschaften auf.</p>
|
|
|
|
<h3><a name="4.11.1">4.11.1</a>) Wie erzeuge ich ein serielles Feld mit automatischer Erhöhung des
|
|
Wert?</h3>
|
|
|
|
<p>PostgreSQL bietet einen <small>SERIAL</small>-Datentyp. Dieser erzeugt automatisch
|
|
eine Sequenz auf die angegebene Spalte. Zum Beispiel:</p>
|
|
<pre>
|
|
CREATE TABLE person (
|
|
id SERIAL,
|
|
name TEXT
|
|
)</pre>
|
|
|
|
<p>wird automatisch in:</p>
|
|
<pre>
|
|
CREATE SEQUENCE person_id_seq;
|
|
CREATE TABLE person (
|
|
id INT4 NOT NULL DEFAULT nextval('person_id_seq'),
|
|
name TEXT
|
|
);
|
|
</pre><p>umgewandelt.</p>
|
|
|
|
<p>Die <em>create_sequence</em> Man-Page liefert weitere Informationen über Sequenzen.</p>
|
|
|
|
<h3><a name="4.11.2">4.11.2</a>) Wie bekomme ich den Wert einer <small>SERIAL</small>-Sequenz?</h3>
|
|
|
|
<p>Eine Möglichkeit wäre, mit der <em>nextval()</em>-Funktion den nächsten <small>SERIAL</small>-Wert
|
|
von dem Sequenzobjekt vor der Auszuführung einer <small>INSERT</small>-Anweisung anzufordern und ihn
|
|
dann explizit in die <small>INSERT</small>-Anweisung einzubinden. Anhand der Beispieltabelle in
|
|
<a href="#4.11.1">4.11.1</a> könnte dieser Vorgang in einer Pseudosprache so aussehen:</p>
|
|
|
|
<pre>
|
|
new_id = output of execute("SELECT nextval('person_id_seq')");
|
|
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
|
|
</pre>
|
|
<p>Danach stünde der neue Wert in der Variablen <em>new_id</em> für die Verwendung in
|
|
weiteren Abfragen zur Verfügung, zum Beispiel als Fremdschlüssel zur
|
|
Tabelle 'person'). Bitte beachten Sie, dass der Name des automatisch
|
|
erstellten <small>SEQUENCE</small>-Objektes folgenden Name hat:
|
|
<em>«table»_«serialcolumn»_seq</em>
|
|
wobei '<em>table</em>' und '<em>serialcolumn</em>' die Namen der jeweils betreffenden
|
|
Tabelle / Spalte darstellen.</p>
|
|
|
|
<p>Als weitere Möglichkeit können Sie nach einer <small>INSERT</small>-Anweisung den
|
|
automatisch eingefügten <small>SERIAL</small>-Wert mit der <em>currval()</em>-Funktion zurückgeben
|
|
lassen:</p>
|
|
<pre>
|
|
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
|
|
new_id = output of execute("SELECT currval('person_id_seq')");
|
|
</pre>
|
|
|
|
<h3><a name="4.11.3">4.11.3</a>) Führt <em>currval()</em> zu einer Race-Condition mit anderen
|
|
Nutzern?</h3>
|
|
|
|
<p>Nein. <em>currval()</em> liefert einen Wert zurück, der von Ihrer
|
|
Datenbank-Session bestimmt wird, und der anderen Sessionen nicht zur Verfügung
|
|
steht.</p>
|
|
|
|
<h3><a name="4.11.4">4.11.4</a>) Warum werden die Sequenzwerte nach einem Transaktionsabbruch nicht
|
|
zurückgesetzt? Warum gibt es Lücken in der Nummerierung meiner
|
|
Sequenz-/<small>SERIAL</small>-Spalte?</h3>
|
|
|
|
<p>Um die gleichzeitige Abarbeitung von Transaktionen zu verbessern, werden
|
|
Sequenzen gerade nicht für andere Transaktionen gesperrt, sondern die
|
|
Sequenznummern werden den laufenden Transaktionen sofort zugeteilt. Lücken in
|
|
der Sequenznummerierung werden durch abgebrochene Transaktionen verursacht.</p>
|
|
|
|
<h3><a name="4.12">4.12</a>) Was ist ein <small>OID</small>? Was ist ein <small>CTID</small>?</h3>
|
|
|
|
<p>Jede Zeile, die in PostgreSQL erzeugt wird, bekommt eine eindeutige <small>OID</small>,
|
|
sofern die Tabelle nicht mit der Option <small>WITHOUT OIDS</small> angelegt wurde.
|
|
<small>OID</small>s sind automatisch zugewiesene 4-Byte-Integer, die innerhalb
|
|
der gesamten Datenbank einmalig sind. Allerdings laufen sie bei einem Wert von
|
|
ungefähr 4 Milliarden über. PostgreSQL verwendet <small>OID</small>s, um seine
|
|
interne Systemtabellen zu verbinden.</p>
|
|
|
|
<p>Um einmalige Idenfikatoren in Datentabellen zu erstellen, wird allerdings
|
|
empfohlen, statt <small>OID</small>s Werte zu verwenden, die von<small>SERIAL</small>-
|
|
Sequenzen erzeugt werden. <small>SERIAL</small>-Sequenzen sind innerhalb einer
|
|
Tabelle einmalig und daher weniger anfällig für Überläufe. Außerdem können
|
|
8-Byte-Sequenzwerte mit <small>SERIAL8</small> erzeugt werden.</p>
|
|
|
|
<p><small>CTID</small>s werden benutzt, um bestimmte physikalische Zeilen
|
|
durch Block und Offset Werte zu identifizieren. <small>CTID</small>s
|
|
verändern sich, sobald Zeilen verändert oder zurückgeladen werden. Sie
|
|
werden in Indexeinträgen benutzt um auf die physikalischen Zeilen zu
|
|
zeigen.</p>
|
|
|
|
<h3><a name="4.13">4.13</a>) Wieso bekomme ich einen Fehler: "<em>ERROR: Memory exhausted in
|
|
AllocSetAlloc()</em>"?</h3>
|
|
|
|
<p>Wahrscheinlich gibt es keinen virtuellen Speicher mehr in Ihrem System
|
|
oder Ihr Kernel hat niedrige Höchstgrenzen für bestimmte Ressourcen.
|
|
Probieren Sie vor dem Start von <em>postmaster</em> folgendes:</p>
|
|
<pre>
|
|
ulimit -d 262144
|
|
limit datasize 256m
|
|
|
|
</pre>
|
|
<p>Je nach benutzter Shell wird nur einer dieser Befehle erfolgreich
|
|
ausgeführt werden. Auf jedem Fall wird die Grenze des Datensegments für
|
|
Prozesse erhöht werden und eventuell die erfolgreiche Ausführung der
|
|
Abfrage ermöglichen. Falls Sie ein Problem mit dem SQL-CLient haben,
|
|
weil das Backend zu viele Daten zurückliefert, versuchen Sie dies vor dem
|
|
Start des SQL-Clients.</p>
|
|
|
|
<h3><a name="4.14">4.14</a>) Wie kann ich feststellen, welche PostgreSQL-Version bei mir läuft?</h3>
|
|
|
|
<p>Geben Sie in <em>psql</em> <small>SELECT VERSION();</small> ein.</p>
|
|
|
|
<h3><a name="4.15">4.15</a>) Wie kann ich eine Spalte erstellen, deren Default-Wert immer
|
|
die aktuelle Uhrzeit enthalten soll?</h3>
|
|
|
|
<p>Dazu verwenden Sie <small>CURRENT_TIMESTAMP</small>:</p>
|
|
<pre>
|
|
CREATE TABLE test (x INT, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
|
|
</pre>
|
|
|
|
<h3><a name="4.16">4.16</a>) Wie führe ich eine <small>OUTER JOIN</small> durch?</h3>
|
|
|
|
<p>PostgreSQL unterstützt <small>OUTER JOIN</small>s nach dem SQL-
|
|
Standardsyntax. Hier zwei Beispiele:</p>
|
|
<pre>
|
|
SELECT *
|
|
FROM tabelle_1 t1
|
|
LEFT OUTER JOIN tabelle_2 t2 ON (t1.spalte = t2.spalte)
|
|
</pre>
|
|
<p>bzw.:</p>
|
|
<pre>
|
|
SELECT *
|
|
FROM tabelle_1 t1
|
|
LEFT OUTER JOIN tabelle_2 t2 USING (spalte)
|
|
</pre>
|
|
|
|
<p>
|
|
Diese identischen Abfragen verknüpfen <em>tabelle_1</em> mit <em>tabelle_2</em> über die
|
|
Spalte '<em>spalte</em>' und geben außerdem alle unverknüpften Zeilen in tabelle_1
|
|
(diejenigen, die keine Entsprechung in <em>tabelle_2</em> haben) zurück.
|
|
Ein <small>RIGHT JOIN</small> würde hingegen alle unverknüpften Zeilen in tabelle_2 hinzufügen und
|
|
ein <small>FULL JOIN</small> würde alle verknüpften Zeilen sowie jeweils alle
|
|
unverknüpften Zeilen aus den beiden Tabellen zurückliefern. Die Angabe von
|
|
<small>OUTER</small> ist nicht zwingend und kann in <small>LEFT</small>, <small>RIGHT</small> und <small>FULL</small>-Verknüpfungen
|
|
weggelassen werden. Normale Verknüpfungen sind <small>INNER JOIN</small>s.</p>
|
|
|
|
<h3><a name="4.17">4.17</a>) Wie kann ich Abfragen über mehrere Datenbanken hinweg ausführen?</h3>
|
|
|
|
<p>Es gibt keinen Weg, innerhalb einer Abfrage auf mehr als eine Datenbank
|
|
zuzugreifen. Da PostgreSQL datenbank-spezifische Systemkataloge lädt, ist
|
|
eine datenbankübergreifende Abfrage nicht möglich.</p>
|
|
|
|
<p><em>contrib/dblink</em> ist eine Erweiterung, die datenbankübergreifende Abfragen über
|
|
Funktionsaufrufe ermöglicht.</p>
|
|
|
|
<h3><a name="4.18">4.18</a>) Wie kann ich mehrere Zeilen bzw. Spalten von einer Funktion
|
|
zurückgeben lassen?</h3>
|
|
|
|
<p>Funktionen können mehrere Zeilen und Spalten zurückgeben, vgl.:
|
|
<a href="http://www.postgresql.org/docs/techdocs.17">http://www.postgresql.org/docs/techdocs.17</a>.</p>
|
|
|
|
<h3><a name="4.19">4.19</a>) Warum bekomme ich eine Fehlermeldung wie
|
|
"relation with OID ##### does not exist" wenn ich temporäre Tabellen in
|
|
PL/PgSQL-Funktionen benutze?</h3>
|
|
|
|
<p>In PostgreSQL-Versionen vor 8.3 verarbeitet PL/PgSQL Funktionen in einer
|
|
Cache. Dies hat eine unangenehme Nebenwirkung, nämlich dass wenn eine
|
|
PL/PgSQL-Funktion auf eine temporäre Tabelle zugreift, und diese Tabelle
|
|
anschließend gelöscht bzw. neu erstellt wird, die Funktion fehlschlagen
|
|
wird, da die gecachten Funktionsinhalte noch auf die alte temporäre Tabelle
|
|
zeigen. Die Lösung für diese Probleme besteht darin, in der PL/PgSQL-
|
|
Funktion mittels <small>EXECUTE</small> auf temporäre Tabellen zuzugreifen.
|
|
Dies bewirkt, dass bei jedem Funktionsruf die betreffende Abfrage neu
|
|
geparst wird.</p>
|
|
|
|
<p>Dieses Problem taucht in PostgreSQL 8.3 und späteren Versionen nicht
|
|
mehr auf.</p>
|
|
|
|
<h3><a name="4.20">4.20</a>) Welche Replikationslösungen gibt es?</h3>
|
|
|
|
<p>Der Begriff "replikation" umfasst mehrere verschiedene Technologien,
|
|
jede mit eigenen Vor- und Nachteilen.</p>
|
|
|
|
<p>Mit "Master/slave"-Replikation werden Änderungen in einer Hauptdatenbank
|
|
durchgeführt und an "Sklaven" verteilt, die im Nur-Lese-Modus arbeiten.
|
|
Die populärste Lösung für PostgreSQL ist <a href="http://main.slony.info/">Slony-I</a>.</p>
|
|
|
|
<p>"Multi-master replication" ermöglicht sowohl lesende als auch schreibende
|
|
Zugriffe über mehrere Datenbank-Server hinweg. Allerdings hat diese Art von
|
|
Replikation eine negative Auswirkung auf die Performanz durch die
|
|
Notwendigkeit, Änderungen zwischen Servern zu synchronisieren. <a href="http://pgfoundry.org/projects/pgcluster/">Pgcluster</a>
|
|
ist die populärste freie Lösung für PostgreSQL.</p>
|
|
|
|
<p>Es gibt auch einige kommerzielle und hardware-basierte Replikationslösungen
|
|
für verschiedene Arten der Replikation.</p>
|
|
|
|
<h3><a name="4.21">4.21</a>) Warum werden die Tabellen- und Spaltennamen in meiner
|
|
Abfrage nicht erkannt? Warum werden Großbuchstaben umgewandelt?</h3>
|
|
|
|
<p>Die häufigste Ursache ist die Verwendung von Gänsefüßchen
|
|
bei der Anlegung von Tabellen, z.B.:</p>
|
|
<pre>
|
|
CREATE TABLE "Tabelle"
|
|
("SPALTE1" INT)
|
|
</pre>
|
|
<p>Dadurch werden Tabellen- und Spaltennamen (sog. Identifikatoren)
|
|
in genau der Schreibweise gespeichert (vgl. <a
|
|
href="http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS">
|
|
Dokumentation</a>), was dazu führt, dass man sie danach immer
|
|
in Gänsefüßchen angeben muss. Im obigen Beispiel muss man also immer
|
|
etwa <small>SELECT * FROM "Tabelle"</small> verwenden. Um
|
|
dieses Problem zu vermeiden, müssen Sie immer eines der folgenden
|
|
Punkte beachten:</p>
|
|
|
|
<ul>
|
|
<li>bei der Tabellenanlegung keine Gänsefüßchen verwenden;</li>
|
|
<li>in Identifikatoren nur Kleinschreibung verwenden;</li>
|
|
<li>immer Identifikatoren mit Gänsefüßchen versehen</li>
|
|
</ul>
|
|
|
|
<hr />
|
|
|
|
<h3>Anmerkungen des Übersetzers</h3>
|
|
|
|
<p>Die englische Vorlage dieser FAQ wird ständig überarbeitet. Daher liegt
|
|
die Übersetzung nicht immer auf dem aktuellsten Stand.</p>
|
|
|
|
<p>Die aktuellste Version der deutschen Übersetzung befindet sich immer unter
|
|
<a href="http://sql-info.de/de/postgresql/FAQ_german.html">http://sql-info.de/de/postgresql/FAQ_german.html</a>.
|
|
Diese "Arbeitsversion" enthält eventuell Änderungen, die noch nicht auf der
|
|
PostgreSQL-Website eingebunden worden sind.</p>
|
|
|
|
<p>Über Verbesserungshinweise und Korrekturvorschläge sowie Verständnisfragen
|
|
zum Inhalt der FAQ freue ich mich. Ich nehme auch allgemeine Fragen zu PostgreSQL gerne
|
|
entgegen, verweise jedoch auf die Mailing-Listen als schnelle und zuverlässige
|
|
Anlaufstellen.</p>
|
|
</body>
|
|
</html>
|