-name="1.1">1.1) Was ist PostgreSQL?
-
-PostgreSQL ist eine Verbesserung des POSTGRES-Datenbank-Managementsystems, ein
-"Next-Generation" DBMS-Forschungsprototyp. Während PostgreSQL das leistungsfähige Datenmodell und
-die reichhaltigen Datentypen von POSTGRES beibehält, ersetzt es die PostQuel-Abfragesprache durch
-eine ausgedehnte Teilmenge von SQL. PostgreSQL ist frei und der komplette Quellcode ist verfügbar.
-
-Die PostgreSQL-Entwicklung wird von einem Team von Internet-Entwickler durchgeführt, die alle an
-der PostgreSQL-Entwicklungs-Mailingliste teilnehmen. Der aktuelle Koordinator ist Marc G. Fournier
-man sich anmelden kann). Dieses Team ist jetzt für alle aktuellen und zukünftigen Entwicklungen von PostgreSQL
-verantwortlich.
-
-
-
-Die Autoren von PostgreSQL 1.01 waren Andrew Yu und Jolly Chen. Viele andere haben zur Portierung,
-zu den Tests, zur Fehlersuche und zur Verbesserung des Codes beigetragen.
-Der ursprüngliche Postgres-Code, von dem PostgreSQL abstammt, ist auf die Bemühungen von
-vielen Studierenden und Diplomanden, sowie Programmierern, die unter
-der Weisung des Professors Michael Stonebraker an der Universität von Kalifornien, Berkeley
-arbeiteteten, zurückzuführen.
-
-
-Der ursprüngliche Name der Software bei Berkeley war Postgres. Als die SQL-Funktionalität 1995
-hinzugefügt wurde, wurde sein Name zu Postgres95 geändert. Der Name wurde Ende 1996 zu
-PostgreSQL geändert.
-
-
1.2) Welches Copyright liegt auf PostgreSQL?
-
-PostgreSQL steht unter folgendem COPYRIGHT (Originaltext):
-
-PostgreSQL Data Base Management System
-
-Copyright (c) 1994-6 Regents of the University of California
-
-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
-
-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.
-
-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
-
-Es gilt die Copyright-Klausel im Original! Informativ folgt hier eine
-Übersetzung. Die Übersetzung besitzt keinerlei rechtlichen Status.
-Insbesondere kann sich niemand auf diese Übersetzung berufen:
-
-PostgreSQL Datenbank Management System
-
-Copyright (c) 1994-6 Regents of the University of California
-
-Die Erlaubnis, diese Software und seine Unterlagen für jeden möglichen Zweck, ohne Gebühr und ohne
-eine schriftliche Vereinbarung zu benutzen, zu kopieren, zu ändern und zu verteilen wird hiermit
-bewilligt, vorausgesetzt daß der oben genannte Urheberrechtsvermerk und dieser Paragraph und die
-folgenden zwei Paragraphen in allen Kopien erscheinen.
-
-IN KEINEM FALL IST DIE UNIVERSITÄT VON KALIFORNIEN GEGENÜBER JEDEM MÖGLICHEN BETEILIGTEN FÜR DIE DIREKTEN,
-INDIREKTEN, SPEZIELLEN, BEILÄUFIGEN ODER FOLGESCHÄDEN, EINSCHLIEßLICH DER VERLORENEN PROFITE
-VERANTWORTLICH, DIE AUS DEM GEBRAUCH VON DIESER SOFTWARE UND SEINEN UNTERLAGEN
-HERAUS ENTSTEHEN, SELBST WENN DIE UNIVERSITÄT VON KALIFORNIEN VON DER MÖGLICHKEIT SOLCHEN SCHADENS
-BENACHRICHTIGT WORDEN IST.
-
-DIE UNIVERSITÄT VON KALIFORNIEN LEHNT SPEZIELL ALLE MÖGLICHE GARANTIEN AB,
-EINSCHLIESSLICH, ABER NICHT BEGRENZT AUF, DIE IMPLIZIERTEN GARANTIEN VON
-GESCHÄFTSNUTZEN UND EIGNUNG ZU EINEM BESTIMMTEN ZWECK. DIE SOFTWARE, DIE
-NACHSTEHEND BEREITGESTELLT WIRD, BASIERT AUF EINER "SO WIE SIE IST"-GRUNDLAGE, UND DIE UNIVERSITÄT
-VON KALIFORNIEN HAT KEINE VERPFLICHTUNGEN, WARTUNG, SUPPORT,
-AKTUALISIERUNGSVORGÄNGE, VERBESSERUNGEN ODER ÄNDERUNGEN ZUR VERFÜGUNG
-ZU STELLEN.
-
-
1.3) Auf welchen Unix-Plattformen läuft PostgreSQL?
-
-Die Autoren haben PostgreSQL auf folgenden Plattformen kompiliert und getestet
-(einige dieser Kompilierungen benötigen den C-Compiler gcc):
-
aix - IBM auf AIX 3.2.5 or 4.x
-
alpha - DEC Alpha AXP auf Digital Unix 2.0, 3.2, 4.0
-
BSD44_derived - OS abgeleitet von 4.4-lite BSD (NetBSD, FreeBSD)
-
bsdi - BSD/OS 2.x, 3.x, 4.x
-
dgux - DG/UX 5.4R4.11
-
hpux - HP PA-RISC auf HP-UX 9.*, 10.*
-
i386_solaris - i386 Solaris
-
irix5 - SGI MIPS auf IRIX 5.3
-
linux - Intel i86
- Alpha
- SPARC
- PPC
- M68k
-
sco - SCO 3.2v5
- Unixware
-
sparc_solaris - SUN SPARC auf Solaris 2.4, 2.5, 2.5.1
-
sunos4 - SUN SPARC auf SunOS 4.1.3
-
svr4 - Intel x86 auf Intel SVR4 and MIPS
-
ultrix4 - DEC MIPS auf Ultrix 4.4
-
+
+
+
Letzte Aktualisierung der deutschen Übersetzung: Mo., den 21.10.2002, 23:00 CET
+
+
Die aktuellste Version dieses Dokuments liegt auf der PostgreSQL Website:
+
+
Übersetzungen dieses Dokuments in andere Sprachen sowie plattform-
+ spezifische FAQs können unter
+ eingesehen werden.
+
+
+
+
Allgemeine Fragen
+
+
1.1) Was ist PostgreSQL? Wie wird es ausgesprochen?
+
1.2) Welchem Copyright unterliegt PostgreSQL?
+
1.3) Auf welchen Unix-Plattformen läuft PostgreSQL?
+
1.4) Welche Nicht-Unix-Versionen sind verfügbar?
+
1.5) Woher bekomme ich PostgreSQL?
+
1.6) Wo bekomme ich Support für PostgreSQL?
+
1.7) Was ist die neueste Version von PostgreSQL?
+
1.8) Welche Dokumentation ist für PostgreSQL verfügbar?
+
1.9) Wie erfahre ich von bekannten Bugs oder fehlenden Features?
+
1.10) Wie kann ich SQL lernen?
+
1.11) Ist PostgreSQL Y2K (Jahr 2000) fähig?
+
1.12) Wie kann ich im Entwicklerteam mitarbeiten?
+
1.13) Wie sende ich einen Fehler-Bericht?
+
1.14) Wie läuft PostgreSQL im Vergleich zu anderen Datenbanksystemen?
+
1.15) Wie kann ich PostgreSQL finanziell unterstützen?
+
+
Fragen zu Benutzerprogrammen
+
+
2.1) Gibt es ODBC-Treiber für PostgreSQL?
+
2.2) Welche Werkzeuge gibt es, um Web-Seiten mit PostgreSQL zu verbinden?
+
2.3) Hat PostgreSQL eine grafische Benutzerschnittstelle?
+Einen Report-Generator? Eine eingebaute Query-Schnittstelle?
+
2.4) Welche Programmiersprachen können mit PostgreSQL kommunizieren?
+
+
+
Administrative Fragen
+
+
3.1) Wie installiere ich PostgreSQL woanders als in /usr/local/pgsql?
+
3.2) Wenn ich den
postmaster starte, erhalte ich die Nachricht "
Bad System Call" bzw. "
core dumped". Warum?
+
3.3) Wenn ich versuche, den
postmaster zu starten, bekomme ich "
IpcMemoryCreate"-Fehlermeldungen. Warum?
+
3.4) Wenn ich versuche, den
postmaster zu starten, bekomme ich "
IpcSemaphoreCreate"-Fehlermeldungen. Warum?
+
3.5) Wie regle ich Zugriffe von anderen Rechnern?
+
3.6) Wie optimiere ich die Datenbank für bessere Leistung?
+
3.7) Welche Debugging-Funktionen sind bei PostgreSQL verfügbar?
+
3.8) Ich bekomme die Meldung "
Sorry, too many clients", wenn ich eine Verbindung aufzubauen versuche. Warum?
+
3.9) Was befindet sich im Verzeichnis
pgsql_tmp/?
+
3.10) Warum muß ich bei jeder neuen Hauptversion von PostgreSQL
+ die komplette Datenbank exportieren und anschließend reimportieren?
+
+
Fragen zum Betrieb
+
+
4.1) Worin besteht der Unterschied zwischen
Binary Cursors und
Normal Cursors?
+
4.2) Wie wähle ich per
SELECT-Anweisung nur die
+ ersten paar Zeilen in einer Abfrage aus?
+
4.3) Wie bekomme ich eine Liste der Tabellen oder anderen Dinge, die ich in
psql sehen kann?
+
4.4) Wie entferne ich eine Spalte aus einer Tabelle?
+
4.5) Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine Datenbank?
+
4.6) Wieviel Plattenplatz wird benötigt, um die Daten aus einer typischen Textdatei abzuspeichern?
+
4.7) Wie finde ich heraus, welche Indizes oder Operationen in der Datenbank definiert sind?
+
4.8) Meine Abfragen sind langsam oder nutzen die Indizes nicht. Warum?
+
4.9) Auf welche Weise kann ich sehen, wie der Abfrage-Optimierer ("
GEQO") meine Abfrage auswertet?
+
4.10) Was ist ein R-Tree Index?
+
4.11) Was ist der "Genetic Query Optimizer"?
+
4.12) 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?
+
4.13) Wie ermittle ich in einer Abfrage, ob ein Feld NULL ist?
+
4.14) Was ist der Unterschied zwischen den verschiedenen CHAR-Typen?
+
4.15.1) Wie erzeuge ich ein serielles Feld mit automatischer Erhöhung des Wertes?
+
4.15.2) Wie bekomme ich den Wert einer SERIAL-Sequenz?
+
4.15.3) Führen currval() und nextval() zu einer Race-Condition mit anderen
+ Nutzern?
+
4.15.4) Warum werden die Sequenzwerte nach einem Transaktionsabbruch nicht
+ zurückgesetzt? Warum gibt es Lücken in der Nummerierung meiner
+ Sequenz-/SERIAL-Spalte?
+
4.16) Was ist ein
OID? Was ist ein
TID?
+
4.17) Welche Bedeutung haben die verschiedenen Ausdrücke, die in PostgreSQL benutzt werden (z.B. attribute, class,...)?
+
4.18) Wieso bekomme ich den Fehler: "
FATAL: Memory exhausted in AllocSetAlloc()"?
+
4.19) Wie kann ich feststellen, welche PostgreSQL-Version bei mir läuft?
+
4.20) Bei "large-object"-Operationen kommt die Fehlermeldung: "
invalid large obj descriptor". Warum?
+
4.21) Wie kann ich eine Spalte erstellen, deren Default-Wert immer
+ die aktuelle Uhrzeit enthalten soll?
+
4.22) Warum sind meine Unterabfragen (subqueries), die IN verwenden,
+ so langsam?
+
4.23) Wie führe ich einen
OUTER JOIN durch?
+
4.24) Wie kann ich Abfragen über mehrere Datenbanken hinweg ausführen?
+
4.25) Wie kann ich mehrere Zeilen bzw. Spalten von einer Funktion
+ zurückgeben lassen?
+
4.26) Warum kann ich temporäre Tabellen in
PL/PgSQL-Funktionen nicht
+ zuverlässig erstellen bzw. löschen?
+
4.27) Welche Möglichkeiten zur Datenbank-Replikation gibt es?
+
4.28) Welche Möglichkeiten zur Verschlüsselung gibt es?
+
+
+
PostgreSQL erweitern
+
+
5.1) Ich habe eine benutzerdefinierte Funktion geschrieben. Wenn ich sie in
psql aufrufe, kommt ein
core dump. Warum?
+
5.2) Wie kann ich praktische neue Typen und Funktionen zu PostgreSQL
+ hinzufügen?
+
5.3) Wie schreibe ich eine Funktion in C, die einen Tupel zurückliefert?
+
5.4) Ich habe eine der Quellendateien geändert. Warum macht sich die Änderung beim erneuten Kompilieren nicht bemerkbar?
+
+
+
+
Allgemeine Fragen
+
1.1) Was ist PostgreSQL? Wie wird es ausgesprochen?
+
Die (englische) Aussprache ist "Post-Gres-Q-L".
+
+
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.
+
+
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
+ Dieses Team ist für die Gesamtentwicklung von PostgreSQL
+ verantwortlich.
+
+
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.
+
+
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.
+
+
1.2).Welchem Copyright unterliegt PostgreSQL?
+
+
PostgreSQL unterliegt folgendem COPYRIGHT (Originaltext):
+
+
PostgreSQL Data Base Management System
+
+
Portions copyright (c) 1996-2002, PostgreSQL Global Development
+ Group Portions Copyright (c) 1994-6 Regents of the University of
+ California
+
+
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.
+
+
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.
+
+
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.
+
+
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.
+
+
Es gilt die Copyright-Klausel im Original!
+
+
1.3) Auf welchen Unix-Plattformen läuft PostgreSQL?
+
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.
+
+
1.4) Welche Nicht-Unix-Portierungen sind verfügbar?
+
+
+
Es ist möglich, die libpq 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 psql erzeugt
+ werden können.
+
+
+
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 pgsql/doc/FAQ_MSWIN oder die MS-Windows-FAQ unter
+
+
Eine eigenständige Portierung auf MS Win NT/2000/XP befindet sich
+ in Vorbereitung.
+
+
1.5) Woher bekomme ich PostgreSQL?
+
+
Der zentrale FTP-Server für PostgreSQL ist der ftp-Server
+ PostgreSQL-Website aufgelistet.
+
+
1.6) Wo bekomme ich Support für PostgreSQL?
+
+
Die zentrale (englischsprachige) Mailing-Liste ist:
+
+
Die Liste ist Themen vorbehalten, die PostgreSQL betreffen. Die Anmeldung
+ erfolgt mit einer Email an die Adresse
[email protected] mit folgenden Zeilen im Text
+ (nicht in der Betreffzeile):
+ subscribe
+ end
+
+
Es gibt auch eine Digest-Liste (eine Liste, die Mails zusammengefasst
+ sendet). Um sich an dieser Digest-Liste anzumelden, senden Sie eine Email
+ subscribe
+ end
+
+
+
Es gibt noch die Bug-Mailingliste. Die Anmeldung für diese Liste erfolgt
+ subscribe
+ end
+
+
+
Die Entwickler-Mailingliste kann mit einer Email an
+
[email protected] abonniert werden. Die Email muß ebenfalls folgenden Text enthalten:
+ subscribe
+ end
+
+
+
+
Weitere Mailinglisten und Informationen zu PostgreSQL befinden sich auf der PostgreSQL-Homepage:
+
+
Es gibt außerdem einen IRC-Channel im EFNet, Channel #PostgreSQL. Der
+ FAQ-Autor Bruce Momjian nutzt den Unix-Befehl:
+ irc -c '#PostgreSQL' "$USER" irc.phoenix.net
+ um daran teilzunehmen.
+
+
Eine Liste von Unternehmen, die Support für PostgreSQL auf kommerzieller
+ Basis leisten, kann unter
+ eingesehen werden.
+
+
1.7) Was ist die neueste Version von PostgreSQL?
+
+
Die neueste Version von PostgreSQL ist 7.2.3.
+
+
Wir planen alle 4 Monate eine neue Version herauszugeben.
+
+
1.8) Welche Dokumentation ist für PostgreSQL verfügbar?
+
+
Einige Handbücher, Man-Pages und einige kleine Testprogramme sind in
+ der Distribution enthalten. Siehe das /doc-Verzeichnis. Ausserdem sind
+ verfügbar.
+
+
Zwei Bücher zu PostgreSQL sind online verfügbar unter
+
+
Eine Liste lieferbarer PostgreSQL-Bücher befindet sich unter
+ Diverse technische Artikel befinden sich unter
+
+
psql hat einige nützliche \d-Befehle, um Informationen über Typen,
+ Operatoren, Funktionen, Aggregate, usw. zu zeigen.
+
+
1.9) Wie erfahre ich von bekannten Bugs oder fehlenden Features?
+
+
PostgreSQL unterstützt eine erweiterte Teilmenge von SQL-92. Siehe
+ der bekannten Bugs, fehlenden Features und zukünftigen Pläne.
+
+
1.10) Wie kann ich SQL lernen?
+
+ eine Einführung in SQL. Ein weiteres PostgreSQL-Buch befindet sich unter
+
+
Eine weitere Empfehlung ist "Teach Yourself SQL in 21 Days, Second Edition",
+
+
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).
+
+
1.11) Ist PostgreSQL Y2K (Jahr 2000) fähig?
+
+
Ja, wir können Datumsangaben nach dem Jahr 2000 n.Chr. und vor 2000 v.Chr. leicht
+ verarbeiten.
+
+
1.12) Wie kann ich im Entwicklerteam mitarbeiten?
+
+
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
+ pgsql-hackers und pgsql-patches an. Anschließend senden Sie qualitativ
+ hochwertige Patches an die pgsql-patches Mailingliste.
+
+
Es gibt ungefähr ein Dutzend Leute, die das commit-Recht im
+ PostgreSQL CVS-Archiv haben. Alle haben derart viele hochwertige Patches
+ eingebracht, dass es für die CVS-Verwalter schwer war, mitzuhalten. Und
+ wir hatten Vertrauen, dass die von ihnen festgelegten Änderungen aller
+ Wahrscheinlichkeit nach von hoher Qualität sind.
+
+
1.13) Wie sende ich einen Fehlerbericht?
+
+ die Hinweise und Anleitungen zur Einreichung von Fehlerberichten enthält.
+
+ um nachzusehen, ob es eine neuere PostgreSQL-Version oder neue Patches gibt.
+
+
1.14) Wie läuft PostgreSQL im Vergleich zu anderen Datenbanksystemen?
+
+
Es gibt verschiedene Methoden, Software zu messen: Eigenschaften,
+ Leistung, Zuverlässigkeit, Support und Preis.
+
+
Eigenschaften
+
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.
+
+
+
Performanz
+
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:
+
+
+
Zuverlässigkeit
+
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.
+
+
+
Support
+
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
1.6).
+
+
Preis
+
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.
+
+
-
1.4) Welche Nicht-Unix-Versionen sind verfügbar?
>
+
1.15) Wie kann ich PostgreSQL finanziell unterstützen?
>
-Es ist möglich, die libpq C-Bibliothek, psql und andere Schnittstellen und Binaries zu
-kompilieren, um sie auf der MS-Windows-Plattform laufen zu lassen.
-In diesem Fall läuft der Client auf MS-Windows und steht über TCP/IP mit einem
-Server in Verbindung, der auf einer unserer unterstützten Unixplattformen läuft.
+
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.
-Es gibt die Datei win31.mak in der Distribution, um die Win32 libpq-Bibliothek und psql
+
Eine hochwertige Infrastruktur ist für ein Open-Source-Projekt wie dieses
+ sehr wichtig. Sie verhindert Probleme und Verzögerungen beim Fortschritt des
+ Projekts.
-Der Datenbankserver arbeitet jetzt auch unter Benutzung der Cygnus Unix/NT-Porting-Bibliotheken
-auf Windows NT. Siehe auch pgsql/doc/README.NT in der Distribution.
+
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
+ wo Sie eine Spende abgeben können.
+
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.
+
-
1.5) Woher bekomme ich PostgreSQL?
+
Fragen zu Benutzerprogrammen
-Die entsprechenden Spiegelserver sind auf der Hauptwebseite aufgelistet.
+
2.1) Gibt es ODBC-Treiber für PostgreSQL?
+
+
Es sind zwei ODBC-Treiber verfügbar: PsqlODBC und OpenLink ODBC.
-
1.6) Wo bekomme ich Support für PostgreSQL?
+
PsqlODBC ist in der Distribution enthalten. Weitere Informationen können
-Es gibt keinen offiziellen Support für PostgreSQL von der Universität von Kalifornien, Berkeley. Der
-Support wird durch freiwilligen Einsatz geleistet.
+ 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).
-Die Liste ist für PostgreSQL betreffende Themen vorbehalten. Um sich anzumelden, sende eine
-Email mit folgenden Zeilen im Text (nicht in der Betreffzeile):
+
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
-
- subscribe
- end
-
+
Bitte beachten Sie auch das Kapitel zu ODBC im Progammer's Guide.
+
+
2.2) Welche Werkzeuge gibt es, um Web-Seiten mit PostgreSQL zu
+ verbinden?
+
Eine nette Einführung zu datenbank-gestützten Webseiten kann unter
-Es gibt auch eine Digest-Liste (Eine Liste, die Mails zusammengefasst sendet).
-Um sich an dieser Digestliste anzumelden, sende eine Email an:
-mit folgendem Text:
+
Für die Web-Integration ist PHP eine ausgezeichnete Schnittstelle.
-
- subscribe
- end
-
-
+
Für komplexere Aufgaben bietet sich die Perl-Schnittstelle mit CGI.pm
+ oder mod_perl.
-Die Digests werden an die Mitglieder der Liste geschickt, wenn ca. 30kB an Mails
+
2.3) Hat PostgreSQL eine grafische Benutzerschnittstelle? Einen
+ Report-Generator? Eine eingebaute Query-Schnittstelle?>
-Die Bug-Mailingliste ist verfübar. Um sich an dieser Liste anzumelden,
+
Wir haben eine nette grafische Benutzerschnittstelle namens
+ PgAccess, der außerdem einen Reportgenerator enthält:
-
- subscribe
- end
-
-
+
Die Distribution enthält außerdem ecpg, die eine eingebettete
+ SQL-Query-Schnittstelle für C zur Verfügung stellt.
-Es gibt ebenfalls eine Entwickler-Diskussionsliste. Um sich an dieser Liste anzumelden,
+
2.4) Welche Programmiersprachen und Schnittstellen gibt es?
-
- subscribe
- end
-
+
C (libpq)
-Weitere Mailinglisten und Informationen zu PostgreSQL können auf der PostgreSQL-Homepage im WWW
-gefunden werden:
+
C++ (libpq++)
-Es gibt außerdem einen IRC-Channel im EFNet, Kanal #PostgreSQL.
-Bruce nutzt den Unix-Befehl:
irc -c '#PostgreSQL' "$USER" irc.phoenix.net
um teilzunehmen
+
Embedded C (ecpg)
+ Java (jdbc)>
+
Perl (perl5, DBD::Pg)
-
1.7) Was ist die neueste Version von PostgreSQL?
>
+ ODBC (odbc)>
-
Das neueste Release von PostgreSQL ist die Version 6.5.>
+ Python (PyGreSQL)>
-
Wir planen alle 4 Monate Hauptreleases herauszugeben.>
+ TCL (libpgtcl)>
+
C Easy API (libpgeasy)
-
1.8) Welche Dokumente sind für PostgreSQL verfügbar?
+
PHP ('pg_' functions, Pear::DB)
+
+
-Einige Handbücher, Man-Pages und einige kleine Testprogramme sind in der Distribution enthalten.
-Siehe im /doc-Verzeichnis.
+
3.1) Wie installiere ich PostgreSQL woanders als in /usr/local/pgsql?
-psql
-
hat einige nette \d-Befehle, um Informationen über Typen, Operatoren, Funktionen, Aggregate, usw. zu zeigen. >
+
Bei der Ausführung von configure die Option --prefix mit dem Zielverzeichnis
+ angeben.>
-Die Website enthält sogar noch mehr Unterlagen.
+
3.2) Wenn ich den postmaster starte, erhalte ich einen Nachricht
+ "Bad System Call" bzw. "core dumped". Wieso?
-
1.9) Wie erfahre ich etwas über bekannte Fehler oder fehlende Eigenschaften von PostgreSQL?
+
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.
+
3.3) Wenn ich versuche, den postmaster zu starten, bekomme ich "IpcMemoryCreate"-Fehlermeldungen. Warum?
-PostgreSQL unterstützt eine ausgedehnte Untermenge von SQL-92.
-für eine Auflistung der bekannten Fehler, fehlende Eigenschaften und zukünftige Pläne.
+
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 postmaster 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"
+ enthält weitere Informationen zu Shared Memory und Semaphores.
-
1.10) Wie kann ich SQL lernen?
+
3.4) Wenn ich versuche, den postmaster zu starten, bekomme ich
+ "IpcSemaphoreCreate"-Fehlermeldungen. Warum?
-Es gibt nette SQL-Tutorials bei
-http://w3.one.net/~jhoffman/sqltut.htm und bei
-http://ourworld.compuserve.com/homepages/Graeme_Birchall/DB2_COOK.HTM.
+
Falls die Fehlermeldung "IpcSemaphoreCreate: semget failed (No space
+ left on device)" lautet, ist Ihr Kernel mit zu wenig Semaphoren
+ konfiguriert. PostgreSQL benötigt eine Semaphore pro möglichem
+ Backend-Prozess. Eine Zwischenlösung wäre, postmaster mit einer
+ geringeren Anzahl an Backend-Prozessen zu starten. Benutzen Sie dazu die
+ -N Option mit einem kleineren Wert als die standardmäßigen 32. Eine
+ dauerhafte Lösung wäre es, die Parameter SEMMNS und SEMMNI Ihres Kernels
+ zu erhöhen.
-Viele unserer User mögen The Practical SQL Handbook, Bowman et al.,
+
Nichtfunktionierende Semaphores können außerdem bei hoher Datenbanklast
+ zu Abstürzen führen.>
+
Falls die Fehlermeldung anders aussieht, ist möglicherweise keine
+ Semaphoren-Unterstützung in Ihrem Kernel aktiviert. Der "PostgreSQL
+ Administrator's Guide" enthält weitere Informationen zu Shared Memory
+ und Semaphores.
-
1.11) Ist PostgreSQL Y2K (Jahr 2000) fähig?
-Ja, wir können Datumsangaben nach dem Jahr 2000 n.Chr. und vor 2000 v.Chr. leicht
+
3.5) Wie regle ich Zugriffe von anderen Rechnern?
-
1.12) Wie kann ich am Entwicklerteam teilnehmen?
+
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 postmaster
+ mit der -i Option gestartet wird und die host-basierte Authentifizierung in
+ der Datei $PGDATA/pg_hba.conf entsprechend angepasst ist.
-Zuerst lade die neuesten Quellen herunter und lies die PostgreSQL-Entwicklerunterlagen
-auf unserer Website oder in der Distribution. Zweitens melde Dich zu den Mailinglisten
-pgsql-hackers und pgsql-patches an. Drittens sende qualitativ hochwertige Programmänderungen
-an die pgsql-patches Mailingliste.
-Es gibt ungefähr ein Dutzend Leute, die das commit-Recht im PostgreSQL-CVS Archiv haben.
-Alle haben so viele hochwertige Patches eingebracht, daß es schwer für die
-CVS-Verwalter war, mitzuhalten. Und wir hatten das Vertrauen, daß
-die Änderungen, die sie festlegten, sehr wahrscheinlich von hoher Qualität sind.
-
-
1.13) Wie sende ich einen Fehler-Bericht?
-
-Fülle die "Fehler-Vorlage"-Datei (bug.template im doc-Verzeichnis) aus und sende sie an:
-
-um nachzusehen, ob es eine neuere PostgreSQL-Version oder neue Patches gibt.
-
-
-
1.14) Wie läuft PostgreSQL im Vergleich zu anderen Datenbanksystemen?
-
-Es gibt verschiedene Methoden, Software zu messen: Eigenschaften, Leistung,
-Zuverlässigkeit, Support und Preis.
-
-
Eigenschaften
-
-
-PostgreSQL hat die meisten Eigenschaften, die in großen kommerziellen DBMS's, wie
-Transaktionen, Sub-SELECTs, Trigger, Views und verfeinertes Locking, vorhanden sind.
-Wir haben einige Eigenschaften, die andere nicht haben, wie benutzerbestimmte Typen, Vererbung,
-Regeln, und die Multi-Versionen-Steuerung zum Verringern von konkurrierenden Locks.
-Wir haben keine referentielle Integrität von externen Schlüsseln oder Outer Joins,
-aber wir arbeiten an diesen Dingen für unser nächstes Release.
-
-
Leistung
-
-
-PostgreSQL läuft in zwei Modi. Im normalen fsync-Modus wird jede komplette Transaktion
-auf die Platte geschrieben und garantiert, daß, selbst wenn das Betriebssystem abstürzt und
-der Strom ausfällt, die Daten sicher gespeichert wurden.
-In diesem Modus sind wir langsamer als die meisten kommerziellen Datenbanken,
-zum Teil, weil wenige von ihnen solch eine konservatives Methode der Datenspeicherung in ihren
-Standardbetriebsmodi betreiben.
-
-Im no-fsync-Modus sind wir normalerweise schneller als kommerzielle Datenbanken. In
-diesem Modus kann ein Betriebssystemabsturz jedoch Datenkorruption zur Folge haben.
-Wir arbeiten daran, einen Zwischenmodus zur Verfügung zu stellen, der unter weniger Leistungseinbuße
-leidet als der fsync-Modus und die Datenintegrität innerhalb 30 Sekunden
-im Falle eines Betriebssystemabsturzes erlaubt. Der Modus ist durch den Datenbankverwalter
-
-Im Vergleich zu MySQL oder schlankeren Datenbanksystemen sind wir hinsichtlich INSERTs/UPDATEs langsamer,
-weil wir einen Transaktions-Overhead haben.
-Selbstverständlich hat MySQL kaum eine der Eigenschaften, die oben im Kapitel Eigenschaften erwähnt werden.
-PostgreSQL ist für Flexibilität und gute Eigenschaften designed, trotzdem fahren wir fort,
-die Leistung durch Profiling und Quellcodeanalyse zu verbessern.
-
-
-
-
Zuverlässigkeit
-
-
-Wir stellen fest, daß ein DBMS zuverlässig sein muß, oder es ist wertlos. Wir bemühen uns,
-gut geprüften, beständigen Code freizugeben, der nur ein Minimum an Programmfehler hat.
-Jede Freigabe hat mindestens einen Monat Betatestphase hinter sich, und unsere Freigabehistorie zeigt,
-daß wir stabile, solide Versionen freigeben, die im Produktionsbetrieb
-genutzt werden können. Wir glauben, daß wir im Vergleich mit anderer
-Datenbanksoftware vorteilhaft dastehen.
-
-
Support
-
-
-Unsere Mailingliste stellt eine große Gruppe Entwickler und Benutzer zur Behebung aller
-möglichen anzutreffenden Probleme zur Verfügung.
-
-Wir können nicht immer eine Fehlerbehebung garantieren,
-kommerzielle DBMS's tun dies aber auch nicht.
-
-Direkter Zugriff zu den Entwicklern, zur Benutzergemeinschaft, zu den Handbüchern und zum Quellcode bietet häufig
-höherwertigen PostgreSQL-Support im Vergleich zu anderen DBMS's.
-
-Es gibt den kommerziellen "Pro-Ereignis"-Support,
-der für diejenigen bereitgestellt wird, die ihn benötigen. (siehe Support-Faq),
-
-
Preis
-
-PostgrSQL ist frei verfügbar, sowohl für die kommerzielle, wie für die nicht-kommerzielle
-Nutzung. Du kannst Deinen Code fast ohne Beschränkungen zu unserem hinzufügen. Die einzigen
-Beschränkungen werden in der BSD-artigen Lizenz weiter oben aufgeführt.
-
-
-
-
-
-
Fragen zu Benutzerprogrammen
-
-
-
-
2.1) Gibt es ODBC-Treiber für PostgreSQL?
-
-Es sind zwei ODBC-Treiber verfügbar: PostODBC und OpenLink ODBC.
-
-PostODBC ist in der Distribution enthalten. Mehr Informationen können unter
-
-geholt werden.
-Die Software arbeitet mit OpenLinks Standard-ODBC-Client, so daß PostgreSQL-ODBC auf
-jeder Client-Plattform zur Verfügung steht, die unterstützt wird (Win, Mac, Unix, VMS).
-
-Sie werden dieses Produkt wahrscheinlich an Leute verkaufen, die kommerziellen Qualitäts-Support
-brauchen, aber es wird immer eine Freeware-Version verfügbar sein.
-
-
-
-
2.2) Welche Werkzeuge gibt es, um PostgreSQL-Datenbanken über Webseiten
-
-Eine nette Einführung zu Datenbank-gestützten Webseiten kann unter
-
-Eine weitere gibt es bei
-http://www.phone.net/home/mwm/hotlist/.
-
-Für die Web-Integration ist PHP eine ausgezeichnete Schnittstelle.
-
-PHP ist hervorragend für einfache Anbindungen geeignet. Für komplexere
-Aufgaben nutzen viele die Perl-Schnittstelle mit CGI.pm.
-
-Einen WWW-Gateway, basierend auf WDB, kann man bei
-
-
2.3) Hat PostgreSQL eine grafische Benutzerschnittstelle?
-Einen Report-Generator? Eine eingebaute Query-Schnittstelle?
-
-Wir haben eine nette grafische Benutzerschnittstelle mit Namen
-pgaccess, welche in der Distribution enthalten ist.
-pgaccess hat auch einen Reportgenerator. Die Webpage liegt hier:
-
-In der Distribution gibt es außerdem ecpg,,
-welches eine eingebundene SQL-Query-Schnittstelle für C zur Verfügung stellt.
-
-
-
2.4) Welche Sprachen sind für die Kommunikation mit PostgreSQL verfügbar?
-
-Wir haben:
-
C(libpq)
-
C++(libpq++)
-
Embedded C(ecpg)
-
Java(jdbc)
-
Perl(perl5)
-
ODBC(odbc)
-
Python(PyGreSQL)
-
TCL(libpgtcl)
-
ein rohes C/4GL(contrib/pginterface)
-
-
-
-
-
-
3.1) Warum schlägt initdb fehl?
-
-
-überprüfe, daß keine Binaries vorheriger Versionen in Deinem Pfad
-(PATH-Variable) sind.
-(Wenn Du die Meldung siehst: NOTICE:heap_modifytuple: repl is \ 9
, ist das das Problem.)
-
überprüfe, daß der Pfad richtig gesetzt ist
-
überprüfe, ob der User postgres der Eigentümer der entsprechenden Dateien ist
-
-
-
3.2) Wie installiere ich PostgreSQL woanders als in /usr/local/pgsql?
-
-Der einfachste Weg ist mittels der --prefix Option beim configure den Pfad anzugeben.
-Falls Du das vergessen haben solltest, kannst Du die Datei Makefile.global ändern und
-POSTGRESDIR entsprechend anpassen, oder Du erzeugst ein Makefile.custom und definierst POSTGRESDIR dort.
-
-
-
3.3) Wenn ich den postmaster starte, bekomme ich einen Bad System Call oder eine core dumped Meldung. Warum?
-
-Das kann verschiedene Ursachen haben. Überprüfe zuerst, ob Dein Kernel System V Extensions
-enthält. PostgreSQL benötigt die Kernel-Unterstützung für Shared Memory und Semaphoren.
-
-
-
3.4) Wenn ich versuche, den postmaster zu starten, bekomme ich IpcMemoryCreate Fehlermeldungen. Warum?
-
-Du hast entweder den Kernel nicht für Shared Memory konfiguriert, oder Du mußt den
-Shared Memory Bereich vergrößern.
-Die genaue Größe hängt von Deiner Systemarchitektur ab und mit wievielen
-Puffern und Serverprozessen Du postmaster konfiguriert hast.
-Für die meisten Systeme, mit Standardangaben für Puffer und Prozessen benötigst
-Du ein Minimum von ca. 1 MB.
-
-
-
3.5) Wenn ich versuche, den postmaster zu starten, bekomme ich IpcSemaphoreCreate Fehlermeldungen. Warum?
-
-Falls die Fehlermeldung IpcSemaphoreCreate: semget failed (No space
-left on device) lautet, dann ist Dein Kernel mit zu wenig Semaphoren konfiguriert.
-
-Postgres benötigt eine Semaphore pro möglichen Backend-Prozess.
-Eine Zwischenlösung wäre, postmaster mit einer geringeren Anzahl an Backend-Prozessen zu starten.
-Benutze dazu die -N Option mit einem Wert kleiner als die standardmäßigen 32.
-
-Eine dauerhafte Lösung wäre es, die Kernel-Parameter
-
SEMMNS und
SEMMNI zu erhöhen.
-
-Falls die Fehlermeldung anders aussieht, hast Du möglicherweise keine Semaphoren-Unterstützung
-in Deinem Kernel aktiviert.
-
-
-
3.6) Wie verhindere ich, daß andere Hosts auf meine PostgreSQL Datenbanken zugreifen?
-
-Die Standardeinstellung ist, daß PostgreSQL Verbindungen von der lokalen Maschine über
-Unix-Domain-Sockets erlaubt. Andere Maschinen werden keine Verbindung aufbauen können, bis
-der postmaster mit der -i Option gestartet ist und die Host-basierte Authentizierung
-in der Datei $PGDATA/pg_hba.conf entsprechend angepasst ist.
-Das erlaubt TCP/IP-Verbindungen.
-
-
3.7) Warum kann ich mich nicht von einer anderen Maschine mit meiner Datenbank verbinden?
-
-Die Standardeinstellung erlaubt nur Unix-Domain-Socket-Verbindungen der lokalen Maschine.
-Um TCP/IP Verbindungen zu ermöglichen, stelle sicher, daß der postmaster
-mit der -i Option gestartet wurde, und füge einen passenden Host-Eintrag in die Datei
-
pgsql/data/pg_hba.conf ein. Siehe auch die
pg_hba.conf Man-Page.
-
-
-
3.8) Warum kann ich nicht als root auf die Datenbank zugreifen?
-
-Du solltest keine Datenbank-Benutzer mit der User-ID 0 (root) erzeugen.
-Sie werden auf keine Datenbank zugreifen können. Das ist eine Sicherheitsmaßnahme,
-wegen der Möglichkeit Objekt-Module dynamisch in die Datenbank zu linken.
-
-
-
3.9) Alle meine Server stürzen bei gleichzeitigem Tabellenzugriff ab. Warum?
-
-Dieses Problem kann durch einen Kernel verursacht werden, der ohne Support für Semaphoren
-konfiguriert wurde.
-
-
-
3.10) Wie optimiere ich die Datenbankmaschine für bessere Leistung?
-
-Sicherlich können Indizes Abfragen beschleunigen. Der explain Befehl
-erlaubt Dir zu sehen, wie PostgreSQL Deine Abfrage interpretiert und welche Indizes
-benutzt werden.
-
-Wenn Du eine Menge INSERTs machst, überprüfe, ob Du sie als Stapelverarbeitung
-mit dem copy-Befehl abarbeiten kannst.
-Das ist viel schneller als einzelne INSERTs.
-
-Zweitens, SQL-Statements, die nicht in einem begin work/commit Transaktions-Block eingegeben werden,
-werden als eigene Transaktion behandelt. Überprüfe, ob die Statements nicht
-in einen einzelnen Transaktions-Block zusammengefasst werden können. Das reduziert den Transaktions-Overhead.
-
-Du kannst auch erwägen, Indizes zu löschen und neu zu erstellen, wenn Du große
-
-Es gibt verschiedene Tuning-Maßnahmen, die man ergreifen kann.
-Du kannst fsync() abschalten, indem Du beim Starten des postmasters die Optionen -o -F angibst.
-Das hindert fsync()´s daran, nach jeder Transaktion die Daten auf die Platte zu schreiben.
-
-Du kannst auch mit der -B Option des postmasters die Anzahl der Shared Memory Puffer für den Backend-Prozess erhöhen.
-Falls Du diesen Wert zu hoch einstellst, kann es sein, daß der postmaster nicht startet, weil
-der Shared Memory Speicherplatz Deines Kernels aufgebraucht wird.
-Jeder Puffer ist 8 kB groß und es gibt standardmäßig 64 Puffer.
-
-Du kannst ebenfalls die -S Option des Backends nutzen, um die Größe des Speicherplatzes für
-temporäres Sortieren zu erhöhen.
-Der -S Wert wird in Kilobyte gemessen und ist standardmäßig auf 512 kB festgelegt. Es wäre
-jedoch unklug, den Wert zu hoch anzugeben, da ein Query möglicherweise Speicherplatzmangel verursacht,
-wenn es viele gleichzeitige Sortierungen durchführen muß.
-
-Der cluster Befehl kann benutzt werden, um Daten in Basistabellen zu gruppieren, so daß sie
-auf einen Index zusammengebracht werden. Siehe auch die cluster(l) Man-Page für weitere Details.
-
-
-
3.11) Welche Debugging/Fehlersuch-Hilfsmittel sind für PostgreSQL verfügbar?
-
-PostgreSQL hat einige Möglichkeiten, Statusinformationen zu berichten, die
-nützlich für die Fehlersuche sein können.
-
-Erstens, wenn beim configure-Lauf die Option --enable-cassert angegeben wurde,
-verfolgen viele assert()´s den Fortschritt des Backends und halten das Programm
-an, wenn etwas Unerwartetes passiert.
-
-Postmaster und postgres, haben mehrere Fehlersuch-Optionen zur Verfügung.
-Stelle zuerst sicher, daß Du den Standard-Output und Fehlerkanal in eine Datei umleitest, wenn Du den postmaster startest, :
-
- cd /usr/local/pgsql
- ./bin/postmaster >server.log 2>&1 &
-
-
-Das erzeugt eine server.log Datei im PostgreSQL-Verzeichnis.
-Diese Datei enthält nützliche Informationen über Probleme oder Fehler, die im Server
-aufgetreten sind. Postmaster hat eine -d Option, die noch detailliertere Informationen liefert.
-Zur -d Option wird eine Nummer angegeben, die den Debug-Level - also die Menge der berichteten Information - angibt.
-Achtung, hohe Debug-Level erzeugen schnell große Logdateien!
-
-Du kannst tatsächlich das Postgres-Backend auf der Kommandozeile
-laufen lassen und SQL-Statements direkt eingeben.
-Diese Vorgehensweise wird aber nur zur Fehlersuche empfohlen.
-Beachte, daß ein Zeilenumbruch das SQL-Statement beendet, nicht das Semikolon.
-Wenn Du PostgreSQL mit Debugging-Symbolen kompiliert hast, kannst Du einen Debugger
-benutzen, um zu beobachten, was passiert.
-Da das Backend nicht vom postmaster gestartet wurde, läuft es nicht in der
-gleichen Umgebung und deshalb können einige locking/backend Operationen
-nicht reproduziert werden.
-Einige Betriebssysteme können sich an einen Backend-Prozess direkt
-anhängen, um Probleme zu diagnostizieren.
-
-Das Programm postgres hat -s, -A und -t Optionen, die bei der Fehlersuche
-und Leistungsmessung sehr nützlich sein können.
-
-Du kannst das Paket auch mit Profiling kompilieren, um zu sehen, welche Funktionen wieviel
-Ausführungszeit beanspruchen.
-Das Backend Profil wird im Verzeichnis pgsql/data/base/dbname abgelegt.
-Das Client Profil wird in das aktuelle Verzeichnis abgelegt.
-
-
-
3.12) Ich bekomme die Meldung "Sorry, too many clients", wenn ich eine Verbindung versuche. Warum?
-
-Du mußt die Grenze des postmasters, die festlegt,
- wieviele gleichzeitige Backend-Prozesse gestartet werden können, hochsetzen.
-
-In Postgres 6.5 sind das normalerweise 32 Prozesse. Du kannst diesen Wert dadurch erhöhen,
-daß Du den postmaster mit einem entsprechenden -N Wert neu startest.
-In der Standardkonfiguration kannst Du -N auf maximal 1024 setzen.
-Falls Du mehr brauchst, erhöhe MAXBACKENDS in include/pg_config.h und
-kompiliere das Paket neu.
-Du kannst den Standardwert von -N während der Konfiguration
-setzen, indem Du --with-maxbackends angibst.
-
-Anmerkung: Falls Du -N größer als 32 einstellst, solltest
-Du -B auf einen Wert, höher als 64 setzen.
-Für eine hohe Anzahl an Backend-Prozessen, solltest Du möglicherweise einige
-Unix-Kernel Parameter ebenfalls erhöhen.
-Folgendes Parameter solltest Du prüfen:
-die Maximalgröße der Shared Memory Blocks SHMMAX,
-die Maximalanzahl der Semaphoren SEMMNS und SEMMNI,
- die maximale Anzahl von Prozessen NPROC,
-die maximale Anzahl von Prozessen pro User MAXUPRC,
-und die Maximalzahl der geöffneten Dateien NFILE und NINODE.
-
-Der Grund für die Begrenzung der erlaubten Backend-Prozesse liegt darin, daß
-verhindert werden soll, daß das System seine freien Ressourcen aufbraucht.
-
-In den Postgres-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 MaxBackendId in include/storage/sinvaladt.h.
-entsprechend angepasst wurde.
-
-
3.13) Was sind die pg_psort.XXX Dateien in meinem Datenbank-Verzeichnis?
-
-Dies sind temporäre Dateien, die durch den Query-Ausführer erzeugt werden.
-Wenn zum Beispiel eine Sortierung durchgeführt werden muß, um ein ORDER BY
-auszuführen, und diese Sortierung mehr Platz benötigt, als mit dem Backend-Parameter -S
-erlaubt wurde, dann werden diese temporären Dateien erzeugt, um die Daten dort zu halten.
-
-Die temporären Dateien sollten automatisch gelöscht werden, falls das Backend jedoch
-während einer Sortierung abstürzt, bleiben sie erhalten.
-Wenn zu diesem Zeitpunkt keine Transaktion läuft, kannst Du die
-pg_tempNNN.NN Dateien ohne Gefahr löschen.
-
-
3.14) Wie richte ich eine Benutzergruppe (pg_group) ein?
-
-Zur Zeit gibt es keine einfache Schnittstelle, um Benutzergruppen einzurichten
-Du mußt explizit die pg_group-Tabelle mittels INSERT/UPDATE modifizieren.
-Zum Beispiel:
-
-
- jolly=> INSERT into pg_group (groname, grosysid, grolist)
- jolly=> values ('posthackers', '1234', '{5443, 8261}');
- INSERT 548224
- jolly=> grant INSERT on foo to group posthackers;
- CHANGE
- jolly=>
-
-
- Die Felder in pg_group sind:
-
groname: der Gruppenname. Dieser Name sollte rein alphanumerisch sein. Keine Unterstriche oder andere Punktionen
-
grosysid: die Gruppen-ID. Die Gruppen-ID ist ein int4-Feld. Sie sollte eindeutig für jede Gruppe sein.
-
grolist: die Liste der pg_user IDs, die zu dieser Gruppe gehören. (int4[].)
-
-
-
-
-
-
-
4.1) Das System scheint Kommata, Dezimalpunkte und Datumsformate durcheinanderzubringen.
-
-Überprüfe die Konfiguration Deiner Locale-Einstellung. PostgreSQL benutzt die
-Einstellungen des jeweiligen Users und nicht die des postmaster Prozesses.
-Es gibt postgres und psql SET Befehle, um das Datumsformat zu kontrollieren.
-Setzte diese entsprechend Deiner Arbeitsumgebung.
-
-
-
4.2) Was ist der genauer Unterschied zwischen Binary Cursors und Normal Cursors?
-
-Vgl. die
declare Man-Page für eine Beschreibung.
-
-
4.3) Wie wähle ich per SELECT nur die ersten paar Zeilen in einem Query aus?
-
-Vgl. die
fetch Man-Page, oder benutze SELECT ... LIMIT....
-
-Das verhindert nur, daß alle Ergebniszeilen zum Client übermittelt werden.
-Die komplette Abfrage muß abgearbeitet werden, selbst wenn Du nur die ersten paar Zeilen haben möchtest.
-Ziehe ein Query in Erwägung, das ein ORDER BY benutzt. Es gibt keine Möglichkeit Zeilen
-zurückzuliefern, bevor nicht die komplette Abfrage abgearbeitet ist.
-
-
4.4) Wie bekomme ich eine Liste der Tabellen oder anderen Dingen, die ich in psql sehen kann
-
-Du kannst Dir die Datei pgsql/src/bin/psql/psql.c mit dem Quellcode für psql ansehen.
-Sie enthält die SQL-Befehle, die die Backslash-Kommandos (\) ausführen.
-Seit Postgres 6.5 kannst Du psql auch mit der -E Option starten. Dadurch gibt
-psql die Queries aus, die es bei der Ausführung der Befehle benutzt.
-
-
-
4.5) Wie entferne ich eine Spalte von einer Tabelle?
-
-Wir unterstützen alter table drop column nicht, aber mache es so:
- SELECT ... -- wähle alle Spalten außer die, die Du entfernen willst
- INTO TABLE new_table
- FROM old_table;
- DROP TABLE old_table;
- ALTER TABLE new_table RENAME TO old_table;
-
-
-
-
4.6) Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine Datenbank?
-
-Zeilen sind auf 8 kB begrenzt, aber das kann geändert werden, indem Du in
-include/config.h die Konstante BLCKSZ änderst.
-Um Attribute mit mehr als 8 kB zu nutzen, kannst Du auch das "Large Object Interface" benutzen.
-Zeilen überschreiten keine 8 kB-Grenzen. Eine Zeile mit 5 kB wird 8 kB Speicherplatz benötigen.
-
-Tabellen- und Datenbankgrößen haben keine Grenzen. Es gibt viele Datenbanken mit zig Gigabytes und
-wahrscheinlich einige mit hunderten Gigabyte.
-
-
4.7) Wieviel Plattenplatz benötigt eine Datenbank zur Speicherung einer Datendatei mit zeilenweisen Datensätzen?
-
-Eine Postgres Datenbank kann ungefähr sechseinhalb mal soviel Platz brauchen,
-wie eine einfache Textdatei.
-
-Betrachten wir eine Datei mit 300.000 Zeilen, mit jeweil zwei Integern pro Zeile.
-Die einfache Textdatei benötigt 2,4 MB Speicherplatz.
-Die Größe der Postgres Datenbankdatei, die diese Daten enthält, liegt
-ungefähr bei 14 MB.
-
- 36 Bytes: jeder Zeilenkopf (ungefähr)
- + 8 Bytes: zwei Integer-Felder @ jedes 4 Bytes
- + 4 Bytes: Zeiger auf den Datensatz
+
3.6) Wie optimiere ich die Datenbank für bessere Leistung?
+
+
Der Einsatz von Indizes sollte auf jeden Fall Abfragen beschleunigen. Die
+ Anweisung EXPLAIN zeigt, wie PostgreSQL Abfragen interpretiert und welche
+ Indizes benutzt werden.
+
+
Wenn Sie eine große Anzahl von INSERT-Anweisungen durchführen, sollten Sie
+ überlegen, ob die Durchführung mit der COPY-Anweisung in Frage kommt. Dies
+ funktioniert wesentlich schneller als einzelne INSERT-Befehle.
+ SQL-Anweisungen, die sich nicht in einem BEGIN WORK/COMMIT 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.
+
+
Es gibt verschiedene Tuning-Optionen. Sie können fsync() ausschalten,
+ indem Sie beim Starten des postmaster die Optionen -o -F angeben. Das
+ hindert fsync()-Operationen daran, nach jeder Transaktion die Daten direkt
+ auf die Festplatte zu schreiben.
+
+
Sie können auch mit der -B Option des postmaster 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 postmaster 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.
+
+
Sie können auch die -S Option des Backends nutzen, um die Größe
+ des Speicherplatzes für temporäres Sortieren zu erhöhen. Der -S Wert
+ wird in Kilobyte gemessen und ist standardmäßig auf 512 kB festgelegt.
+
+
Die CLUSTER-Anweisung kann benutzt werden, um Daten in Basistabellen zu
+ gruppieren, so dass sie auf einen Index zusammengebracht werden. Siehe
+ auch die CLUSTER(l) Man-Page für weitere Details.
+
+
3.7) Welche Debugging-Funktionen sind für PostgreSQL verfügbar?
+
+
PostgreSQL hat einige Möglichkeiten, Statusinformationen anzuzeigen,
+ die bei der Fehlersuche nützlich sein können.
+
+
Wenn Sie PostgreSQL mit dem --enable-cassert Option kompiliert
+ haben, verfolgen zahlreiche assert()-Anweisungen den Ablauf des
+ Backends und halten das Programm an, wenn etwas Unerwartetes passiert.
+
+
Sowohl der postmaster als auch postgres 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 postmaster starten:
+ cd /usr/local/pgsql
+ ./bin/postmaster >server.log 2>&1 &
+
+
+
Dadurch wird die Datei server.log im PostgreSQL-Verzeichnis erzeugt. Diese
+ Datei enthält nützliche Informationen über Probleme oder Fehler, die
+ im Server aufgetreten sind. postmaster hat eine -d Option, die noch
+ detailliertere Informationen liefert. Zur -d 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!
+
+
Wenn der postmaster nicht läuft, können Sie sogar den postgres-Backend
+ von der Befehlszeile ausführen und eine SQL-Anweisung direkt eingeben.
+ Dies ist nur für Debugging-Zwecke zu empfehlen. Beachten Sie, dass ein
+ Zeilenumbruch, und nicht das Semikolon die SQL-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
+ postmaster gestartet wurde, läuft es nicht in der gleichen
+ Umgebung und deshalb können einige locking/backend Operationen nicht
+ reproduziert werden.
+
+
Wenn dagegen der postmaster läuft, führen Sie psql in einem Fenster aus, dann
+ ermitteln Sie die Prozessnummer (PID) des postgres-Prozesses, der von psql
+ verwendet wird. Binden Sie einen Debugger an diese PID und führen Sie
+ Abfragen von psql aus. Wenn Sie den postgres-Serverstart analysieren wollen,
+ setzen Sie die Umgebungsvariable PGOPTIONS="-W n", und starten Sie dann
+ psql. Dies verzögert den Start um n Sekunden, damit Sie einen Debugger an
+ den Prozess binden können und ggf. Breakpoints setzen, bevor die
+ Startsequenz begonnen wird.
+
+
Das Programm postgres hat auch die Optionen -s, -A und -t, die bei der Fehlersuche
+ und Performanzmessung sehr nützlich sein können.
+
+
Sie können die Anwendung auch mit Profiling kompilieren, um zu sehen,
+ welche Funktionen wieviel Ausführungszeit beanspruchen. Das Backend
+ Profil wird im Verzeichnis pgsql/data/base/dbname abgelegt. Das
+ Client-Profil wird in das aktuelle Verzeichnis abgelegt. Bitte beachtern Sie,
+ dass unter Linux PostgreSQL mit der Option -DLINUX_PROFILE kompiliert werden
+ muß, um Profiling nutzen zu können.
+
+
3.8) Ich bekomme die Meldung "Sorry, too many clients", wenn ich eine
+ Verbindung augzubauen versuche. Warum?
+
+
Sie müssen die maximale Anzahl der gleichzeitig ausfühbaren Backend-
+ Prozesse hochsetzen.
+
+
Die Voreinstellung ist 32 Prozesse. Sie können diese erhöhen, indem Sie
+ den postmaster mit einem entsprechenden -N Parameter starten bzw. die
+ Konfigurationsdatei postgresql.conf anpassen.
+
+
Bitte beachten Sie, dass Sie auch -B auf ein Wert größer als die Voreinstellung
+ von 64 setzen müssen, wenn Sie -N auf einen Wert höher als 32 setzen;
+ -B muss mindestens das Doppelte von -N 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 SHMMAX; die Maximalanzahl der
+ Semaphoren SEMMNS und SEMMNI; die maximale Anzahl von Prozessen NPROC;
+ die maximale Anzahl von Prozessen pro User MAXUPRC; und die Maximalzahl
+ der geöffneten Dateien NFILE und NINODE. Durch die Begrenzung der Anzahl
+ erlaubter Backend-Prozesse wird verhindert, dass System-Ressourcen
+ durch PostgreSQL aufgebraucht werden.
+
+
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 MaxBackendId in include/storage/sinvaladt.h
+ entsprechend angepasst werden mußte.
+
+
3.9) Was befindet sich im Verzeichnis pgsql_tmp/?
+
+
Dieses Verzeichnis enthält temporäre Dateien, die durch den query executor
+ erzeugt werden. Wenn zum Beispiel eine Sortierung durchgeführt werden muß,
+ um ein ORDER BY auszuführen, und diese Sortierung mehr Hauptspeicher
+ benötigt, als mit dem Backend-Parameter -S erlaubt wurde, dann werden
+ diese Dateien erzeugt, um die Daten dort zu auszulagern.
+
+
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 postmaster werden sie
+ auomatisch gelöscht.
+
+
3.10) Warum muß ich bei jeder neuen Hauptversion von PostgreSQL
+ die komplette Datenbank exportieren und anschließend reimportieren?
+
+
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.
+
+
Bei Versionenwechseln, wo kein Formatänderungen stattgefunden haben,
+ kann das pg_upgrade-Skript benutzt werden, um die Daten ohne Aus-
+ und Einlesen zu übertragen. Die jeweilige Dokumentation gibt an, ob für
+ die betreffende Version pg_upgrade verfügbar ist.
+
+
+
+
Fragen zum Betrieb
+
+
4.1) Worin besteht der Unterschied zwischen Binary Cursors und Normal
+ Cursors?
+
+
Vgl. die DECLARE Man-Page für eine Beschreibung.
+
+
4.2) Wie wähle ich per SELECT-Anweisung nur die ersten paar
+ Zeilen in einer Abfrage aus?
+
+
Vgl. die FETCH Man-Page, oder benutzen Sie SELECT ... LIMIT... .
+
+
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 ORDER BY-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.
+
+
Bitte beachten Sie, dass mit PostgreSQL 7.3 die Syntax LIMIT n, m
+ durch LIMIT n OFFSET m ersetzt wurde.
+
+
+
4.3) Wie bekomme ich eine Liste der Tabellen oder anderen Dinge, die ich
+ in psql sehen kann?
+
+
Sie können sich die Datei pgsql/src/bin/psql/describe.c mit dem Quellcode
+ für psql ansehen. Sie enthält die SQL-Abfragen, die die
+ Backslash-Kommandos (\) ausführen. Sie können psql auch mit der -E
+ Option starten. Danach gibt psql die Abfragen aus, die es bei der Ausführung der Befehle
+ benutzt.
+
+
4.4) Wie entferne ich eine Spalte aus einer Tabelle?
+
+
Der Syntax ALTER TABLE DROP COLUMN wird erst ab PostgreSQL 7.3 unterstützt.
+
+
Bei früheren Versionen bietet das folgende Verfahren Ersatz:
+ 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;
+
+
+
4.5) Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine Datenbank?
+
+
Es bestehen folgende Obergrenzen:
+ 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
+
+
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.
+
+
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.
+
+
Die maximale Tabellengröße und die maximale Anzahl von Spalten können
+ gesteigert werden, wenn die Default-Blockgröße auf 32 KB heraufgesetzt
+ wird.
+
+
4.6) Wieviel Plattenplatz wird benötigt, um die Daten aus einer typischen
+ Textdatei abzuspeichern?
+
+
Eine PostgreSQL-Datenbank kann beim Abspeichern einer einfachen Textdatei
+ bis zu fünfmal mehr Platz gegenüber der eigentlichen Größe der Datei
+ beanspruchen.
+
+
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:
+ 36 Bytes: jeder Zeilenkopf (ungefähr)
+ +24 Bytes: ein Integer-Feld und ein Textfeld
+ + 4 Bytes: Zeiger auf der Datenseite auf den Tupel
-----------------------------------------------
- 48 Bytes pro Zeile
-
- Die Größe einer Datenseite in PostgreSQL ist 8192 Bytes (8 KB), also:
-
+ 64 Bytes pro Zeile
+
+
Die Größe einer Datenseite in PostgreSQL beträgt 8192 Bytes (8 KB), also:
8192 Bytes pro Seite
- --------------------- = 171 Zeilen pro Seite (aufgerundet)
- 48 Bytes pro Zeile
-
- 300000 Datenzeilen
- ----------------------- = 1755 Datenbankseiten
- 171 Zeilen pro Seite
-
-1755 Datenbankseiten * 8192 Bytes pro Seite = 14,376,960 Bytes (14MB)
-
-
-Indizes haben nicht einen solchen Overhead, sie beinhalten jedoch die Daten, die sie
-indizieren und können so auch sehr groß werden.
-
-
4.8) Wie finde ich heraus, welche Indizes oder Operationen in der Datenbank definiert sind?
-
-psql hat eine Vielzahl von Backslash Befehlen, um solche Informationen zu zeigen.
-Benutze \?, um sie zu sehen.
-
-Schaue Dir auch die Datei pgsql/src/tutorial/syscat.source. an.
-Sie illustriert viele der SELECTs, die benötigt werden, um diese Informationen
-von der Datenbank-Systemtabelle zu erhalten
-
-
-
4.9) Meine Queries sind langsam oder nutzen die Indizes nicht. Warum?
-
-PostgeSQL pflegt automatische Statistiken nicht.
-Um die Statistiken zu aktualisieren, mußt Du ein explizites vacuum eingeben.
-Nach dieser Aktualisierung weiß der Optimierer
-wieviele Zeilen in der Tabelle sind und kann besser entscheiden, ob Indizes benutzt werden sollten.
-Der Optimierer benutzt keine Indizes, wenn die Tabelle klein ist, weil ein sequentieller Suchlauf
-dann schneller sein würde.
-
-Benutze den Befehl vacuum analyze für die spaltenspezifische Optimierung.
- Vacuum analyze ist für komplexe Multi-Join-Abfragen wichtig, damit der Optimierer
-die Anzahl der Zeilen von jeder Tabelle schätzen und dann die passende Join-Reihenfolge
-wählen kann.
-Das Backend verfolgt die Spaltenstatistik nicht selbst, so daß vacuum analyze
-regelmäßig aufgerufen werden sollte.
-
-Indizes werden nicht für
ORDER BY Operationen benutzt.
-
-Bei der Nutzung von Wildcard-Operatoren wie LIKE oder ~, können Indizes
-nur benutzt werden, wenn die Suche mit dem Anfang eines Strings startet.
-Um also Indizes zu nutzen, sollten LIKE-Suchen nicht mit
-%, und ~ beginnen (Die Sucheparameter regulärer Ausdrücke sollten
-mit ^. beginnen.
-
-
4.10) Auf welche Weise kann ich sehen, wie der Query-Optimierer meine Abfrage auswertet?
-
-Vgl. die
EXPLAIN Man-Page.
-
-
4.11) Was ist ein R-Tree Index?
-
-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 POINT
-gebildet wird, dann kann das System Abfragen wie z.B. "Zeige alle Punkte,
-die sich in einem umgebenden Rechteck befinden" effizienter beantworten.
-
-Die kanonische Veröffentlichung , die das originale R-Tree Design beschreibt ist:
-
-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.
-
-Du kannst dieses Werk ebenfalls in Stonebraker's "Readings in Database
-
-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.
-
-
-
4.12) Was ist "Genetic Query Optimization"?
-
-Das GEQO-Modul in PostgreSQL soll dazu dienen, das Optimierungsproblem beim
-Joining vieler Tabellen auf der Basis genetischer Algorithmen (GA) zu lösen.
-Es erlaubt die Behandlung von großen Join-Queries ohne erschöpfende Suche.
-Für weitere Informationen siehe die Dokumentation.
-
-
-
4.13) Wie verfahre ich bei der Suche mit regulären Ausdrücken und bei einer Suche mit Ignorierung der Groß- und Kleinschreibweisen?
-
-~ und ~* sind wahrscheinlich das, was Du willst.
-
-
-
4.14) Wie ermittle ich in einem Query, daß ein Feld NULL ist?
-
-Du testest die Spalte mit IS NULL und IS NOT NULL.
-
-
-
4.15) Was ist der Unterschied zwischen den verschiedenen CHAR-Typen?
-
-Typ interner Name Bemerkungen
---------------------------------------------------
-CHAR char 1 Zeichen
-CHAR(#) bpchar mit Leerzeichen gefüllt bis zur angegebenen Länge
-VARCHAR(#) 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
-
-Du mußt die internen Namen benutzen, wenn Du interne Operationen durchführen willst.
-
-Die letzten vier Typen sind "varlena"-Typen (d.h. die ersten vier Bytes geben die Länge an, gefolgt
-von den Daten).
-CHAR(#) belegt die maximale Anzahl von Bytes, unabhängig davon, wieviele Daten im
-Feld gespeichert werden.
-TEXT, VARCHAR(#) und BYTEA haben alle eine variable Länge auf dem Datenträger,
-deshalb gibt es einen leichten Geschwindigkeitsnachteil bei der Nutzung dieser Typen.
-Genauer, der Nachteil gilt für den Zugriff auf alle Spalten nach der ersten Spalte dieses Typs.
-
-
-
4.16) Wie erzeuge ich ein serielles Feld mit automatischer Erhöhung des Inhalts?
-
-PostgreSQL unterstützt einen SERIAL Datentyp. Er erzeugt automatisch eine
-Sequenz und einen Index auf die Spalte. Siehe die create_sequence Man-Page
-für weitere Informationen über Sequenzen.
-
-Du kannst aber auch das Oid Feld jeder Zeile als eindeutigen Wert nutzen.
-Jedoch mußt Du, falls Du Deine Datenbank einmal komplett ausgeben und wieder einlesen willst,
-die
pg_dump's -o oder die
copy with oids Option benutzen, um die Oids zu retten.
-
-
4.17) Was ist ein Oid? Was ist ein Tid?
-
-Oids sind PostgreSQLs Antwort auf eindeutige Zeilen-IDs. Jede Zeile, die in PostgreSQL
-erzeugt wird, bekommt eine eindeutige Oid. Alle Oids, die während initdb erzeugt werden, sind kleiner
-als 16384 (nach backend/access/transam.h).
-Alle Oids, die durch den Benutzer erzeugt werden, sind gleich oder größer als dieser Wert.
-Standardmäßig sind all diese Oids nicht nur innerhalb einer Tabelle oder Datenbank, sondern
-in der gesamten PostgreSQL Installation eindeutig.
-PostgreSQL benutzt Oids in seinen internen Systemtabellen, um Zeilen zwischen den Tabellen zu
-verbinden. Diese Oids können zur Identifikation spezifischer Benutzerzeilen und in Joins
-genutzt werden.
-Es wird empfohlen, den Spaltentyp OID zu nutzen, um Oids-Werte zu speichern.
-Siehe die sql(l) Man-Page, um die anderen internen Spalten kennenzulernen.
-Du kannst einen Index auf ein Oid-Feld erzeugen, um schnelleren Zugriff zu erreichen.
-
-Oids werden allen neuen Zeilen von einem zentralen Bereich, der von allen Datenbanken
-genutzt wird, zugewiesen. Es gibt keinen Grund, warum Du nicht die Oid ändern, oder eine Kopie der
-Tabelle mit den originalen Oids anlegen könntest.
- 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';
-
-
-Tids werden genutzt, um spezifische physische Zeilen mit Block und
-Versatzwert zu identifizieren. Tids ändern sich, wenn Zeilen geändert oder
-neu geladen werden. Sie werden von Index-Einträgen genutzt, um die
-Zeilen physisch zu adressieren.
-
-
4.18) Was ist die Bedeutung der verschiedenen Ausdrücke, die in PostgreSQL benutzt werden (z.B. attribute, class,...)?
-
-Einige der Quelltexte und die ältere Dokumentation nutzen allgemeine Begriffe.
-Hier sind einige aufgeführt:
-
-
row, record, tuple
-
attribute, field, column
-
table, class
-
retrieve, SELECT
-
replace, UPDATE
-
append, INSERT
-
oid, serial value
-
portal, cursor
-
range variable, table name, table alias
-
-
4.19) Wieso bekomme ich einen Fehler: "FATAL: palloc failure: memory exhausted?"
-
-Möglicherweise ist der virtuelle Speicher verbraucht oder Dein Kernel hat
-eine niedrige Grenze für bestimmte Ressourcen.
-Versuche dieses, bevor Du den postmaster startest:
-
-
- ulimit -d 65536
- limit datasize 64m
-
-
-
-Je nach Deiner eingesetzten Shell mag nur einer dieser Befehle funktionieren.
-Aber es wird die Grenze des Datensegments für Prozesse erhöhen und vielleicht
-läuft so Dein Query durch.
-Dieser Befehl wirkt sich auf den aktuellen Prozess und alle seine Unterprozesse
-aus, die nach diesem Befehl gestartet werden. Falls Du ein Problem mit dem SQL-CLient hast,
-weil das Backend zu viele Daten zurückliefert, versuche diesen Befehl, bevor Du den
-SQL-Client startest.
-
-
4.20) Wie kann ich feststellen, welche PostgreSQL-Version ich laufen habe?
-
-Gib in
psql SELECT version();
ein
-
-
4.21) Beim Arbeiten mit "large-object" kommt die Fehlermeldung: invalid large obj descriptor. Warum?
-
-Du solltest die Befehle BEGIN WORK
und COMMIT
- bei jeden Gebrauch von Large Objects benutzen. Also um
-
-Die Dokumentation hat schon immer darauf hingewiesen, daß
-lo_open in eine Transaktion eingebunden werden muß, aber die PostgreSQL Versionen vor 6.5
-haben diese Regel nicht erzwungen.
-Statt dessen scheiterten sie gelegentlich, wenn Du diese Regel gebrochen hattest.
-
-Das aktuelle PostgreSQL erzwingt diese Regel, indem es die Handles der Large Objects
-beim COMMIT der Transaktion schließt, was sofort nach dem lo_open passiert,
-wenn Du nicht innerhalb einer Transaktion bist.
-So führt der erste Versuch, etwas mit dem Large Object zu machen zu einem
-invalid large obj descriptor.
-Also wird der Code, der bisher benutzt wurde, nun diese Fehlermeldung erzeugen, wenn Du
-keine Transaktionen benutzt hast.
-Falls Du eine Client-Schnittstelle wie ODBC benutzt, kann es sein, daß Du
-
auto-commit off
setzen mußt.
-
-
-
-
-
-
5.1) Ich habe eine benutzerdefinierte Funktion geschrieben. Wenn ich sie in psql aufrufe, kommt ein core dump. Warum?
-
-Dieses Problem kann viele Ursachen haben. Teste deine Funktion zuerst in einem
-Extra-Testprogramm. Stelle außerdem sicher, daß Deine Funktion nicht etwa elog-Nachrichten sendet, wenn der Client Daten erwartet,
-wie in den type_in() oder type_out() Funktionen
-
-
-
5.2) Was bedeutet die Meldung: NOTICE:PortalHeapMemoryFree: 0x402251d0 not in alloc set!?
-
-Du pfreest etwas, das Du nicht palloct hast!
-Stelle sicher, daß Du nicht malloc/free und palloc/pfree durcheinanderwürfelst.
-
-
-
5.3) Wie kann ich ein paar elegante neue Feldtypen und Funktionen zu PostgreSQL beitragen?
-
-Sende Deine Erweiterungen zur pgsql-hackers Mailing Liste,
-und sie werden eventuell im
contrib/ Verzeichnis enden.
+ --------------------- = 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)
+
+
Indizes beanspruchen nicht so viel Platz. Da sie jedoch die
+ Daten beinhalten, die sie indizieren, können auch sie sehr groß werden.
+
+
NULL-Werte werden in Bitmaps gespeichert, wodurch sie sehr wenig
+ Platz in Anspruch nehmen.
+
+
4.7) Wie finde ich heraus, welche Indizes oder Operationen in der Datenbank
+ definiert sind?
+
+
psql hat eine Vielzahl von Backslash-Befehlen, mit denen solche Informationen
+ angezeigt werden können. Der Befehl \? zeigt eine Übersicht. Außerdem
+ zeigt der Befehl \l eine Liste von allen verfügbaren Datenbanken an.
+
+
Die Datei pgsql/src/tutorial/syscat.source enthält außerdem viele
+ SELECT-Anweisungen, mit deren Hilfe man Information über die Systemtabellen
+ erhalten kann.
+
+
4.8) Meine Abfragen sind langsam oder nutzen die Indizes nicht. Warum?
+
+
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).
+
+
Um festzustellen, ob ein Index verwendet werden soll, braucht PostgreSQL
+ Statistiken über die Tabelle. Diese Statistiken werden durch die Anweisungen
+ VACUUM ANALYZE bzw. ANALYZE 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 JOIN-Reihenfolge und -Methoden wertvoll.
+
+
Indizes werden normalerweise nicht in ORDER BY-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 LIMIT zusammen mit
+ ORDER BY 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:
+ SELECT spalte
+ FROM tabelle
+ ORDER BY spalte [ DESC ]
+ LIMIT 1
+
+
(Die Aggregatfunktionen MIN() und MAX() verwenden keine Indizes).
+
+
Bei der Nutzung von Wildcard-Operatoren wie LIKE oder ~, können
+ Indizes nur unter bestimmten Umständen verwendet werden:
+
Der Anfang des Suchmusters muß mit dem Anfang des Strings
+ verknüpft werden, d.h.:
+
LIKE-Suchmuster dürfen nicht mit % anfangen;
+
~ (reguläre Ausdrücke) müssen mit ^ anfangen.
+
+
+
Das Suchmuster darf nicht mit einer Zeichenklasse (z.B. [a-e])
+ anfangen
+
+
Suchmuster, die Gross- und Kleinschreibung nicht berücksichtigen (z.B.
+ ILIKE bzw. ~*), verwenden keine Indizes. Stattdessen können
+ funktionale Indizes verwendet werden, die im Punkt
4.12 beschrieben werden.
+
+
Die C-Locale muß während der Datenbank-Initialisierung mit initdb
+ bestimmt worden sein.
+
+
4.9) Auf welche Weise kann ich sehen, wie der Abfrage-Optimierer meine
+ Abfrage auswertet?
+
+
Vgl. die EXPLAIN Man-Page.
+
+
4.10) Was ist ein R-Tree Index?
+
+
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 POINT
+ gebildet wird, dann kann das System Abfragen wie z.B. "Zeige alle
+ Punkte, die sich in einem umgebenden Rechteck befinden" effizienter
+ beantworten.
+
+
Die kanonische Veröffentlichung, die das originale R-Tree Design
+ beschreibt, ist:
+
+
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.
+
+
Sie können dieses Werk auch in Stonebrakers "Readings in Database
+ Systems" finden.
+
+
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.
+
+
4.11) Was ist der "Genetic Query Optimizer"?
+
+
Das GEQO-Modul in PostgreSQL soll dazu dienen, das Optimierungsproblem
+ beim JOIN 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.
+
+
4.12) 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?
+
+
Der Operator ~ bewirkt die Anwendung eines regulären Ausdrucks. ~* führt
+ zur Anwendung eines regulären Ausdrucks mit Ignorierung der Groß-
+ und Kleinschreibung.
+
+
Gleichheitsvergleiche, die Groß- und Kleinschreibung ignorieren, werden
+ in der Regel so ausgedruckt:
+ SELECT *
+ FROM tabelle
+ WHERE LOWER(spalte) = 'abc'
+
+
Ein funktionaler Index, der wie folgt erstellt wird, wird auf jeden Fall
+ verwendet:
+ CREATE INDEX tabelle_index ON tabelle (LOWER(spalte))
+
+
4.13) Wie ermittle ich in einer Abfrage, ob ein Feld NULL ist?
+
+
Testen Sie die Spalte mit IS NULL bzw. IS NOT NULL.
+
+
4.14) Was ist der Unterschied zwischen den verschiedenen CHAR-Typen?
+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
+
+
Der interne Name kommt vor allem in den Systemkatalogen und in manchen
+ Fehlermeldungen vor.
+
+
Die letzten vier Typen sind "varlena"-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 TOAST-
+ Verfahren angewendet, womit der tatsächlich belegte Platz auch geringer
+ als erwartet ausfallen kann.
+
+
CHAR(n) 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. TEXT setzt keine Längengrenze, allerdings gibt es
+ eine systembedingte Obergrenze von 1 GB. BYTEA ist für binäre Daten,
+ besonders für Werte, die NULL-Bytes haben. Die erwähnten Typen weisen
+ ähnliche Performanzeigenschaften auf.
+
+
4.15.1) Wie erzeuge ich ein serielles Feld mit automatischer Erhöhung des
+ Werts?
+
+
PostgreSQL bietet einen SERIAL-Datentyp. Dieser erzeugt automatisch
+ eine Sequenz und einen Index auf die angegebene Spalte. Zum Beispiel:
+ CREATE TABLE person (
+ id SERIAL,
+ name TEXT
+ )
+ 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 );
+
+
Die create_sequence Man-Page liefert weitere Informationen über Sequenzen.
+ Es ist auch möglich, den OID-Wert jeder Spalte als einmaligen Wert
+ einzusetzen. Sollten Sie allerdings die Datenbank exportieren und
+ reimportieren wollen, müssen Sie die Option -o von pg_dump bzw. COPY
+ WITH OIDS verwenden, um die OIDs beizubehalten.
+
+
4.15.2) Wie bekomme ich den Wert einer SERIAL-Sequenz?
+
+
Eine Möglichkeit wäre, mit der nextval()-Funktion den nächsten SERIAL-Wert
+ von dem Sequenzobjekt vor der Auszuführung einer INSERT-Anweisung anzufordern und ihn
+ dann explizit in die INSERT-Anweisung einzubinden. Anhand der Beispieltabelle in
+
4.15.1 könnte dieser Vorgang in einer Pseudosprache so aussehen:
+ new_id = output of execute("SELECT nextval('person_id_seq')");
+ execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
+
+
Danach stünde der neue Wert in der Variablen new_id 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 SEQUENCE-Objektes folgenden Name hat:
+ <table>_<serialcolumn>_seq
+ wobei 'table' und 'serialcolumn' die Namen der jeweils betreffenden
+ Tabelle / Spalte darstellen.
+
+
Als weitere Möglichkeit können Sie nach einer INSERT-Anweisung den
+ automatisch eingefügten SERIAL-Wert mit der currval()-Funktion zurückgeben
+ lassen:
+ execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");
+ new_id = output of execute("SELECT currval('person_id_seq')");
+
+
Schließlich besteht noch die Möglichkeit, den von einer INSERT-Anweisung
+ zurückgelieferten OID-Wert als einmaligen Wert zu verwenden.
+ In Perl mit dem DBD::Pg-Modul von Edmund Mergl wird der OID-Wert nach einem
+ $sth->excute() über $sth->{pg_oid_status} zurückgeliefert.
+
+
4.15.3) Führen currval() und nextval() zu einer Race-Condition mit anderen
+ Nutzern?
+
+
Nein. Die Funktionen liefern einen Wert zurück, der von Ihrem Backend
+ bestimmt wird, und der anderen Benutzern nicht zur Verfügung steht.
+
+
4.15.4) Warum werden die Sequenzwerte nach einem Transaktionsabbruch nicht
+ zurückgesetzt? Warum gibt es Lücken in der Nummerierung meiner
+ Sequenz-/SERIAL-Spalte?
+
+
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.
+
+
+
4.16) Was ist ein OID? Was ist ein TID?
+
+
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.
+
+
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.
+
+
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:
+ 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';
+
+
+
4.17) Welche Bedeutung haben die verschiedenen Ausdrücke, die in
+ PostgreSQL benutzt werden (z.B. attribute, class,...)?
+
+
Einige der Quelltexte und die ältere Dokumentation nutzen allgemeine
+ Begriffe. Hier sind einige aufgeführt:
+
row, record, tuple
+
attribute, field, column
+
table, class
+
retrieve, SELECT
+
replace, UPDATE
+
append, INSERT
+
oid, serial value
+
portal, cursor
+
range variable, table name, table alias
+
+
+
Eine allgemeine Liste der Datenbank-Terminologie erhalten Sie hier:
+ (engl.).
+
+
4.18) Wieso bekomme ich einen Fehler: "ERROR: Memory exhausted in
+ AllocSetAlloc()"?
+
+
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 postmaster folgendes:
+ ulimit -d 262144
+ limit datasize 256m
+
+
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.
+
+
4.19) Wie kann ich feststellen, welche PostgreSQL-Version bei mir läuft?
+
+ Geben Sie in psql SELECT VERSION(); ein.
+
+
4.20) Bei "large-object"-Operationen kommt die Fehlermeldung: "invalid
+ large obj descriptor". Warum?
+
+
Sie sollten die Anweisungen BEGIN WORK und COMMIT bei jeden Gebrauch von
+ Large Objects benutzen. Also um lo_open ... lo_close.
+
+
Derzeit erzwingt PostgreSQL diese Regel, indem es die Handles der
+ Large Objects beim COMMIT der Transaktion schließt. So führt der erste
+ Versuch, etwas mit dem Large Object zu machen, zu einer Meldung
+ "invalid large obj descriptor". Solange Sie keine Transaktionen benutzen,
+ wird der Code, der in älteren PostgreSQL-Versionen funktionierte,
+ nun diese Fehlermeldung erzeugen.
+
+
Falls Sie eine Client-Schnittstelle wie ODBC benutzen, kann es sein,
+ dass die auto-commit-Option ausgeschaltet werden muss.
+
+
4.21) Wie kann ich eine Spalte erstellen, deren Default-Wert immer
+ die aktuelle Uhrzeit enthalten soll?
+
+
Dazu verwenden Sie CURRENT_TIMESTAMP:
+ CREATE TABLE test (x int, modtime timestamp DEFAULT CURRENT_TIMESTAMP );
+
+
4.22) Warum sind meine Unterabfragen (subqueries), die IN verwenden,
+ so langsam?
+
+
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 IN durch
+ EXISTS ersetzen, z.B.:
+ SELECT *
+ FROM tabelle_1
+ WHERE spalte1 IN (SELECT spalte2 FROM tabelle_2)
+
+ SELECT *
+ FROM tabelle_1
+ WHERE EXISTS (SELECT spalte2 FROM tabelle_2 WHERE spalte1 = spalte2)
+
+
Damit diese Abfrage effizient durchgeführt wird, sollte für 'spalte2'
+ ein Index angelegt worden sein. Die Einschränkung von Abfragen mit IN
+ soll in einer künftigen PotsgreSQL-Version behoben werden.
+
+
4.23) Wie führe ich einen OUTER JOIN durch?
+
+
PostgreSQL ab der Version 7.1 unterstützt OUTER JOINs nach dem SQL-
+ Standardsyntax. Hier zwei Beispiele:
+ SELECT *
+ FROM tabelle_1 t1
+ LEFT OUTER JOIN tabelle_2 t2 ON (t1.spalte = t2.spalte)
+
+ SELECT *
+ FROM tabelle_1 t1
+ LEFT OUTER JOIN tabelle_2 t2 USING (spalte)
+
+ Diese identischen Abfragen verknüpfen tabelle_1 mit tabelle_2 über die
+ Spalte 'spalte' und geben außerdem alle unverknüpften Zeilen in tabelle_1
+ (diejenigen, die keine Entsprechung in tabelle_2 haben) zurück.
+ Ein FULL JOIN 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 LEFT, RIGHT und FULL-Verknüpfungen
+ weggelassen werden. Normale Verknüpfungen sind INNER JOINs.
+
+
In früheren Versionen von PostgreSQL können OUTER JOINs mittels UNION
+ und NOT IN simuliert werden. Zum Beispiel 'tabelle_1' und 'tabelle_2'
+ können als LEFT OUTER JOIN auch so verknüpft werden:
+ 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
+
+
+
4.24) Wie kann ich Abfragen über mehrere Datenbanken hinweg ausführen?
+
+
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.
+
+
contrib/dblink ermöglicht datenbankübergreifende Abfragen.
+
+
Es ist natürlich möglich, dass eine Client-Anwendung gleichzeitige Verbindungen
+ zu verschiedenen Datenbanken aufbaut und selber Datensätze zusammenfügt.
+
+
4.25) Wie kann ich mehrere Zeilen bzw. Spalten von einer Funktion
+ zurückgeben lassen?
+
+
"Result sets" können mittels refcursors von PL/PgSQL-Funktionen zurückgegeben
+ werden. Vgl.:
+ (Abschnitt 23.7.3.3).
+
+
4.26) Warum kann ich temporäre Tabellen in PL/PgSQL-Funktionen nicht
+ zuverlässig erstellen bzw. löschen?
+
+
PL/PgSQL verarbeitet die Inhalte einer Funktion 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 gecachte Funktionsinhalte noch auf die alte
+ temporäre Tabelle zeigen.
+
+
Die Lösung für diese Probleme besteht darin, in der Funktion mittels
+ EXECUTE auf temporäre Tabellen zuzugreifen. Diese bewirkt, dass bei
+ jedem Funktionsruf die betreffende Abfrage von PL/PgSQL neu geparst wird.
+
+
4.27) Welche Möglichkeiten zur Datenbank-Replikation gibt es?
+
+
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):
+
+
Eine Multi-Master-Lösung befindet sich in der Entwicklung. Näheres dazu
+ befindet sich hier:
+
+
4.28) Welche Möglichkeiten zur Verschlüsselung gibt es?
+
+
contrib/pgcrypto enthält diverse Funktionen für die Benützung mit
+ SQL-Abfragen;
+
die einzige Möglichkeit, Kommunikationen zwischen Client und Server
+ zu verschlüsseln, ist durch die Anwendung von hostssl in pg_hba.conf;
+
Die Passwörter der Datenbanknutzer werden ab Version 7.3 automatisch
+ verschlüsselt (in früheren Versionen muß der Parameter PASSWORD_ENCRYPTION
+ in postgresql.conf explizit eingeschaltet werden);
+
der Server läuft auf einem verschlüsselten Dateisystem.
+
+
+
+
+
PostgreSQL erweitern
+
+
5.1) Ich habe eine benutzerdefinierte Funktion geschrieben. Wenn ich sie in
+ psql aufrufe, kommt ein core dump. Warum?
+
+
Dieses Problem kann viele Ursachen haben. Testen Sie Ihre Funktion zuerst
+ in einem eigenen Testprogramm.
+
+
5.2) Wie kann ich praktische neue Typen und Funktionen zu PostgreSQL
+ hinzufügen?
+
+
Senden Sie Ihre Beiträge an die Mailing Liste pgsql-hackers, und sie
+ werden nach Prüfung eventuell ins contrib/ Verzeichnis des Quellcodes
+ aufgenommen werden.
+
+
5.3) Wie schreibe ich eine Funktion in C, die einen Tupel zurückliefert?
+
+
Ab PostgreSQL 7.3 werden Funktionen, die Tupel zurückliefern, in C, PL/PgSQL und SQL
+ unterstützt. Der Programmer's Guide enthält weitere Informationen
+ dazu. Ein Bespiel einer solchen Funktion befindet sich in contrib/tablefunc.
+
5.4) Ich habe eine der Quellendateien geändert. Warum macht sich
+ die Änderung beim erneuten Kompilieren nicht bemerkbar?
-
5.4) Wie schreibe ich eine Funktion in C, die einen Tuple zurückliefert?
+
Die Makefiles enthalten nicht die richtigen Abhängigkeiten für include-
+ Dateien. Sie müssen ein "make clean" und dann ein weiteres "make" ausführen.
+ Wenn Sie gcc benutzen, können Sie die "--enable-depend"-Option des configure-
+ Skripts benutzen, damit der Compiler die Abhängigkeiten automatisch
+ ermittelt.
-Das erfordert derart extreme Genialität, daß die Autoren es niemals versucht haben,
-obwohl es im Prinzip zu machen wäre.
+
-
5.5) Ich habe eine der Quellendateien geändert. Warum macht sich die Änderung beim erneuten Compilerlauf nicht bemerkbar?
>
+ Anmerkungen des Übersetzers
>
-Die Makefiles finden nicht die richtigen Abhängigkeiten. Du mußt ein make clean und dann ein weiteres make machen.
+
Die englische Vorlage dieser FAQ wird ständig überarbeitet. Daher liegt
+ die Übersetzung nicht immer auf dem aktuellsten Stand.
+
Ü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.
-BODY>
-HTML>
+body>
+html>