mirror of
https://github.com/postgres/postgres.git
synced 2025-06-01 00:01:20 -04:00
1307 lines
67 KiB
HTML
1307 lines
67 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
|
<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:pgman@candle.pha.pa.us">pgman@candle.pha.pa.us</a>).</p>
|
|
|
|
<p>Deutsche Übersetzung von Ian Barwick (<a href="mailto:barwick@gmx.net">barwick@gmx.net</a>).<br />
|
|
Basiert teilweise auf einer Übersetzung von Karsten Schulz (<a href="mailto:schulz@linux-systemhaus.de">schulz@linux-systemhaus.de</a>).</p>
|
|
|
|
<p>Letzte Aktualisierung der deutschen Übersetzung: Mo., den 21.10.2002, 23:00 CET</p>
|
|
|
|
<p>Die aktuellste Version dieses Dokuments liegt auf der PostgreSQL Website:</p>
|
|
<ul>
|
|
<li><a href="http://www.PostgreSQL.org/docs/faq-english.html">http://www.PostgreSQL.org/docs/faq-english.html</a> (engl.)</li>
|
|
<li><a href="http://www.PostgreSQL.org/docs/faq-german.html">http://www.PostgreSQL.org/docs/faq-german.html</a> (dt.)</li>
|
|
</ul>
|
|
<p>Übersetzungen dieses Dokuments in andere Sprachen sowie plattform-
|
|
spezifische FAQs können unter
|
|
<a href="http://www.PostgreSQL.org/users-lounge/docs/faq.html">http://www.PostgreSQL.org/users-lounge/docs/faq.html</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>) Welchem Copyright unterliegt PostgreSQL?<br />
|
|
<a href="#1.3">1.3</a>) Auf welchen Unix-Plattformen läuft PostgreSQL?<br />
|
|
<a href="#1.4">1.4</a>) Welche Nicht-Unix-Versionen sind verfügbar?<br />
|
|
<a href="#1.5">1.5</a>) Woher bekomme ich PostgreSQL?<br />
|
|
<a href="#1.6">1.6</a>) Wo bekomme ich Support für PostgreSQL?<br />
|
|
<a href="#1.7">1.7</a>) Was ist die neueste Version von PostgreSQL?<br />
|
|
<a href="#1.8">1.8</a>) Welche Dokumentation ist für PostgreSQL verfügbar?<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>) Wie kann ich SQL lernen?<br />
|
|
<a href="#1.11">1.11</a>) Ist PostgreSQL Y2K (Jahr 2000) fähig?<br />
|
|
<a href="#1.12">1.12</a>) Wie kann ich im Entwicklerteam mitarbeiten?<br />
|
|
<a href="#1.13">1.13</a>) Wie sende ich einen Fehler-Bericht?<br />
|
|
<a href="#1.14">1.14</a>) Wie läuft PostgreSQL im Vergleich zu anderen Datenbanksystemen?<br />
|
|
<a href="#1.15">1.15</a>) Wie kann ich PostgreSQL finanziell unterstützen?
|
|
|
|
<h2 align="center">Fragen zu Benutzerprogrammen</h2>
|
|
|
|
<a href="#2.1">2.1</a>) Gibt es ODBC-Treiber für PostgreSQL?<br />
|
|
<a href="#2.2">2.2</a>) Welche Werkzeuge gibt es, um Web-Seiten mit PostgreSQL zu verbinden?<br />
|
|
<a href="#2.3">2.3</a>) Hat PostgreSQL eine grafische Benutzerschnittstelle?
|
|
Einen Report-Generator? Eine eingebaute Query-Schnittstelle?<br />
|
|
<a href="#2.4">2.4</a>) Welche Programmiersprachen können mit PostgreSQL kommunizieren?<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>) Wenn ich den <em>postmaster</em> starte, erhalte ich die Nachricht "<em>Bad System Call</em>" bzw. "<em>core dumped</em>". Warum?<br />
|
|
<a href="#3.3">3.3</a>) Wenn ich versuche, den <em>postmaster</em> zu starten, bekomme ich "<em>IpcMemoryCreate</em>"-Fehlermeldungen. Warum?<br />
|
|
<a href="#3.4">3.4</a>) Wenn ich versuche, den <em>postmaster</em> zu starten, bekomme ich "<em>IpcSemaphoreCreate</em>"-Fehlermeldungen. Warum?<br />
|
|
<a href="#3.5">3.5</a>) Wie regle ich Zugriffe von anderen Rechnern?<br />
|
|
<a href="#3.6">3.6</a>) Wie optimiere ich die Datenbank für bessere Leistung?<br />
|
|
<a href="#3.7">3.7</a>) Welche Debugging-Funktionen sind bei PostgreSQL verfügbar?<br />
|
|
<a href="#3.8">3.8</a>) Ich bekomme die Meldung "<em>Sorry, too many clients</em>", wenn ich eine Verbindung aufzubauen versuche. Warum?<br />
|
|
<a href="#3.9">3.9</a>) Was befindet sich im Verzeichnis <em>pgsql_tmp/</em>?<br />
|
|
<a href="#3.10">3.10</a>) Warum muß ich bei jeder neuen Hauptversion von PostgreSQL
|
|
die komplette Datenbank exportieren und anschließend reimportieren?<br />
|
|
|
|
<h2 align="center">Fragen zum Betrieb</h2>
|
|
|
|
<a href="#4.1">4.1</a>) Worin besteht der Unterschied zwischen <em>Binary Cursors</em> und <em>Normal Cursors?</em><br />
|
|
<a href="#4.2">4.2</a>) Wie wähle ich per <small>SELECT</small>-Anweisung nur die
|
|
ersten paar Zeilen in einer Abfrage aus?<br />
|
|
<a href="#4.3">4.3</a>) Wie bekomme ich eine Liste der Tabellen oder anderen Dinge, die ich in <em>psql</em> sehen kann?<br />
|
|
<a href="#4.4">4.4</a>) Wie entferne ich eine Spalte aus einer Tabelle?<br />
|
|
<a href="#4.5">4.5</a>) Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine Datenbank?<br />
|
|
<a href="#4.6">4.6</a>) Wieviel Plattenplatz wird benötigt, um die Daten aus einer typischen Textdatei abzuspeichern?<br />
|
|
<a href="#4.7">4.7</a>) Wie finde ich heraus, welche Indizes oder Operationen in der Datenbank definiert sind?<br />
|
|
<a href="#4.8">4.8</a>) Meine Abfragen sind langsam oder nutzen die Indizes nicht. Warum?<br />
|
|
<a href="#4.9">4.9</a>) Auf welche Weise kann ich sehen, wie der Abfrage-Optimierer ("<em>GEQO</em>") meine Abfrage auswertet?<br />
|
|
<a href="#4.10">4.10</a>) Was ist ein R-Tree Index?<br />
|
|
<a href="#4.11">4.11</a>) Was ist der "Genetic Query Optimizer"?<br />
|
|
<a href="#4.12">4.12</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 bei solchen Suchabfragen einen Index?<br />
|
|
<a href="#4.13">4.13</a>) Wie ermittle ich in einer Abfrage, ob ein Feld NULL ist?<br />
|
|
<a href="#4.14">4.14</a>) Was ist der Unterschied zwischen den verschiedenen CHAR-Typen?<br />
|
|
<a href="#4.15.1">4.15.1</a>) Wie erzeuge ich ein serielles Feld mit automatischer Erhöhung des Wertes?<br />
|
|
<a href="#4.15.2">4.15.2</a>) Wie bekomme ich den Wert einer SERIAL-Sequenz?<br />
|
|
<a href="#4.15.3">4.15.3</a>) Führen currval() und nextval() zu einer Race-Condition mit anderen
|
|
Nutzern?<br />
|
|
<a href="#4.15.4">4.15.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.16">4.16</a>) Was ist ein <small>OID</small>? Was ist ein <small>TID</small>?<br />
|
|
<a href="#4.17">4.17</a>) Welche Bedeutung haben die verschiedenen Ausdrücke, die in PostgreSQL benutzt werden (z.B. attribute, class,...)?<br />
|
|
<a href="#4.18">4.18</a>) Wieso bekomme ich den Fehler: "<em>FATAL: Memory exhausted in AllocSetAlloc()</em>"?<br />
|
|
<a href="#4.19">4.19</a>) Wie kann ich feststellen, welche PostgreSQL-Version bei mir läuft?<br />
|
|
<a href="#4.20">4.20</a>) Bei "large-object"-Operationen kommt die Fehlermeldung: "<em>invalid large obj descriptor</em>". Warum?<br />
|
|
<a href="#4.21">4.21</a>) Wie kann ich eine Spalte erstellen, deren Default-Wert immer
|
|
die aktuelle Uhrzeit enthalten soll?<br />
|
|
<a href="#4.22">4.22</a>) Warum sind meine Unterabfragen (subqueries), die IN verwenden,
|
|
so langsam?<br />
|
|
<a href="#4.23">4.23</a>) Wie führe ich einen <small>OUTER JOIN</small> durch?<br />
|
|
<a href="#4.24">4.24</a>) Wie kann ich Abfragen über mehrere Datenbanken hinweg ausführen?<br />
|
|
<a href="#4.25">4.25</a>) Wie kann ich mehrere Zeilen bzw. Spalten von einer Funktion
|
|
zurückgeben lassen?<br />
|
|
<a href="#4.26">4.26</a>) Warum kann ich temporäre Tabellen in <small>PL/PgSQL</small>-Funktionen nicht
|
|
zuverlässig erstellen bzw. löschen?<br />
|
|
<a href="#4.27">4.27</a>) Welche Möglichkeiten zur Datenbank-Replikation gibt es?<br />
|
|
<a href="#4.28">4.28</a>) Welche Möglichkeiten zur Verschlüsselung gibt es?<br />
|
|
|
|
|
|
<h2 align="center">PostgreSQL erweitern</h2>
|
|
|
|
<a href="#5.1">5.1</a>) Ich habe eine benutzerdefinierte Funktion geschrieben. Wenn ich sie in <em>psql</em> aufrufe, kommt ein <em>core dump</em>. Warum?<br />
|
|
<a href="#5.2">5.2</a>) Wie kann ich praktische neue Typen und Funktionen zu PostgreSQL
|
|
hinzufügen?<br />
|
|
<a href="#5.3">5.3</a>) Wie schreibe ich eine Funktion in C, die einen Tupel zurückliefert?<br />
|
|
<a href="#5.4">5.4</a>) Ich habe eine der Quellendateien geändert. Warum macht sich die Änderung beim erneuten Kompilieren nicht bemerkbar?<br />
|
|
|
|
<hr />
|
|
|
|
<h2 align="center">Allgemeine Fragen</h2>
|
|
<h4><a name="1.1">1.1</a>) Was ist PostgreSQL? Wie wird es ausgesprochen?</h4>
|
|
<p>Die (englische) Aussprache ist "Post-Gres-Q-L".</p>
|
|
|
|
<p>PostgreSQL ist eine Weiterentwicklung des POSTGRES-Datenbank-Systems,
|
|
eines zukunftsweisenden DBMS-Forschungsprototyps. Während PostgreSQL
|
|
das leistungsfähige Datenmodell und die reichhaltigen Datentypen
|
|
von POSTGRES beibehält, ersetzt es dessen PostQuel-Abfragesprache durch
|
|
eine erweiterte Teilmenge von SQL. PostgreSQL und dessen kompletter
|
|
Quellcode sind frei und öffentlich verfügbar.</p>
|
|
|
|
<p>Die PostgreSQL-Entwicklung wird von einem Entwickler-Team durchgeführt,
|
|
die alle Teilnehmer der PostgreSQL-Entwicklungs-Mailingliste
|
|
sind. Der aktuelle Koordinator ist Marc G. Fournier
|
|
(<a href="mailto:scrappy@PostgreSQL.org">scrappy@PostgreSQL.org</a>) (Anmeldemöglichkeit: siehe unten).
|
|
Dieses Team ist für die Gesamtentwicklung von PostgreSQL
|
|
verantwortlich.</p>
|
|
|
|
<p>Die Autoren von PostgreSQL 1.01 waren Andrew Yu und Jolly Chen. Viele
|
|
andere haben zur Portierung, zum Testen, zur Fehlersuche und zur
|
|
Verbesserung des Codes beigetragen. Der ursprüngliche Postgres-Code,
|
|
von dem PostgreSQL abstammt, ist auf die Arbeit von vielen
|
|
Studierenden und Diplomanden sowie Programmierern zurückzuführen,
|
|
die unter der Leitung des Professors Michael Stonebraker an der
|
|
Universität von Kalifornien, Berkeley arbeiteten.</p>
|
|
|
|
<p>Der ursprüngliche Name der Software in Berkeley war Postgres. Als die
|
|
SQL-Funktionalität 1995 hinzugefügt wurde, wurde sein Name zu
|
|
Postgres95 geändert. Der Name wurde Ende 1996 in PostgreSQL geändert.</p>
|
|
|
|
<h4><a name="1.2">1.2</a>).Welchem Copyright unterliegt PostgreSQL?</h4>
|
|
|
|
<p>PostgreSQL unterliegt folgendem COPYRIGHT (Originaltext):</p>
|
|
|
|
<p>PostgreSQL Data Base Management System</p>
|
|
|
|
<p>Portions copyright (c) 1996-2002, 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>Bei der obigen Lizenz handelt es sich um die BSD-Lizenz, die klassiche
|
|
Open-Source-Lizenz. Sie schränkt die Verwendung des Quellcodes in
|
|
keine Weise ein. Wir mögen diese Lizenz und haben nicht vor, sie
|
|
zu ändern.</p>
|
|
|
|
<p>Es gilt die Copyright-Klausel im Original!</p>
|
|
|
|
<h4><a name="1.3">1.3</a>) Auf welchen Unix-Plattformen läuft PostgreSQL?</h4>
|
|
<p>Normalerweise kann PostgreSQL auf jeder modernen UNIX-kompatiblen
|
|
Plattform eingesetzt werden. Diejenigen Plattformen, die bei der
|
|
jeweiligen Versionsfreigabe getestet wurden, sind in den Installations-
|
|
Anleitungen aufgelistet.</p>
|
|
|
|
<h4><a name="1.4">1.4</a>) Welche Nicht-Unix-Portierungen sind verfügbar?</h4>
|
|
|
|
<p><em>Client</em></p>
|
|
|
|
<p>Es ist möglich, die <em>libpq</em> C-Bibliothek, psql sowie andere Client-
|
|
Anwendungen und Schnittstellen für den Einsatz auf MS-Windows-Plattformen
|
|
zu kompilieren. In diesem Fall läuft der Client auf MS-Windows und steht
|
|
über TCP/IP mit einem Server in Verbindung, der auf einer der
|
|
unterstützten Unix-Plattformen läuft. Die Distribution enthält
|
|
die Datei win32.mak, mit der Win32 libpq-Bibliothek und <em>psql</em> erzeugt
|
|
werden können.</p>
|
|
|
|
<p><em>Server</em></p>
|
|
|
|
<p>Der Datenbankserver selber kann mit Hilfe der Cygwin-Umgebung
|
|
(Unix/NT-Portierungsbibliotheken) auf Windows NT/2000 zum Laufen
|
|
gebracht werden. Hierzu bitte lesen Sie die in der Distribution
|
|
enthaltene Datei <em>pgsql/doc/FAQ_MSWIN</em> oder die MS-Windows-FAQ unter
|
|
<a href="http://www.PostgreSQL.org/docs/faq-mswin.html">http://www.PostgreSQL.org/docs/faq-mswin.html</a>.</p>
|
|
|
|
<p>Eine eigenständige Portierung auf MS Win NT/2000/XP befindet sich
|
|
in Vorbereitung.</p>
|
|
|
|
<h4><a name="1.5">1.5</a>) Woher bekomme ich PostgreSQL?</h4>
|
|
|
|
<p>Der zentrale FTP-Server für PostgreSQL ist der ftp-Server
|
|
<a href="ftp://ftp.postgreSQL.org/pub">ftp://ftp.postgreSQL.org/pub</a>. Weitere Mirror-Sites sind auf der
|
|
PostgreSQL-Website aufgelistet.</p>
|
|
|
|
<h4><a name="1.6">1.6</a>) Wo bekomme ich Support für PostgreSQL?</h4>
|
|
|
|
<p>Die zentrale (englischsprachige) Mailing-Liste ist:
|
|
<a href="mailto:pgsql-general@PostgreSQL.org">mailto:pgsql-general@PostgreSQL.org</a> .
|
|
|
|
<p>Die Liste ist Themen vorbehalten, die PostgreSQL betreffen. Die Anmeldung
|
|
erfolgt mit einer Email an die Adresse <a href="mailto:pgsql-general-request@PostgreSQL.org">pgsql-general-request@PostgreSQL.org</a> mit folgenden Zeilen im Text
|
|
(nicht in der Betreffzeile):</p>
|
|
<pre>
|
|
subscribe
|
|
end
|
|
</pre>
|
|
<p>Es gibt auch eine Digest-Liste (eine Liste, die Mails zusammengefasst
|
|
sendet). Um sich an dieser Digest-Liste anzumelden, senden Sie eine Email
|
|
an <a href="pgsql-general-digest-request@PostgreSQL.org">pgsql-general-digest-request@PostgreSQL.org</a> mit folgendem Text:</p>
|
|
<pre>
|
|
subscribe
|
|
end
|
|
</pre>
|
|
|
|
<p>Es gibt noch die Bug-Mailingliste. Die Anmeldung für diese Liste erfolgt
|
|
durch eine Email an <a href="mailto:bugs-request@PostgreSQL.org">bugs-request@PostgreSQL.org</a> mit folgendem Text:</p>
|
|
<pre>
|
|
subscribe
|
|
end
|
|
</pre>
|
|
|
|
<p>Die Entwickler-Mailingliste kann mit einer Email an
|
|
<a href="mailto:">pgsql-hackers-request@PostgreSQL.org</a> abonniert werden. Die Email muß ebenfalls folgenden Text enthalten:</p>
|
|
<pre>
|
|
subscribe
|
|
end
|
|
</pre>
|
|
|
|
|
|
<p>Weitere Mailinglisten und Informationen zu PostgreSQL befinden sich auf der PostgreSQL-Homepage:</p>
|
|
<blockquote>
|
|
<a href="http://www.PostgreSQL.org">http://www.PostgreSQL.org</a>
|
|
</blockquote>
|
|
<p>Es gibt außerdem einen IRC-Channel im EFNet, Channel <em>#PostgreSQL</em>. Der
|
|
FAQ-Autor Bruce Momjian nutzt den Unix-Befehl:
|
|
<small>irc -c '#PostgreSQL' "$USER" irc.phoenix.net</small>
|
|
um daran teilzunehmen.</p>
|
|
|
|
<p>Eine Liste von Unternehmen, die Support für PostgreSQL auf kommerzieller
|
|
Basis leisten, kann unter
|
|
<a href="http://www.PostgreSQL.org/users-lounge/commercial-support.html">http://www.PostgreSQL.org/users-lounge/commercial-support.html</a>
|
|
eingesehen werden.</p>
|
|
|
|
<h4><a name="1.7">1.7</a>) Was ist die neueste Version von PostgreSQL?</h4>
|
|
|
|
<p>Die neueste Version von PostgreSQL ist 7.2.3.</p>
|
|
|
|
<p>Wir planen alle 4 Monate eine neue Version herauszugeben.</p>
|
|
|
|
<h4><a name="1.8">1.8</a>) Welche Dokumentation ist für PostgreSQL verfügbar?</h4>
|
|
|
|
<p>Einige Handbücher, Man-Pages und einige kleine Testprogramme sind in
|
|
der Distribution enthalten. Siehe das <em>/doc</em>-Verzeichnis. Ausserdem sind
|
|
alle Handbücher online unter <a href="http://www.PostgreSQL.org/users-lounge/docs/">http://www.PostgreSQL.org/users-lounge/docs/</a>
|
|
verfügbar.</p>
|
|
|
|
<p>Zwei Bücher zu PostgreSQL sind online verfügbar unter
|
|
<a href="http://www.PostgreSQL.org/docs/awbook.html">http://www.PostgreSQL.org/docs/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.ca.PostgreSQL.org/books/">http://www.ca.PostgreSQL.org/books/</a>
|
|
Diverse technische Artikel befinden sich unter
|
|
<a href="http://techdocs.PostgreSQL.org/">http://techdocs.PostgreSQL.org/</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>
|
|
|
|
<h4><a name="1.9">1.9</a>) Wie erfahre ich von bekannten Bugs oder fehlenden Features?</h4>
|
|
|
|
<p>PostgreSQL unterstützt eine erweiterte Teilmenge von SQL-92. Siehe
|
|
unsere TODO-Liste unter <a href="http://developer.PostgreSQL.org/todo.php">http://developer.PostgreSQL.org/todo.php</a> für eine Auflistung
|
|
der bekannten Bugs, fehlenden Features und zukünftigen Pläne.</p>
|
|
|
|
<h4><a name="1.10">1.10</a>) Wie kann ich <small>SQL</small> lernen?</h4>
|
|
|
|
<p>Das PostgreSQL Book auf <a href="http://www.PostgreSQL.org/docs/awbook.html">http://www.PostgreSQL.org/docs/awbook.html</a> bietet
|
|
eine Einführung in SQL. Ein weiteres PostgreSQL-Buch befindet sich unter
|
|
<a href="http://www.commandprompt.com/ppbook">http://www.commandprompt.com/ppbook</a> . Es gibt zudem nette Tutorials unter
|
|
<a href="http://www.intermedia.net/support/sql/sqltut.shtm">http://www.intermedia.net/support/sql/sqltut.shtm</a> ,
|
|
<a href="http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM">http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM</a>
|
|
und <a href="http://sqlcourse.com">http://sqlcourse.com</a> .</p>
|
|
|
|
<p>Eine weitere Empfehlung ist "Teach Yourself SQL in 21 Days, Second Edition",
|
|
es ist unter <a href="http://members.tripod.com/er4ebus/sql/index.htm">http://members.tripod.com/er4ebus/sql/index.htm</a> erhältlich.</p>
|
|
|
|
<p>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>
|
|
|
|
<h4><a name="1.11">1.11</a>) Ist PostgreSQL Y2K (Jahr 2000) fähig?</h4>
|
|
|
|
<p>Ja, wir können Datumsangaben nach dem Jahr 2000 n.Chr. und vor 2000 v.Chr. leicht
|
|
verarbeiten.</p>
|
|
|
|
<h4><a name="1.12">1.12</a>) Wie kann ich im Entwicklerteam mitarbeiten?</h4>
|
|
|
|
<p>Zuerst laden Sie die neuesten Quellen herunter und lesen Sie die
|
|
PostgreSQL-Entwicklerunterlagen auf unserer Website oder in der
|
|
Distribution. Dann melden Sie sich zu den Entwickler-Mailinglisten
|
|
<em>pgsql-hackers</em> und <em>pgsql-patches</em> an. Anschließend senden Sie qualitativ
|
|
hochwertige Patches an die <em>pgsql-patches</em> Mailingliste.</p>
|
|
|
|
<p>Es gibt ungefähr ein Dutzend Leute, die das <em>commit</em>-Recht im
|
|
PostgreSQL <small>CVS</small>-Archiv haben. Alle haben derart viele hochwertige Patches
|
|
eingebracht, dass es für die <small>CVS</small>-Verwalter schwer war, mitzuhalten. Und
|
|
wir hatten Vertrauen, dass die von ihnen festgelegten Änderungen aller
|
|
Wahrscheinlichkeit nach von hoher Qualität sind.</p>
|
|
|
|
<h4><a name="1.13">1.13</a>) Wie sende ich einen Fehlerbericht?</h4>
|
|
|
|
<p>Bitte besuchen Sie die PostgreSQL-BugTool-Seite <a href="http://www.PostgreSQL.org/bugs/">http://www.PostgreSQL.org/bugs/</a>,
|
|
die Hinweise und Anleitungen zur Einreichung von Fehlerberichten enthält.
|
|
|
|
<p>Überprüfe auch den ftp-Server <a href="ftp://ftp.PostgreSQL.org/pub">ftp://ftp.PostgreSQL.org/pub</a>,
|
|
um nachzusehen, ob es eine neuere PostgreSQL-Version oder neue Patches gibt.</p>
|
|
|
|
<h4><a name="1.14">1.14</a>) Wie läuft PostgreSQL im Vergleich zu anderen Datenbanksystemen?</h4>
|
|
|
|
<p>Es gibt verschiedene Methoden, Software zu messen: Eigenschaften,
|
|
Leistung, Zuverlässigkeit, Support und Preis.</p>
|
|
|
|
<dl>
|
|
<dt><b>Eigenschaften</b></dt>
|
|
<dd><p>PostgreSQL besitt die meisten Eigenschaften - wie Transaktionen,
|
|
Unterabfragen (Subqueries), Trigger, Views und verfeinertes Locking -
|
|
die bei großen kommerziellen DBMS vorhanden sind. Es bietet außerdem
|
|
einige anderen Eigenschaften, die diese nicht haben, wie benutzerbestimmte
|
|
Typen, Vererbung, Regeln, und die Multi-Versionen-Steuerung zum Verringern
|
|
konkurrierender Locks.</p>
|
|
</dd>
|
|
|
|
<dt><b>Performanz</b></dt>
|
|
<dd><p>PostgreSQL weist eine Performanz auf, die mit der von kommerziellen
|
|
und anderen Open-Source-Datenbanken vergleichbar ist. In
|
|
manchen Bereichen ist es schneller, in anderen langsamen. Im
|
|
Vergleich zu MySQL oder abgespeckten Datenbank-Systemen sind
|
|
INSERT- und UPDATE-Anweisungen aufgrund des Transaktionsaufwands
|
|
langsamer. MySQL hat allerdings keine der oben erwähnten
|
|
Eigenschaften. PostgreSQL setzt auf Zuverlässigkeit und
|
|
Funktionsumfang, obwohl selbstredend ständig an Performanz-
|
|
Verbesserungen gearbeitet wird. Ein interessanter Vergleich
|
|
zwischen PostgreSQL und MySQL befindet sich unter dieser URL:
|
|
<a href="http://openacs.org/philosophy/why-not-mysql.html">http://openacs.org/philosophy/why-not-mysql.html</a></p>
|
|
</dd>
|
|
|
|
<dt><b>Zuverlässigkeit</b></dt>
|
|
<dd><p>Wir stellen fest, dass ein DBMS wertlos ist, wenn es nicht
|
|
zuverlässig arbeitet. Wir bemühen uns, nur streng geprüften,
|
|
beständigen Code freizugeben, der nur ein Minimum an Programmfehler
|
|
aufweist. Jede Freigabe hat mindestens einen Monat Betatest-Phase
|
|
hinter sich, und unsere Freigabehistorie beweist, dass wir stabile,
|
|
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, der
|
|
Zugriff auf die Handbücher und auf den Quellcode ermöglicht einen
|
|
im Vergleich zu anderen DBMS höherwertigen Support. Es gibt jedoch auch
|
|
Anbieter von kommerziellen Support-Leistungen (siehe FAQ-Punkt <a href="#1.6">1.6</a>).</p>
|
|
</dd>
|
|
<dt><b>Preis</b></dt>
|
|
<dd><p>PostgreSQL ist frei verfügbar, sowohl für die kommerzielle wie
|
|
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>
|
|
|
|
<h4><a name="1.15">1.15</a>) Wie kann ich PostgreSQL finanziell unterstützen?</h4>
|
|
|
|
<p>PostgreSQL hat seit dem Anfang in 1996 eine exzellente Infrastruktur.
|
|
Dies ist Marc Fournier zu verdanken, der sie über die Jahre
|
|
hinweg geschaffen und gepflegt hat.</p>
|
|
|
|
<p>Eine hochwertige Infrastruktur ist für ein Open-Source-Projekt wie dieses
|
|
sehr wichtig. Sie verhindert Probleme und Verzögerungen beim Fortschritt des
|
|
Projekts.</p>
|
|
|
|
<p>Selbstverständlich ist diese Infrastruktur nicht billig. Es gibt eine
|
|
Reihe von einmaligen und monatlich wiederkehrenden Kosten, die für
|
|
den Weiterbetrieb beglichen werden müssen. Falls Sie oder Ihre Firma
|
|
dazu finanziell beitragen können, besuchen Sie bitte die URL
|
|
<a href="http://store.pgsql.com/shopping/">http://store.pgsql.com/shopping/</a>
|
|
wo Sie eine Spende abgeben können.</p>
|
|
|
|
<p>Obwohl diese Web-Seite das Unternehmen "PostgreSQL, Inc." erwähnt, ist
|
|
der Bereich "contributions" (Beiträge) ausschliesslich für die
|
|
Unterstützung des PostgreSQL-Projekts da und nicht für die Finanzierung
|
|
einer bestimmten Firma. Sie können auch gerne einen finanziellen Beitrag
|
|
an die Kontaktadresse verschicken.</p>
|
|
|
|
<hr />
|
|
|
|
<h2 align="center">Fragen zu Benutzerprogrammen</h2>
|
|
|
|
<h4><a name="2.1">2.1</a>) Gibt es ODBC-Treiber für PostgreSQL?</h4>
|
|
|
|
<p>Es sind zwei ODBC-Treiber verfügbar: PsqlODBC und OpenLink ODBC.</p>
|
|
|
|
<p>PsqlODBC ist in der Distribution enthalten. Weitere Informationen können
|
|
unter <a href="ftp://ftp.PostgreSQL.org/pub/odbc/">ftp://ftp.PostgreSQL.org/pub/odbc/</a> abgerufen werden.</p>
|
|
|
|
<p>OpenLink ODBC kann unter <a href="http://www.openlinksw.com/">http://www.openlinksw.com</a> geholt werden. Die
|
|
Software arbeitet mit dem Standard-ODBC-Client der Firma, so dass
|
|
PostgreSQL-ODBC auf jeder Client-Plattform zur Verfügung steht, die
|
|
unterstützt wird (Win, Mac, Unix, VMS).</p>
|
|
|
|
<p>OpenLink wird dieses Produkt wahrscheinlich an Leute verkaufen, die
|
|
kommerziellen Support benötigen, dennoch wird immer eine
|
|
Freeware-Version verfügbar sein. Fragen dazu bitte an
|
|
<a href="mailto:postgres95@openlink.co.uk">postgres95@openlink.co.uk</a>. </p>
|
|
|
|
<p>Bitte beachten Sie auch das Kapitel zu ODBC im Progammer's Guide.</p>
|
|
|
|
<h4><a name="2.2">2.2</a>) Welche Werkzeuge gibt es, um Web-Seiten mit PostgreSQL zu
|
|
verbinden?</h4>
|
|
|
|
<p>Eine nette Einführung zu datenbank-gestützten Webseiten kann unter
|
|
<a href="http://www.webreview.com"> http://www.webreview.com</a> (engl.) abgerufen 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>
|
|
|
|
<h4><a name="2.3">2.3</a>) Hat PostgreSQL eine grafische Benutzerschnittstelle? Einen
|
|
Report-Generator? Eine eingebaute Query-Schnittstelle?</h4>
|
|
|
|
<p>Wir haben eine nette grafische Benutzerschnittstelle namens
|
|
PgAccess, der außerdem einen Reportgenerator enthält:
|
|
<a href="http://www.pgaccess.org">http://www.pgaccess.org</a></p>
|
|
|
|
<p>Die Distribution enthält außerdem <em>ecpg</em>, die eine eingebettete
|
|
SQL-Query-Schnittstelle für C zur Verfügung stellt.</p>
|
|
|
|
<h4><a name="2.4">2.4</a>) Welche Programmiersprachen und Schnittstellen gibt es?</h4>
|
|
|
|
<p>PostgreSQL bietet:</p>
|
|
<ul>
|
|
<li>C (libpq)</li>
|
|
|
|
<li>C++ (libpq++)</li>
|
|
|
|
<li>Embedded C (ecpg)</li>
|
|
|
|
<li>Java (jdbc)</li>
|
|
|
|
<li>Perl (perl5, DBD::Pg)</li>
|
|
|
|
<li>ODBC (odbc)</li>
|
|
|
|
<li>Python (PyGreSQL)</li>
|
|
|
|
<li>TCL (libpgtcl)</li>
|
|
|
|
<li>C Easy API (libpgeasy)</li>
|
|
|
|
<li>PHP ('pg_' functions, Pear::DB)</li>
|
|
</ul>
|
|
<hr />
|
|
<h2 align="center">Administrative Fragen</h2><p>
|
|
|
|
<h4><a name="3.1">3.1</a>) Wie installiere ich PostgreSQL woanders als in /usr/local/pgsql?</h4>
|
|
|
|
<p>Bei der Ausführung von <em>configure</em> die Option <em>--prefix</em> mit dem Zielverzeichnis
|
|
angeben.</p>
|
|
|
|
<h4><a name="3.2">3.2</a>) Wenn ich den <em>postmaster</em> starte, erhalte ich einen Nachricht
|
|
"Bad System Call" bzw. "core dumped". Wieso?</h4>
|
|
|
|
<p>Das kann verschiedene Ursachen haben. Überprüfen Sie zuerst, ob Ihr Kernel
|
|
System V Extensions unterstützt. PostgreSQL benötigt Kernel-Unterstützung
|
|
für Shared Memory und Semaphoren.</p>
|
|
|
|
<h4><a name="3.3">3.3</a>) Wenn ich versuche, den <em>postmaster</em> zu starten, bekomme ich <em>"IpcMemoryCreate"</em>-Fehlermeldungen. Warum?</h4>
|
|
|
|
<p>Entweder ist Shared Memory in Ihrem Kernel nicht korrekt konfiguriert, oder
|
|
Sie müssen den Shared Memory Bereich vergrößern. Die genaue Größe hängt
|
|
von Ihrer Systemarchitektur und von der Anzahl der Puffer und Serverprozesse
|
|
ab, die Sie für <em>postmaster</em> konfiguriert haben. Bei den voreingestellten
|
|
Werten für Puffer und Prozesse benötigen Sie bei den meisten Systemen
|
|
ein Minimum von ca. 1 MB. Der "PostgreSQL Administrator's Guide"
|
|
(<a href="http://www.PostgreSQL.org/idocs/index.php?kernel-resources.html">http://www.PostgreSQL.org/idocs/index.php?kernel-resources.html</a>)
|
|
enthält weitere Informationen zu Shared Memory und Semaphores.</p>
|
|
|
|
|
|
<h4><a name="3.4">3.4</a>) Wenn ich versuche, den <em>postmaster</em> zu starten, bekomme ich
|
|
"<em>IpcSemaphoreCreate</em>"-Fehlermeldungen. Warum?</h4>
|
|
|
|
<p>Falls die Fehlermeldung "<em>IpcSemaphoreCreate: semget failed (No space
|
|
left on device)</em>" lautet, ist Ihr Kernel mit zu wenig Semaphoren
|
|
konfiguriert. PostgreSQL benötigt eine Semaphore pro möglichem
|
|
Backend-Prozess. Eine Zwischenlösung wäre, <em>postmaster</em> mit einer
|
|
geringeren Anzahl an Backend-Prozessen zu starten. Benutzen Sie dazu die
|
|
<em>-N</em> Option mit einem kleineren Wert als die standardmäßigen 32. Eine
|
|
dauerhafte Lösung wäre es, die Parameter <small>SEMMNS</small> und <small>SEMMNI</small> Ihres Kernels
|
|
zu erhöhen.</p>
|
|
|
|
<p>Nichtfunktionierende Semaphores können außerdem bei hoher Datenbanklast
|
|
zu Abstürzen führen.</p>
|
|
|
|
<p>Falls die Fehlermeldung anders aussieht, ist möglicherweise keine
|
|
Semaphoren-Unterstützung in Ihrem Kernel aktiviert. Der "<em>PostgreSQL
|
|
Administrator's Guide</em>" <!--(<a href=""></a>)-->enthält weitere Informationen zu Shared Memory
|
|
und Semaphores.</p>
|
|
|
|
|
|
<h4><a name="3.5">3.5</a>) Wie regle ich Zugriffe von anderen Rechnern?</h4>
|
|
|
|
<p>PostgreSQL ist standardmäßig so eingestellt, dass Verbindungen nur vom
|
|
lokalen Rechner über Unix Domain Sockets möglich sind. Verbindungen
|
|
von anderen Rechnern über TCP/IP sind nur möglich, wenn der <em>postmaster</em>
|
|
mit der <em>-i</em> Option gestartet wird und die host-basierte Authentifizierung in
|
|
der Datei <em>$PGDATA/pg_hba.conf</em> entsprechend angepasst ist.</p>
|
|
|
|
|
|
<h4><a name="3.6">3.6</a>) Wie optimiere ich die Datenbank für bessere Leistung?</h4>
|
|
|
|
<p>Der Einsatz von Indizes sollte auf jeden Fall Abfragen beschleunigen. Die
|
|
Anweisung <small>EXPLAIN</small> zeigt, wie PostgreSQL Abfragen interpretiert und welche
|
|
Indizes benutzt werden.</p>
|
|
|
|
<p>Wenn Sie eine große Anzahl von <small>INSERT</small>-Anweisungen durchführen, sollten Sie
|
|
überlegen, ob die Durchführung mit der <small>COPY</small>-Anweisung in Frage kommt. Dies
|
|
funktioniert wesentlich schneller als einzelne <small>INSERT</small>-Befehle.
|
|
SQL-Anweisungen, die sich nicht in einem <small>BEGIN WORK</small>/<small>COMMIT</small> Transaktions-
|
|
Block befinden, werden als eigene Transaktionen behandelt. Überlegen Sie,
|
|
ob die Anweisungen nicht in einen einzelnen Transaktionsblock zusammen-
|
|
gefasst werden können. Das reduziert den Transaktionsaufwand. Überlegen
|
|
Sie auch, bei größeren Datenänderungen Indizes zu löschen und danach
|
|
wiederherzustellen.</p>
|
|
|
|
<p>Es gibt verschiedene Tuning-Optionen. Sie können <em>fsync()</em> ausschalten,
|
|
indem Sie beim Starten des <em>postmaster</em> die Optionen <em>-o -F</em> angeben. Das
|
|
hindert <em>fsync()</em>-Operationen daran, nach jeder Transaktion die Daten direkt
|
|
auf die Festplatte zu schreiben.</p>
|
|
|
|
<p>Sie können auch mit der <em>-B</em> Option des <em>postmaster</em> die Anzahl der
|
|
Shared Memory Puffer für die Backend-Prozesse erhöhen. Falls Sie diesen Wert
|
|
jedoch zu hoch setzen, kann es vorkommen, dass der <em>postmaster</em> nicht startet,
|
|
weil die Obergrenze der Speicherzuweisung für Shared Memory überschritten
|
|
wird. Jeder Puffer ist 8 kB groß, standardmäßig gibt es 64 Puffer.</p>
|
|
|
|
<p>Sie können auch die <em>-S</em> Option des Backends nutzen, um die Größe
|
|
des Speicherplatzes für temporäres Sortieren zu erhöhen. Der <em>-S</em> Wert
|
|
wird in Kilobyte gemessen und ist standardmäßig auf 512 kB festgelegt.</p>
|
|
|
|
<p>Die <small>CLUSTER</small>-Anweisung kann benutzt werden, um Daten in Basistabellen zu
|
|
gruppieren, so dass sie auf einen Index zusammengebracht werden. Siehe
|
|
auch die <small>CLUSTER(l)</small> Man-Page für weitere Details.</p>
|
|
|
|
<h4><a name="3.7">3.7</a>) Welche Debugging-Funktionen sind für PostgreSQL verfügbar?</h4>
|
|
|
|
<p>PostgreSQL hat einige Möglichkeiten, Statusinformationen anzuzeigen,
|
|
die bei der Fehlersuche nützlich sein können.</p>
|
|
|
|
<p>Wenn Sie PostgreSQL mit dem <em>--enable-cassert</em> Option kompiliert
|
|
haben, verfolgen zahlreiche <em>assert()</em>-Anweisungen den Ablauf des
|
|
Backends und halten das Programm an, wenn etwas Unerwartetes passiert.</p>
|
|
|
|
<p>Sowohl der <em>postmaster</em> als auch <em>postgres</em> stellen mehrere
|
|
Debug-Optionen zur Verfügung. Stellen Sie zuerst sicher, dass Sie den Standard-Output
|
|
und den Fehlerkanal in eine Datei umleiten, wenn Sie den <em>postmaster</em> starten:</p>
|
|
<pre>
|
|
cd /usr/local/pgsql
|
|
./bin/postmaster >server.log 2>&1 &
|
|
</pre>
|
|
|
|
<p>Dadurch wird die Datei <em>server.log</em> im PostgreSQL-Verzeichnis erzeugt. Diese
|
|
Datei enthält nützliche Informationen über Probleme oder Fehler, die
|
|
im Server aufgetreten sind. <em>postmaster</em> hat eine <em>-d</em> Option, die noch
|
|
detailliertere Informationen liefert. Zur <em>-d</em> Option wird eine Nummer
|
|
angegeben, die den Debug-Level - also die Menge der berichteten
|
|
Information - angibt. Achtung, hohe Debug-Levels erzeugen schnell große
|
|
Logdateien!</p>
|
|
|
|
<p>Wenn der <em>postmaster</em> nicht läuft, können Sie sogar den <em>postgres</em>-Backend
|
|
von der Befehlszeile ausführen und eine <small>SQL</small>-Anweisung direkt eingeben.
|
|
Dies ist <em>nur</em> für Debugging-Zwecke zu empfehlen. Beachten Sie, dass ein
|
|
Zeilenumbruch, und nicht das Semikolon die <small>SQL</small>-Anweisung beendet.
|
|
Falls Sie PostgreSQL mit Debugging-Symbolen kompiliert haben, können Sie
|
|
mit einem Debugger sehen, was passiert. Da das Backend jedoch nicht vom
|
|
<em>postmaster</em> gestartet wurde, läuft es nicht in der gleichen
|
|
Umgebung und deshalb können einige locking/backend Operationen nicht
|
|
reproduziert werden.</p>
|
|
|
|
<p>Wenn dagegen der <em>postmaster</em> läuft, führen Sie <em>psql</em> in einem Fenster aus, dann
|
|
ermitteln Sie die Prozessnummer (<small>PID</small>) des <em>postgres</em>-Prozesses, der von <em>psql</em>
|
|
verwendet wird. Binden Sie einen Debugger an diese <small>PID</small> und führen Sie
|
|
Abfragen von <em>psql</em> aus. Wenn Sie den postgres-Serverstart analysieren wollen,
|
|
setzen Sie die Umgebungsvariable <em>PGOPTIONS="-W </em>n<em>"</em>, und starten Sie dann
|
|
<em>psql</em>. Dies verzögert den Start um <em>n</em> Sekunden, damit Sie einen Debugger an
|
|
den Prozess binden können und ggf. Breakpoints setzen, bevor die
|
|
Startsequenz begonnen wird.</p>
|
|
|
|
<p>Das Programm <em>postgres</em> hat auch die Optionen <em>-s</em>, <em>-A</em> und <em>-t</em>, die bei der Fehlersuche
|
|
und Performanzmessung sehr nützlich sein können.</p>
|
|
|
|
<p>Sie können die Anwendung auch mit Profiling kompilieren, um zu sehen,
|
|
welche Funktionen wieviel Ausführungszeit beanspruchen. Das Backend
|
|
Profil wird im Verzeichnis <em>pgsql/data/base/dbname</em> abgelegt. Das
|
|
Client-Profil wird in das aktuelle Verzeichnis abgelegt. Bitte beachtern Sie,
|
|
dass unter Linux PostgreSQL mit der Option <em>-DLINUX_PROFILE</em> kompiliert werden
|
|
muß, um Profiling nutzen zu können.</p>
|
|
|
|
<h4><a name="3.8">3.8</a>) Ich bekomme die Meldung "<em>Sorry, too many clients</em>", wenn ich eine
|
|
Verbindung augzubauen versuche. Warum?</h4>
|
|
|
|
<p>Sie müssen die maximale Anzahl der gleichzeitig ausfühbaren Backend-
|
|
Prozesse hochsetzen.</p>
|
|
|
|
<p>Die Voreinstellung ist 32 Prozesse. Sie können diese erhöhen, indem Sie
|
|
den <em>postmaster</em> mit einem entsprechenden <em>-N</em> Parameter starten bzw. die
|
|
Konfigurationsdatei <em>postgresql.conf</em> anpassen.</p>
|
|
|
|
<p>Bitte beachten Sie, dass Sie auch <em>-B</em> auf ein Wert größer als die Voreinstellung
|
|
von 64 setzen müssen, wenn Sie <em>-N</em> auf einen Wert höher als 32 setzen;
|
|
<em>-B</em> muss mindestens das Doppelte von <em>-N</em> betragen, und einer besseren
|
|
Performanz wegen sollte der Wert noch höher sein. Bei einer hohen Anzahl von
|
|
Backend-Prozessen kann es vorkommen, dass Sie einige Unix-Kernel-
|
|
Parameter ebenfalls erhöhen müssen. Folgende Parameter sind zu überprüfen:
|
|
die Maximalgröße der Shared Memory Blocks <small>SHMMAX</small>; die Maximalanzahl der
|
|
Semaphoren <small>SEMMNS</small> und <small>SEMMNI</small>; die maximale Anzahl von Prozessen NPROC;
|
|
die maximale Anzahl von Prozessen pro User MAXUPRC; und die Maximalzahl
|
|
der geöffneten Dateien <small>NFILE</small> und <small>NINODE</small>. Durch die Begrenzung der Anzahl
|
|
erlaubter Backend-Prozesse wird verhindert, dass System-Ressourcen
|
|
durch PostgreSQL aufgebraucht werden.</p>
|
|
|
|
<p>In den PostgreSQL-Versionen vor 6.5 war die maximale Anzahl von Backends
|
|
auf 64 festgelegt und eine Änderung setzte eine erneute Kompilierung
|
|
voraus, bei der die Konstante <em>MaxBackendId</em> in <em>include/storage/sinvaladt.h</em>
|
|
entsprechend angepasst werden mußte.
|
|
|
|
<h4><a name="3.9">3.9</a>) Was befindet sich im Verzeichnis <em>pgsql_tmp/</em>?</h4>
|
|
|
|
<p>Dieses Verzeichnis enthält temporäre Dateien, die durch den <em>query executor</em>
|
|
erzeugt werden. Wenn zum Beispiel eine Sortierung durchgeführt werden muß,
|
|
um ein <small>ORDER BY</small> auszuführen, und diese Sortierung mehr Hauptspeicher
|
|
benötigt, als mit dem Backend-Parameter <em>-S</em> erlaubt wurde, dann werden
|
|
diese Dateien erzeugt, um die Daten dort zu auszulagern.</p>
|
|
|
|
<p>Die temporären Dateien sollten automatisch gelöscht werden. Falls das
|
|
Backend jedoch während einer Sortierung abstürzen sollte, bleiben sie
|
|
erhalten. Nach einem Neustart des <em>postmaster</em> werden sie
|
|
auomatisch gelöscht.</p>
|
|
|
|
<h4><a name="3.10">3.10</a>) Warum muß ich bei jeder neuen Hauptversion von PostgreSQL
|
|
die komplette Datenbank exportieren und anschließend reimportieren?</h4>
|
|
|
|
<p>Zwischen "kleinen" PostgreSQL-Versionsänderungen (z.B. zwischen
|
|
7.2 und 7.2.1) werden keine strukturellen Änderungen durchgeführt,
|
|
wodurch ein erneutes Aus- und Einlesen der Daten nicht benötigt wird.
|
|
Allerdings wird bei "großen" Versionsänderungen (z.B. zwischen 7.2 und 7.3)
|
|
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.
|
|
Durch das Exportieren werden die Daten in einem generischen Format
|
|
ausgegeben, wodurch die Importierung in das neue interne Format
|
|
ermöglicht wird.</p>
|
|
|
|
<p>Bei Versionenwechseln, wo kein Formatänderungen stattgefunden haben,
|
|
kann das <em>pg_upgrade</em>-Skript benutzt werden, um die Daten ohne Aus-
|
|
und Einlesen zu übertragen. Die jeweilige Dokumentation gibt an, ob für
|
|
die betreffende Version <em>pg_upgrade</em> verfügbar ist.</p>
|
|
|
|
<hr />
|
|
|
|
<h2 align="center">Fragen zum Betrieb</h2>
|
|
|
|
<h4><a name="4.1">4.1</a>) Worin besteht der Unterschied zwischen Binary Cursors und Normal
|
|
Cursors?</h4>
|
|
|
|
<p>Vgl. die <small>DECLARE</small> Man-Page für eine Beschreibung.</p>
|
|
|
|
<h4><a name="4.2">4.2</a>) Wie wähle ich per <small>SELECT</small>-Anweisung nur die ersten paar
|
|
Zeilen in einer Abfrage aus?</h4>
|
|
|
|
<p>Vgl. die <small>FETCH</small> Man-Page, oder benutzen Sie <small>SELECT ... LIMIT...</small> .
|
|
|
|
<p>Selbst wenn Sie nur die ersten paar Zeilen einer Tabelle abfragen möchten,
|
|
muß unter Umständen die komplette Abfrage abgearbeitet werden. Ziehen Sie also
|
|
möglichst eine Abfrage in Erwägung, die eine <small>ORDER BY</small>-Anweisung
|
|
benutzt, die wiederum auf indizierte Spalten verweist. In diesem Fall kann
|
|
PostgreSQL direkt nach den gewünschten Zeilen suchen und braucht nicht
|
|
jede mögliche Ergebniszeile abzuarbeiten.</p>
|
|
|
|
<p>Bitte beachten Sie, dass mit PostgreSQL 7.3 die Syntax <small>LIMIT <em>n</em>, <em>m</em></small>
|
|
durch <small>LIMIT <em>n</em> OFFSET <em>m</em></small> ersetzt wurde.</p>
|
|
|
|
|
|
<h4><a name="4.3">4.3</a>) Wie bekomme ich eine Liste der Tabellen oder anderen Dinge, die ich
|
|
in <em>psql</em> sehen kann?</h4>
|
|
|
|
<p>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.</p>
|
|
|
|
<h4><a name="4.4">4.4</a>) Wie entferne ich eine Spalte aus einer Tabelle?</h4>
|
|
|
|
<p>Der Syntax <small>ALTER TABLE DROP COLUMN</small> wird erst ab PostgreSQL 7.3 unterstützt.</p>
|
|
|
|
<p>Bei früheren Versionen bietet das folgende Verfahren Ersatz:</p>
|
|
<pre>
|
|
BEGIN;
|
|
LOCK TABLE old_table;
|
|
SELECT ... -- alle außer der zu entfernenden Spalte hier auswählen
|
|
INTO TABLE new_table
|
|
FROM old_table;
|
|
DROP TABLE old_table;
|
|
ALTER TABLE new_table RENAME TO old_table;
|
|
COMMIT;
|
|
</pre>
|
|
|
|
<h4><a name="4.5">4.5</a>) Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine Datenbank?</h4>
|
|
|
|
<p>Es bestehen folgende Obergrenzen:</p>
|
|
<pre>
|
|
Maximale Größe eine Datenbank? unbeschränkt (es existieren
|
|
Datenbanken mit >1TB)
|
|
Maximale Größe einer Tabelle? 16 TB
|
|
Maximale Größe einer Zeile? 1,6 TB
|
|
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 Indizies für eine Tabelle?
|
|
unbeschränkt
|
|
</pre>
|
|
<p>Selbstverständlich sind dies theoretische Werte, die oft durch die
|
|
verfügbaren Platten- und Speicherressourcen eingeschränkt sind.
|
|
Extreme Größen können zu Leistungseinbußen führen.</p>
|
|
|
|
<p>Die maximale Tabellengröße von 16 TB benötigt keine Large-File-Unterstützung
|
|
im Betriebssystem. Große Tabellen werden in Dateien mit einer Größe von
|
|
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
|
|
gesteigert werden, wenn die Default-Blockgröße auf 32 KB heraufgesetzt
|
|
wird.</p>
|
|
|
|
<h4><a name="4.6">4.6</a>) Wieviel Plattenplatz wird benötigt, um die Daten aus einer typischen
|
|
Textdatei abzuspeichern? </h4>
|
|
|
|
<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 6,4 MB:</p>
|
|
<pre>
|
|
36 Bytes: jeder Zeilenkopf (ungefähr)
|
|
+24 Bytes: ein Integer-Feld und ein Textfeld
|
|
+ 4 Bytes: Zeiger auf der Datenseite auf den Tupel
|
|
-----------------------------------------------
|
|
64 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
|
|
--------------------- = 128 Zeilen pro Seite (abgerundet)
|
|
64 Bytes pro Zeile
|
|
|
|
100.000 Datenzeilen
|
|
----------------------- = 782 Datenbankseiten (aufgerundet)
|
|
128 Zeilen pro Seite
|
|
|
|
782 Datenbankseiten * 8192 Bytes pro Seite = 6.406.144 Byte (6,4 MB)
|
|
</pre>
|
|
<p>Indizes 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 in Bitmaps gespeichert, wodurch sie sehr wenig
|
|
Platz in Anspruch nehmen.</p>
|
|
|
|
<h4><a name="4.7">4.7</a>) Wie finde ich heraus, welche Indizes oder Operationen in der Datenbank
|
|
definiert sind?</h4>
|
|
|
|
<p><em>psql</em> hat eine Vielzahl von Backslash-Befehlen, mit denen solche Informationen
|
|
angezeigt werden können. Der Befehl <em>\?</em> zeigt eine Übersicht. Außerdem
|
|
zeigt der Befehl <em>\l</em> eine Liste von allen verfügbaren Datenbanken an.
|
|
|
|
<p>Die Datei <em>pgsql/src/tutorial/syscat.source</em> enthält außerdem viele
|
|
<small>SELECT</small>-Anweisungen, mit deren Hilfe man Information über die Systemtabellen
|
|
erhalten kann.</p>
|
|
|
|
<h4><a name="4.8">4.8</a>) Meine Abfragen sind langsam oder nutzen die Indizes nicht. Warum?</h4>
|
|
|
|
<p>Indizes werden nicht automatisch bei jeder Abfrage verwendet. Indizes werden
|
|
nur dann verwendet, wenn die abzufragende Tabelle eine bestimmte Größe
|
|
übersteigt, und die Abfrage nur eine kleine Prozentzahl der Tabellenzeilen
|
|
abfragt. Grund hierfür ist, dass die durch einen Index verursachten
|
|
Festplattenzugriffe manchmal langsamer sind 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 Indizes verwendet werden sollen. Statistiken sind auch
|
|
bei der Feststellung optimaler <small>JOIN</small>-Reihenfolge und -Methoden wertvoll.</p>
|
|
|
|
<p>Indizes 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. Dadurch wird es
|
|
auch möglich, die Minimal- und Maximalwerte einer Abfrage unter
|
|
Verwendung von Indizes zu ermitteln:</p>
|
|
<pre>
|
|
SELECT spalte
|
|
FROM tabelle
|
|
ORDER BY spalte [ DESC ]
|
|
LIMIT 1
|
|
</pre>
|
|
<p>(Die Aggregatfunktionen MIN() und MAX() verwenden keine Indizes). </p>
|
|
|
|
<p>Bei der Nutzung von Wildcard-Operatoren wie <small>LIKE</small> oder <small>~</small>, können
|
|
Indizes nur unter bestimmten Umständen verwendet werden:</p>
|
|
<ul>
|
|
<li>Der Anfang des Suchmusters muß mit dem Anfang des Strings
|
|
verknüpft werden, 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>)
|
|
anfangen</li>
|
|
</ul>
|
|
<p>Suchmuster, die Gross- und Kleinschreibung nicht berücksichtigen (z.B.
|
|
<small>ILIKE</small> bzw. <small>~*</small>), verwenden keine Indizes. Stattdessen können
|
|
funktionale Indizes verwendet werden, die im Punkt <a href="#4.12">4.12</a> beschrieben werden.</p>
|
|
|
|
<p>Die C-Locale muß während der Datenbank-Initialisierung mit <em>initdb</em>
|
|
bestimmt worden sein.</p>
|
|
|
|
<h4><a name="4.9">4.9</a>) Auf welche Weise kann ich sehen, wie der Abfrage-Optimierer meine
|
|
Abfrage auswertet?</h4>
|
|
|
|
<p>Vgl. die <em>EXPLAIN</em> Man-Page.</p>
|
|
|
|
<h4><a name="4.10">4.10</a>) Was ist ein R-Tree Index?</h4>
|
|
|
|
<p>Ein R-Tree Index wird benutzt, um räumliche Daten zu indizieren. Ein
|
|
Hash-Index kann nicht für Bereichssuchen genutzt werden. Ein B-Tree
|
|
Index kann nur für Bereichssuchen in eindimensionalen Daten genutzt
|
|
werden. R-Trees können multi-dimensionale Daten abhandeln. Ein
|
|
Beispiel: Wenn ein R-Tree Index auf ein Attribut vom Typ <small>POINT</small>
|
|
gebildet wird, dann kann das System Abfragen wie z.B. "Zeige alle
|
|
Punkte, die sich in einem umgebenden Rechteck befinden" effizienter
|
|
beantworten.</p>
|
|
|
|
<p>Die kanonische Veröffentlichung, die das originale R-Tree Design
|
|
beschreibt, ist:</p>
|
|
|
|
<p>Guttman, A. "R-Trees: A Dynamic Index Structure for Spatial Searching."
|
|
Proc of the 1984 ACM SIGMOD Int'l Conf on Mgmt of Data, 45-57.</p>
|
|
|
|
<p>Sie können dieses Werk auch in Stonebrakers "Readings in Database
|
|
Systems" finden.</p>
|
|
|
|
<p>Die eingebauten R-Trees können Polygone und Rechtecke verarbeiten.
|
|
Theoretisch können R-Trees auf eine hohe Anzahl von Dimensionen
|
|
erweitert werden. Praktisch bedingt diese Erweiterung eine Menge
|
|
Arbeit und wir haben derzeit keinerlei Dokumentation darüber, wie das
|
|
zu machen wäre.</p>
|
|
|
|
<h4><a name="4.11">4.11</a>) Was ist der "<em>Genetic Query Optimizer</em>"?</h4>
|
|
|
|
<p>Das GEQO-Modul in PostgreSQL soll dazu dienen, das Optimierungsproblem
|
|
beim <small>JOIN</small> von vielen Tabellen auf der Basis genetischer Algorithmen
|
|
(GA) zu lösen. Es ermöglicht die Behandlung von großen JOIN-Queries durch
|
|
eine nicht-erschöpfende Suche.</p>
|
|
|
|
<h4><a name="4.12">4.12</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?</h4>
|
|
|
|
<p>Der Operator <em>~</em> bewirkt die Anwendung eines regulären Ausdrucks. <em>~*</em> führt
|
|
zur Anwendung eines regulären Ausdrucks mit Ignorierung der Groß-
|
|
und Kleinschreibung.</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>Ein funktionaler Index, der wie folgt erstellt wird, wird auf jeden Fall
|
|
verwendet:</p>
|
|
<pre>
|
|
CREATE INDEX tabelle_index ON tabelle (LOWER(spalte))
|
|
</pre>
|
|
<h4><a name="4.13">4.13</a>) Wie ermittle ich in einer Abfrage, ob ein Feld NULL ist?</h4>
|
|
|
|
<p>Testen Sie die Spalte mit <small>IS NULL</small> bzw. <small>IS NOT NULL</small>.</p>
|
|
|
|
<h4><a name="4.14">4.14</a>) Was ist der Unterschied zwischen den verschiedenen <small>CHAR</small>-Typen?</h4><pre>
|
|
Typ interner Name Bemerkungen
|
|
-------------------------------------------------
|
|
"char" char 1 Zeichen
|
|
CHAR(n) bpchar mit Leerzeichen gefüllt bis zur angegebenen Länge
|
|
VARCHAR(n) varchar die Größe legt die Maximallänge fest; kein
|
|
Ausfüllen mit Leerzeichen
|
|
TEXT text Die Länge wird nur durch die maximale Zeilenlänge
|
|
beschränkt
|
|
BYTEA bytea Bytearray mit variabler Länge
|
|
</pre>
|
|
<p>Der <em>interne Name</em> kommt vor allem in den Systemkatalogen und in manchen
|
|
Fehlermeldungen vor.</p>
|
|
|
|
<p>Die letzten 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><small>CHAR(n)</small> ist geeignet für die Speicherung von Zeichenketten ähnlicher Länge.
|
|
VARCHAR(n) ist geeignet für Zeichenketten abweichender Längen, setzt jedoch
|
|
eine maximale Länge. <small>TEXT</small> setzt keine Längengrenze, allerdings gibt es
|
|
eine systembedingte Obergrenze von 1 GB. <small>BYTEA</small> ist für binäre Daten,
|
|
besonders für Werte, die <small>NULL</small>-Bytes haben. Die erwähnten Typen weisen
|
|
ähnliche Performanzeigenschaften auf.</p>
|
|
|
|
<h4><a name="4.15.1">4.15.1</a>) Wie erzeuge ich ein serielles Feld mit automatischer Erhöhung des
|
|
Werts?</h4>
|
|
|
|
<p>PostgreSQL bietet einen <small>SERIAL</small>-Datentyp. Dieser erzeugt automatisch
|
|
eine Sequenz und einen Index 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
|
|
);
|
|
CREATE UNIQUE INDEX person_id_key ON person ( id );
|
|
</pre><p> umgewandelt.</p>
|
|
|
|
<p>Die <em>create_sequence</em> Man-Page liefert weitere Informationen über Sequenzen.
|
|
Es ist auch möglich, den <small>OID</small>-Wert jeder Spalte als einmaligen Wert
|
|
einzusetzen. Sollten Sie allerdings die Datenbank exportieren und
|
|
reimportieren wollen, müssen Sie die Option <em>-o</em> von <em>pg_dump</em> bzw. <small>COPY
|
|
WITH OIDS</small> verwenden, um die <small>OID</small>s beizubehalten.</p>
|
|
|
|
<h4><a name="4.15.2">4.15.2</a>) Wie bekomme ich den Wert einer <small>SERIAL</small>-Sequenz?</h4>
|
|
|
|
<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.15.1">4.15.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>
|
|
<p>Schließlich besteht noch die Möglichkeit, den von einer <small>INSERT</small>-Anweisung
|
|
zurückgelieferten <small>OID</small>-Wert als einmaligen Wert zu verwenden.
|
|
In Perl mit dem <em>DBD::Pg</em>-Modul von Edmund Mergl wird der OID-Wert nach einem
|
|
<em>$sth->excute()</em> über <em>$sth->{pg_oid_status}</em> zurückgeliefert.</p>
|
|
|
|
<h4><a name="4.15.3">4.15.3</a>) Führen <em>currval()</em> und <em>nextval()</em> zu einer Race-Condition mit anderen
|
|
Nutzern?</h4>
|
|
|
|
<p>Nein. Die Funktionen liefern einen Wert zurück, der von Ihrem Backend
|
|
bestimmt wird, und der anderen Benutzern nicht zur Verfügung steht.</p>
|
|
|
|
<h4><a name="4.15.4">4.15.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?</h4>
|
|
|
|
<p>Um die konkurrente Verarbeitung zu verbessern, werden Sequenzwerte
|
|
nach Bedarf an laufende Transaktionen zugeteilt und erst beim
|
|
Abschluß der Transaktion gesperrt. Durch abgebrochene Transaktionen werden
|
|
Lücken in der Sequenznummerierung verursacht.</p>
|
|
|
|
|
|
<h4><a name="4.17">4.16</a>) Was ist ein <small>OID</small>? Was ist ein <small>TID</small>?</h4>
|
|
|
|
<p>OIDs sind PostgreSQLs Antwort auf eindeutige Zeilen-IDs. Jede Zeile,
|
|
die in PostgreSQL erzeugt wird, bekommt eine eindeutige OID. Alle
|
|
OIDs, die durch initdb erzeugt werden, sind kleiner als 16384 (siehe
|
|
include/access/transam.h). Alle OIDs, die durch den Benutzer erzeugt
|
|
werden, sind gleich oder größer als dieser Wert. Standardmäßig sind
|
|
all OIDs nicht nur innerhalb einer Tabelle oder Datenbank,
|
|
sondern in der gesamten PostgreSQL-Installation einmalig.</p>
|
|
|
|
<p>PostgreSQL benutzt OIDs in seinen internen Systemtabellen, um Zeilen
|
|
in JOINs zwischen Tabellen zu verknüpfen. Es ist möglich, einen Index
|
|
für die OID-Spalte zu erstellen, wodurch schnellere Zugriffszeiten
|
|
erreicht werden können. Es wird empfohlen, OID-Werte in Spalten vom Typ OID
|
|
zu speichern.</p>
|
|
|
|
<p>OIDs werden allen neuen Zeilen von einem zentralen Bereich, der von
|
|
allen Datenbanken genutzt wird, zugewiesen. Nichts hindert Sie daran,
|
|
die OID zu ändern, oder eine Kopie der Tabelle mit den originalen Oids
|
|
anzulegen:</p>
|
|
<pre>
|
|
CREATE TABLE new_table(old_oid OID, mycol INT);
|
|
SELECT INTO new SELECT old_oid, mycol FROM old;
|
|
COPY new TO '/tmp/pgtable';
|
|
DELETE FROM new;
|
|
COPY new WITH OIDS FROM '/tmp/pgtable';
|
|
</pre>
|
|
|
|
<h4><a name="4.17">4.17</a>) Welche Bedeutung haben die verschiedenen Ausdrücke, die in
|
|
PostgreSQL benutzt werden (z.B. attribute, class,...)?</h4>
|
|
|
|
<p>Einige der Quelltexte und die ältere Dokumentation nutzen allgemeine
|
|
Begriffe. Hier sind einige aufgeführt:</p>
|
|
<ul>
|
|
<li>row, record, tuple</li>
|
|
<li>attribute, field, column</li>
|
|
<li>table, class</li>
|
|
<li>retrieve, SELECT</li>
|
|
<li>replace, UPDATE</li>
|
|
<li>append, INSERT</li>
|
|
<li>oid, serial value</li>
|
|
<li>portal, cursor</li>
|
|
<li>range variable, table name, table alias</li>
|
|
</ul>
|
|
|
|
<p>Eine allgemeine Liste der Datenbank-Terminologie erhalten Sie hier:
|
|
<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>
|
|
(engl.).</p>
|
|
|
|
<h4><a name="4.18">4.18</a>) Wieso bekomme ich einen Fehler: "<em>ERROR: Memory exhausted in
|
|
AllocSetAlloc()</em>"?</h4>
|
|
|
|
<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>
|
|
|
|
<h4><a name="4.19">4.19</a>) Wie kann ich feststellen, welche PostgreSQL-Version bei mir läuft?</h4>
|
|
|
|
Geben Sie in <em>psql</em> <small>SELECT VERSION();</small> ein.
|
|
|
|
<h4><a name="4.20">4.20</a>) Bei "large-object"-Operationen kommt die Fehlermeldung: "<em>invalid
|
|
large obj descriptor</em>". Warum?</h4>
|
|
|
|
<p>Sie sollten die Anweisungen <small>BEGIN WORK</small> und <small>COMMIT</small> bei jeden Gebrauch von
|
|
Large Objects benutzen. Also um <small>lo_open ... lo_close</small>.</p>
|
|
|
|
<p>Derzeit erzwingt PostgreSQL diese Regel, indem es die Handles der
|
|
Large Objects beim <small>COMMIT</small> der Transaktion schließt. So führt der erste
|
|
Versuch, etwas mit dem <em>Large Object</em> zu machen, zu einer Meldung
|
|
"<em>invalid large obj descriptor</em>". Solange Sie keine Transaktionen benutzen,
|
|
wird der Code, der in älteren PostgreSQL-Versionen funktionierte,
|
|
nun diese Fehlermeldung erzeugen.</p>
|
|
|
|
<p>Falls Sie eine Client-Schnittstelle wie ODBC benutzen, kann es sein,
|
|
dass die <em>auto-commit</em>-Option ausgeschaltet werden muss.</p>
|
|
|
|
<h4><a name="4.21">4.21</a>) Wie kann ich eine Spalte erstellen, deren Default-Wert immer
|
|
die aktuelle Uhrzeit enthalten soll?</h4>
|
|
|
|
<p>Dazu verwenden Sie <small>CURRENT_TIMESTAMP</small>:</p>
|
|
<pre>
|
|
CREATE TABLE test (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
|
|
</pre>
|
|
<h4><a name="4.22">4.22</a>) Warum sind meine Unterabfragen (subqueries), die IN verwenden,
|
|
so langsam?</h4>
|
|
|
|
<p>Derzeit werden Unterabfragen mit der äusseren Abfrage verbunden, indem
|
|
für jede Reihe der äusseren Query die Ergebnisse der Unterabfrage
|
|
sequentiell geprüft werden. Um dies zu vermeiden, kann man <small>IN</small> durch
|
|
<small>EXISTS</small> ersetzen, z.B.:</p>
|
|
<pre>
|
|
SELECT *
|
|
FROM tabelle_1
|
|
WHERE spalte1 IN (SELECT spalte2 FROM tabelle_2)
|
|
</pre>
|
|
<p>in:</p>
|
|
<pre>
|
|
SELECT *
|
|
FROM tabelle_1
|
|
WHERE EXISTS (SELECT spalte2 FROM tabelle_2 WHERE spalte1 = spalte2)
|
|
</pre>
|
|
<p> Damit diese Abfrage effizient durchgeführt wird, sollte für '<em>spalte2</em>'
|
|
ein Index angelegt worden sein. Die Einschränkung von Abfragen mit <small>IN</small>
|
|
soll in einer künftigen PotsgreSQL-Version behoben werden.</p>
|
|
|
|
<h4><a name="4.23">4.23</a>) Wie führe ich einen <small>OUTER JOIN</small> durch?</h4>
|
|
|
|
<p>PostgreSQL ab der Version 7.1 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>FULL JOIN</small> würde dagegen alle verknüpften Zeilen sowie jeweils alle
|
|
unverknüpften Zeilen aus den beiden Tabellen verknüpfen. Die Angabe von
|
|
OUTER 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>
|
|
|
|
<p>In früheren Versionen von PostgreSQL können <small>OUTER JOIN</small>s mittels <small>UNION</small>
|
|
und <small>NOT IN</small> simuliert werden. Zum Beispiel '<em>tabelle_1</em>' und '<em>tabelle_2</em>'
|
|
können als <small>LEFT OUTER JOIN</small> auch so verknüpft werden:</p>
|
|
<pre>
|
|
SELECT t1.spalte1, t2.spalte2
|
|
FROM tabelle_1 t1, tabelle_2 t2
|
|
WHERE t1.spalte1 = t2.spalte1
|
|
UNION ALL
|
|
SELECT t1.spalte1, NULL
|
|
FROM tabelle_1 t1
|
|
WHERE t1.spalte1 NOT IN (SELECT t2.spalte1 FROM tabelle_2 t2)
|
|
ORDER BY spalte1
|
|
</pre>
|
|
|
|
<h4><a name="4.24">4.24</a>) Wie kann ich Abfragen über mehrere Datenbanken hinweg ausführen?</h4>
|
|
|
|
<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> ermöglicht datenbankübergreifende Abfragen.</p>
|
|
|
|
<p>Es ist natürlich möglich, dass eine Client-Anwendung gleichzeitige Verbindungen
|
|
zu verschiedenen Datenbanken aufbaut und selber Datensätze zusammenfügt.</p>
|
|
|
|
<h4><a name="4.25">4.25</a>) Wie kann ich mehrere Zeilen bzw. Spalten von einer Funktion
|
|
zurückgeben lassen?</h4>
|
|
|
|
<p>"<em>Result sets</em>" können mittels <em>refcursors</em> von <small>PL/PgSQL</small>-Funktionen zurückgegeben
|
|
werden. Vgl.:
|
|
<a href="http://www.postgresql.org/idocs/index.php?plpgsql-cursors.html">http://www.postgresql.org/idocs/index.php?plpgsql-cursors.html</a>
|
|
(Abschnitt 23.7.3.3).</p>
|
|
|
|
<h4><a name="4.26">4.26</a>) Warum kann ich temporäre Tabellen in <small>PL/PgSQL</small>-Funktionen nicht
|
|
zuverlässig erstellen bzw. löschen?</h4>
|
|
|
|
<p><small>PL/PgSQL</small> verarbeitet die Inhalte einer Funktion in einer Cache. Dies hat
|
|
eine unangenehme Nebenwirkung, nämlich dass wenn eine <small>PL/PgSQL</small>-
|
|
Funktion auf eine temporäre Tabelle zugreift, und diese Tabelle
|
|
anschließend gelöscht bzw. neu erstellt wird, die Funktion
|
|
fehlschlagen wird, da die gecachte Funktionsinhalte noch auf die alte
|
|
temporäre Tabelle zeigen.</p>
|
|
|
|
<p>Die Lösung für diese Probleme besteht darin, in der Funktion mittels
|
|
<small>EXECUTE</small> auf temporäre Tabellen zuzugreifen. Diese bewirkt, dass bei
|
|
jedem Funktionsruf die betreffende Abfrage von <small>PL/PgSQL</small> neu geparst wird.</p>
|
|
|
|
<h4><a name="4.27">4.27</a>) Welche Möglichkeiten zur Datenbank-Replikation gibt es?</h4>
|
|
|
|
<p>Es existieren mehrere Ansätze zur Master/Slave-Replikation in PostgreSQL.
|
|
In diesen werden Datenänderungen in der Master-Datenbank durchgeführt und an
|
|
Slave-Datenbanken weitergeleitet. Informationen über diese Lösungen
|
|
befinden sich auf der folgenden Seite (unten):
|
|
<a href="http://gborg.PostgreSQL.org/genpage?replication_research">http://gborg.PostgreSQL.org/genpage?replication_research</a> .</p>
|
|
|
|
<p>Eine Multi-Master-Lösung befindet sich in der Entwicklung. Näheres dazu
|
|
befindet sich hier:
|
|
<a href="http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php">http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php</a> .</p>
|
|
|
|
<h4><a name="4.28">4.28</a>) Welche Möglichkeiten zur Verschlüsselung gibt es?</h4>
|
|
|
|
<ul>
|
|
<li><em>contrib/pgcrypto</em> enthält diverse Funktionen für die Benützung mit
|
|
SQL-Abfragen;</li>
|
|
<li>die einzige Möglichkeit, Kommunikationen zwischen Client und Server
|
|
zu verschlüsseln, ist durch die Anwendung von <em>hostssl</em> in <em>pg_hba.conf</em>;</li>
|
|
<li>Die Passwörter der Datenbanknutzer werden ab Version 7.3 automatisch
|
|
verschlüsselt (in früheren Versionen muß der Parameter <em>PASSWORD_ENCRYPTION</em>
|
|
in <em>postgresql.conf</em> explizit eingeschaltet werden);</li>
|
|
<li>der Server läuft auf einem verschlüsselten Dateisystem.</li>
|
|
</ul>
|
|
|
|
<hr />
|
|
|
|
<h2 align="center">PostgreSQL erweitern</h2>
|
|
|
|
<h4><a name="5.1">5.1</a>) Ich habe eine benutzerdefinierte Funktion geschrieben. Wenn ich sie in
|
|
<em>psql</em> aufrufe, kommt ein <em>core dump</em>. Warum?</h4>
|
|
|
|
<p>Dieses Problem kann viele Ursachen haben. Testen Sie Ihre Funktion zuerst
|
|
in einem eigenen Testprogramm.</p>
|
|
|
|
<h4><a name="5.2">5.2</a>) Wie kann ich praktische neue Typen und Funktionen zu PostgreSQL
|
|
hinzufügen?</h4>
|
|
|
|
<p>Senden Sie Ihre Beiträge an die Mailing Liste <em>pgsql-hackers</em>, und sie
|
|
werden nach Prüfung eventuell ins <em>contrib/</em> Verzeichnis des Quellcodes
|
|
aufgenommen werden.</p>
|
|
|
|
<h4><a name="5.3">5.3</a>) Wie schreibe ich eine Funktion in C, die einen Tupel zurückliefert?</h4>
|
|
|
|
<p>Ab PostgreSQL 7.3 werden Funktionen, die Tupel zurückliefern, in C, PL/PgSQL und SQL
|
|
unterstützt. Der <i>Programmer's Guide</i> enthält weitere Informationen
|
|
dazu. Ein Bespiel einer solchen Funktion befindet sich in <em>contrib/tablefunc</em>.</p>
|
|
|
|
<h4><a name="5.4">5.4</a>) Ich habe eine der Quellendateien geändert. Warum macht sich
|
|
die Änderung beim erneuten Kompilieren nicht bemerkbar?</h4>
|
|
|
|
<p>Die <em>Makefiles</em> enthalten nicht die richtigen Abhängigkeiten für <em>include</em>-
|
|
Dateien. Sie müssen ein "<em>make clean</em>" und dann ein weiteres "<em>make</em>" ausführen.
|
|
Wenn Sie <em>gcc</em> benutzen, können Sie die "<em>--enable-depend</em>"-Option des <em>configure</em>-
|
|
Skripts benutzen, damit der Compiler die Abhängigkeiten automatisch
|
|
ermittelt.</p>
|
|
|
|
<hr />
|
|
|
|
<h4>Anmerkungen des Übersetzers</h4>
|
|
|
|
<p>Die englische Vorlage dieser FAQ wird ständig überarbeitet. Daher liegt
|
|
die Übersetzung nicht immer auf dem aktuellsten Stand.
|
|
|
|
<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, kann aber leider keine zeitige Antwort garantieren.</p>
|
|
|
|
</body>
|
|
</html>
|
|
|
|
|