From 68c8bce69e06ed1cb7e00fd779b6952e356b16ef Mon Sep 17 00:00:00 2001 From: Bruce Momjian <bruce@momjian.us> Date: Tue, 22 Oct 2002 21:44:51 +0000 Subject: [PATCH] Updated German FAQ, from Ian Barwick --- doc/FAQ_german | 1772 ++++++++++++++------------ doc/src/FAQ/FAQ_german.html | 2328 +++++++++++++++++++---------------- 2 files changed, 2239 insertions(+), 1861 deletions(-) diff --git a/doc/FAQ_german b/doc/FAQ_german index 9a7a7d50f60..fb487b84f4b 100644 --- a/doc/FAQ_german +++ b/doc/FAQ_german @@ -1,172 +1,178 @@ Häufig gestellte Fragen (FAQ) zu PostgreSQL - Last updated: Sat Jul 10 00:37:57 EDT 1999 + Current maintainer: Bruce Momjian (pgman@candle.pha.pa.us). - Current maintainer: Bruce Momjian (pgman@candle.pha.pa.us) + Deutsche Übersetzung von Ian Barwick (barwick@gmx.net). + Basiert teilweise auf einer Übersetzung von Karsten Schulz + (schulz@linux-systemhaus.de). - Deutsche Übersetzung von Karsten Schulz (schulz@linux-systemhaus.de) + Letzte Aktualisierung der deutschen Übersetzung: Mo., den 21.10.2002, + 23:00 CET - Letzte Aktualisierung der deutschen Übersetzung: Don, den 05.08.1999, - 09:00 CET - - Die aktuellste Version dieses Dokuments kann auf der PostgreSQL - Website http://www.PostgreSQL.org angesehen werden. - - Linux-spezifische Fragen werden in - http://www.PostgreSQL.org/docs/faq-linux.html beantwortet (deutsche - Übersetzung in Arbeit!). - - Irix-spezifische Fragen werden in - http://www.PostgreSQL.org/docs/faq-irix.html beantwortet. - - HPUX-spezifische Fragen werden in - http://www.PostgreSQL.org/docs/faq-hpux.shtml beantwortet. + Die aktuellste Version dieses Dokuments liegt auf der PostgreSQL + Website: + * http://www.PostgreSQL.org/docs/faq-english.html (engl.) + * http://www.PostgreSQL.org/docs/faq-german.html (dt.) + + Übersetzungen dieses Dokuments in andere Sprachen sowie plattform- + spezifische FAQs können unter + http://www.PostgreSQL.org/users-lounge/docs/faq.html eingesehen + werden. _________________________________________________________________ Allgemeine Fragen - 1.1) Was ist PostgreSQL? - 1.2) Welches Copyright liegt auf PostgreSQL? + 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 Dokumente sind für PostgreSQL verfügbar? - 1.9) Wie erfahre ich etwas über bekannte Fehler oder fehlende - Eigenschaften 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 am Entwicklerteam teilnehmen? + 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 PostgreSQL-Datenbanken über - Webseiten verfügbar zu machen? + 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 Sprachen sind für die Kommunikation mit PostgreSQL - verfügbar? + 2.4) Welche Programmiersprachen können mit PostgreSQL kommunizieren? Administrative Fragen - 3.1) Warum schlägt initdb fehl? - 3.2) Wie installiere ich PostgreSQL woanders als in /usr/local/pgsql? - 3.3) Wenn ich den postmaster starte, bekomme ich einen Bad System Call - oder eine core dumped Meldung. Warum? - 3.4) Wenn ich versuche, den postmaster zu starten, bekomme ich eine - IpcMemoryCreate Fehlermeldungen. Warum? - 3.5) Wenn ich versuche, den postmaster zu starten, bekomme ich eine - IpcSemaphoreCreate Fehlermeldungen. Warum? - 3.6) Wie verhindere ich, daß andere Hosts auf meine PostgreSQL - Datenbanken zugreifen? - 3.7) Warum kann ich mich nicht von einer anderen Maschine mit meiner - Datenbank verbinden? - 3.8) Warum kann ich nicht als root auf die Datenbank zugreifen? - 3.9) Alle meine Server stürzen bei gleichzeitigem Tabellenzugriff ab. - Warum? - 3.10) Wie optimiere ich die Datenbankmaschine für bessere Leistung? - 3.11) Welche Debugging/Fehlersuch-Hilfsmittel sind für PostgreSQL - verfügbar? - 3.12) Ich bekomme die Meldung "Sorry, too many clients", wenn ich eine - Verbindung versuche. Warum? - 3.13) Was sind die pg_psort.XXX Dateien in meinem - Datenbank-Verzeichnis? - 3.14) Wie richte ich eine Benutzergruppe (pg_group) ein? + 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) Das System scheint Kommata, Dezimalpunkte und Datumsformate - durcheinanderzubringen. - 4.2) Was ist der genauer Unterschied zwischen Binary Cursors und - Normal Cursors? - 4.3) Wie wähle ich per SELECT nur die ersten paar Zeilen in einem - Query aus? - 4.4) Wie bekomme ich eine Liste der Tabellen oder anderen Dingen, die - ich in psql sehen kann - 4.5) Wie entferne ich eine Spalte von einer Tabelle? - 4.6) Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine + 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.7) Wieviel Plattenplatz benötigt eine Datenbank zur Speicherung - einer Datendatei mit zeilenweisen Datensätzen? - 4.8) Wie finde ich heraus, welche Indizes oder Operationen in der + 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.9) Meine Queries sind langsam oder nutzen die Indizes nicht. Warum? - 4.10) Auf welche Weise kann ich sehen, wie der Query-Optimierer meine - Abfrage auswertet? - 4.11) Was ist ein R-Tree Index? - 4.12) Was ist "Genetic Query Optimization"? - 4.13) Wie verfahre ich bei der Suche mit regulären Ausdrücken und bei - einer Suche mit Ignorierung der Groß- und Kleinschreibweisen? - 4.14) Wie ermittle ich in einem Query, daß ein Feld NULL ist? - 4.15) Was ist der Unterschied zwischen den verschiedenen CHAR-Typen? - 4.16) Wie erzeuge ich ein serielles Feld mit automatischer Erhöhung - des Inhalts? - 4.17) Was ist ein Oid? Was ist ein Tid? - 4.18) Was ist die Bedeutung der verschiedenen Ausdrücke, die in + 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.19) Wieso bekomme ich einen Fehler: "FATAL: palloc failure: memory - exhausted?" - 4.20) Wie kann ich feststellen, welche PostgreSQL-Version ich laufen - habe? - 4.21) Beim Arbeiten mit "Large-Objects" kommt die Fehlermeldung: - invalid large obj descriptor. Warum? + 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) Was bedeutet die Meldung: NOTICE:PortalHeapMemoryFree: 0x402251d0 - not in alloc set!? - 5.3) Wie kann ich ein paar elegante neue Feldtypen und Funktionen zu - PostgreSQL beitragen? - 5.4) Wie schreibe ich eine Funktion in C, die ein Tuple zurückliefert? - 5.5) Ich habe eine der Quellendateien geändert. Warum macht sich die - Änderung beim erneuten Compilerlauf nicht bemerkbar? + 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? - - 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 - (scrappy@postgreSQL.org) (siehe unten, wie man sich anmelden kann). - Dieses Team ist jetzt für alle aktuellen und zukünftigen Entwicklungen - von PostgreSQL verantwortlich. + 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 (scrappy@PostgreSQL.org) (Anmeldemöglichkeit: + siehe unten). 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, zu den Tests, zur Fehlersuche und zur + 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 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. + 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 bei Berkeley war Postgres. Als die + 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 zu PostgreSQL geändert. + Postgres95 geändert. Der Name wurde Ende 1996 in PostgreSQL geändert. - 1.2) Welches Copyright liegt auf PostgreSQL? + 1.2).Welchem Copyright unterliegt PostgreSQL? - PostgreSQL steht unter folgendem COPYRIGHT (Originaltext): + PostgreSQL unterliegt folgendem COPYRIGHT (Originaltext): PostgreSQL Data Base Management System - Copyright (c) 1994-6 Regents of the University of California + 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 @@ -187,190 +193,168 @@ CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - 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. + 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? - 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 - - 1.4) Welche Nicht-Unix-Versionen sind verfügbar? + 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 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. Es gibt die Datei - win31.mak in der Distribution, um die Win32 libpq-Bibliothek und psql - zu erzeugen. + Client + + 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. + + Server - 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. + 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 + http://www.PostgreSQL.org/docs/faq-mswin.html. - Es gibt eine weitere Portierung, die U/Win benutzt bei - http://surya.wipro.com/uwin/ported.html. + Eine eigenständige Portierung auf MS Win NT/2000/XP befindet sich in + Vorbereitung. 1.5) Woher bekomme ich PostgreSQL? - Die erste Anlaufadresse für PostgreSQL ist der ftp-Server - ftp://ftp.postgreSQL.org/pub - - Die entsprechenden Spiegelserver sind auf der Hauptwebseite - aufgelistet. + Der zentrale FTP-Server für PostgreSQL ist der ftp-Server + ftp://ftp.postgreSQL.org/pub. Weitere Mirror-Sites sind auf der + PostgreSQL-Website aufgelistet. 1.6) Wo bekomme ich Support für PostgreSQL? - Es gibt keinen offiziellen Support für PostgreSQL von der Universität - von Kalifornien, Berkeley. Der Support wird durch freiwilligen Einsatz - geleistet. - - Die Mailing-Liste ist: pgsql-general@postgreSQL.org. Die Liste ist für - PostgreSQL betreffende Themen vorbehalten. Um sich anzumelden, sende - eine Email mit folgenden Zeilen im Text (nicht in der Betreffzeile): + Die zentrale (englischsprachige) Mailing-Liste ist: + mailto:pgsql-general@PostgreSQL.org . + + Die Liste ist Themen vorbehalten, die PostgreSQL betreffen. Die + Anmeldung erfolgt mit einer Email an die Adresse + pgsql-general-request@PostgreSQL.org mit folgenden Zeilen im Text + (nicht in der Betreffzeile): + subscribe + end - 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 an pgsql-general-digest-request@PostgreSQL.org mit folgendem + Text: + subscribe + end - an pgsql-general-request@postgreSQL.org. - - Es gibt auch eine Digest-Liste (Eine Liste, die Mails zusammengefasst - sendet). Um sich an dieser Digestliste anzumelden, sende eine Email - an: pgsql-general-digest-request@postgreSQL.org mit folgendem Text: + Es gibt noch die Bug-Mailingliste. Die Anmeldung für diese Liste + erfolgt durch eine Email an bugs-request@PostgreSQL.org mit folgendem + Text: + subscribe + end - subscribe - end + Die Entwickler-Mailingliste kann mit einer Email an + pgsql-hackers-request@PostgreSQL.org abonniert werden. Die Email muß + ebenfalls folgenden Text enthalten: + subscribe + end - Die Digests werden an die Mitglieder der Liste geschickt, wenn ca. - 30kB an Mails zusammengekommen sind. + Weitere Mailinglisten und Informationen zu PostgreSQL befinden sich + auf der PostgreSQL-Homepage: - Die Bug-Mailingliste ist verfübar. Um sich an dieser Liste anzumelden, - sende eine Email an bugs-request@postgreSQL.org mit folgendem Text: - - - subscribe - end - - Es gibt ebenfalls eine Entwickler-Diskussionsliste. Um sich an dieser - Liste anzumelden, sende eine Email an hackers-request@postgreSQL.org - mit diesem Text: - - - subscribe - end - - Weitere Mailinglisten und Informationen zu PostgreSQL können auf der - PostgreSQL-Homepage im WWW gefunden werden: - - http://postgreSQL.org + http://www.PostgreSQL.org - 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 + 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. - Kommerzieller Support für PostgreSQL ist bei http://www.pgsql.com/ - verfügbar + Eine Liste von Unternehmen, die Support für PostgreSQL auf + kommerzieller Basis leisten, kann unter + http://www.PostgreSQL.org/users-lounge/commercial-support.html + eingesehen werden. 1.7) Was ist die neueste Version von PostgreSQL? - Das neueste Release von PostgreSQL ist die Version 6.5. + Die neueste Version von PostgreSQL ist 7.2.3. - Wir planen alle 4 Monate Hauptreleases herauszugeben. + Wir planen alle 4 Monate eine neue Version herauszugeben. - 1.8) Welche Dokumente sind für PostgreSQL verfügbar? + 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 im /doc-Verzeichnis. + der Distribution enthalten. Siehe das /doc-Verzeichnis. Ausserdem sind + alle Handbücher online unter + http://www.PostgreSQL.org/users-lounge/docs/ verfügbar. - psql hat einige nette \d-Befehle, um Informationen über Typen, - Operatoren, Funktionen, Aggregate, usw. zu zeigen. + Zwei Bücher zu PostgreSQL sind online verfügbar unter + http://www.PostgreSQL.org/docs/awbook.html und + http://www.commandprompt.com/ppbook/ . + + Eine Liste lieferbarer PostgreSQL-Bücher befindet sich unter + http://www.ca.PostgreSQL.org/books/ Diverse technische Artikel + befinden sich unter http://techdocs.PostgreSQL.org/ . - Die Website enthält sogar noch mehr Unterlagen. + psql hat einige nützliche \d-Befehle, um Informationen über Typen, + Operatoren, Funktionen, Aggregate, usw. zu zeigen. - 1.9) Wie erfahre ich etwas über bekannte Fehler oder fehlende Eigenschaften - von PostgreSQL? + 1.9) Wie erfahre ich von bekannten Bugs oder fehlenden Features? - PostgreSQL unterstützt eine ausgedehnte Untermenge von SQL-92. Siehe - unser TODO für eine Auflistung der bekannten Fehler, fehlende - Eigenschaften und zukünftige Pläne. + PostgreSQL unterstützt eine erweiterte Teilmenge von SQL-92. Siehe + unsere TODO-Liste unter http://developer.PostgreSQL.org/todo.php für + eine Auflistung der bekannten Bugs, fehlenden Features und zukünftigen + Pläne. 1.10) Wie kann ich SQL lernen? - 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. + Das PostgreSQL Book auf http://www.PostgreSQL.org/docs/awbook.html + bietet eine Einführung in SQL. Ein weiteres PostgreSQL-Buch befindet + sich unter http://www.commandprompt.com/ppbook . Es gibt zudem nette + Tutorials unter http://www.intermedia.net/support/sql/sqltut.shtm , + http://ourworld.compuserve.com/homepages/graeme_birchall/HTM_COOK.HTM + und http://sqlcourse.com . - Viele unserer User mögen The Practical SQL Handbook, Bowman et al., - Addison Wesley. + Eine weitere Empfehlung ist "Teach Yourself SQL in 21 Days, Second + Edition", es ist unter http://members.tripod.com/er4ebus/sql/index.htm + erhältlich. + + 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 am Entwicklerteam teilnehmen? + 1.12) Wie kann ich im Entwicklerteam mitarbeiten? - Zuerst lade die neuesten Quellen herunter und lies die + Zuerst laden Sie die neuesten Quellen herunter und lesen Sie 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. + 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 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. + 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 Fehler-Bericht? + 1.13) Wie sende ich einen Fehlerbericht? - Fülle die "Fehler-Vorlage"-Datei (bug.template im doc-Verzeichnis) aus - und sende sie an: bugs@postgreSQL.org + Bitte besuchen Sie die PostgreSQL-BugTool-Seite + http://www.PostgreSQL.org/bugs/, die Hinweise und Anleitungen zur + Einreichung von Fehlerberichten enthält. - Überprüfe auch den ftp-Server ftp://ftp.postgreSQL.org/pub, um + Überprüfe auch den ftp-Server ftp://ftp.PostgreSQL.org/pub, um nachzusehen, ob es eine neuere PostgreSQL-Version oder neue Patches gibt. @@ -380,493 +364,525 @@ 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 auswählbar. + 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. - 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. + 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: + http://openacs.org/philosophy/why-not-mysql.html 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. + 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 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), + 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 - 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. + 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.15) Wie kann ich PostgreSQL finanziell unterstützen? + + 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. + + Eine hochwertige Infrastruktur ist für ein Open-Source-Projekt wie + dieses sehr wichtig. Sie verhindert Probleme und Verzögerungen beim + Fortschritt des Projekts. + + 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 + http://store.pgsql.com/shopping/ 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. _________________________________________________________________ Fragen zu Benutzerprogrammen 2.1) Gibt es ODBC-Treiber für PostgreSQL? - Es sind zwei ODBC-Treiber verfügbar: PostODBC und OpenLink ODBC. + Es sind zwei ODBC-Treiber verfügbar: PsqlODBC und OpenLink ODBC. - PostODBC ist in der Distribution enthalten. Mehr Informationen können - unter http://www.insightdist.com/psqlodbc abgerufen werden. + PsqlODBC ist in der Distribution enthalten. Weitere Informationen + können unter ftp://ftp.PostgreSQL.org/pub/odbc/ abgerufen werden. OpenLink ODBC kann unter http://www.openlinksw.com geholt werden. Die - Software arbeitet mit OpenLinks Standard-ODBC-Client, so daß + 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). - Sie werden dieses Produkt wahrscheinlich an Leute verkaufen, die - kommerziellen Qualitäts-Support brauchen, aber es wird immer eine + 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 postgres95@openlink.co.uk. - 2.2) Welche Werkzeuge gibt es, um PostgreSQL-Datenbanken über Webseiten - verfügbar zu machen? - - Eine nette Einführung zu Datenbank-gestützten Webseiten kann unter - http://www.webtools.com abgerufen werden. + Bitte beachten Sie auch das Kapitel zu ODBC im Progammer's Guide. - Eine weitere gibt es bei http://www.phone.net/home/mwm/hotlist/. + 2.2) Welche Werkzeuge gibt es, um Web-Seiten mit PostgreSQL zu verbinden? + + Eine nette Einführung zu datenbank-gestützten Webseiten kann unter + http://www.webreview.com (engl.) abgerufen werden. Für die Web-Integration ist PHP eine ausgezeichnete Schnittstelle. PHP gibt es bei http://www.php.net - 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 - http://www.eol.ists.ca/~dunlop/wdb-p95 herunterladen. + Für komplexere Aufgaben bietet sich die Perl-Schnittstelle mit CGI.pm + oder mod_perl. 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: - http://www.flex.ro/pgaccess + Wir haben eine nette grafische Benutzerschnittstelle namens PgAccess, + der außerdem einen Reportgenerator enthält: http://www.pgaccess.org - In der Distribution gibt es außerdem ecpg,, welches eine eingebundene + Die Distribution enthält außerdem ecpg, die eine eingebettete 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) - * Embedded HTML(PHP from http://www.php.net) + 2.4) Welche Programmiersprachen und Schnittstellen gibt es? + + PostgreSQL bietet: + * C (libpq) + * C++ (libpq++) + * Embedded C (ecpg) + * Java (jdbc) + * Perl (perl5, DBD::Pg) + * ODBC (odbc) + * Python (PyGreSQL) + * TCL (libpgtcl) + * C Easy API (libpgeasy) + * PHP ('pg_' functions, Pear::DB) _________________________________________________________________ Administrative Fragen - 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? + 3.1) 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. + Bei der Ausführung von configure die Option --prefix mit dem + Zielverzeichnis angeben. - 3.3) Wenn ich den postmaster starte, bekomme ich einen Bad System Call oder - eine core dumped Meldung. Warum? + 3.2) Wenn ich den postmaster starte, erhalte ich einen Nachricht "Bad + System Call" bzw. "core dumped". Wieso? - Das kann verschiedene Ursachen haben. Überprüfe zuerst, ob Dein Kernel - System V Extensions enthält. PostgreSQL benötigt die + 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.4) Wenn ich versuche, den postmaster zu starten, bekomme ich - IpcMemoryCreate Fehlermeldungen. Warum? + 3.3) 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. + 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" + (http://www.PostgreSQL.org/idocs/index.php?kernel-resources.html) + enthält weitere Informationen zu Shared Memory und Semaphores. - 3.5) Wenn ich versuche, den postmaster zu starten, bekomme ich - IpcSemaphoreCreate Fehlermeldungen. Warum? + 3.4) 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 + 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. 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. + 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. - Falls die Fehlermeldung anders aussieht, hast Du möglicherweise keine - Semaphoren-Unterstützung in Deinem Kernel aktiviert. + Nichtfunktionierende Semaphores können außerdem bei hoher + Datenbanklast zu Abstürzen führen. - 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. + 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. - 3.7) Warum kann ich mich nicht von einer anderen Maschine mit meiner - Datenbank verbinden? + 3.5) Wie regle ich Zugriffe von anderen Rechnern? - 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? + 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. + + 3.6) Wie optimiere ich die Datenbank für bessere Leistung? - 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 + Der Einsatz von Indizes sollte auf jeden Fall Abfragen beschleunigen. + Die Anweisung EXPLAIN zeigt, wie PostgreSQL Abfragen 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 Datenmengen - änderst. - - 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 & + 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 & - 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 + 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. 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[].) + 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) 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 + 4.1) Worin besteht der Unterschied zwischen Binary Cursors und Normal Cursors? - Vgl. die declare Man-Page für eine Beschreibung. + 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? + 4.2) Wie wähle ich per SELECT-Anweisung nur die ersten paar Zeilen in einer + Abfrage aus? - Vgl. die fetch Man-Page, oder benutze SELECT ... LIMIT.... + Vgl. die FETCH Man-Page, oder benutzen Sie 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. + 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. - 4.4) Wie bekomme ich eine Liste der Tabellen oder anderen Dingen, die ich - in psql sehen kann + 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? - 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. + 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.5) Wie entferne ich eine Spalte von einer Tabelle? + 4.4) Wie entferne ich eine Spalte aus 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 + 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; + DROP TABLE old_table; + ALTER TABLE new_table RENAME TO old_table; + COMMIT; - 4.6) Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine Datenbank? + 4.5) 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. + 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. - Zeilen überschreiten keine 8 kB-Grenzen. Eine Zeile mit 5 kB wird 8 kB - Speicherplatz benötigen. + 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. - Tabellen- und Datenbankgrößen haben keine Grenzen. Es gibt viele - Datenbanken mit zig Gigabytes und wahrscheinlich einige mit hunderten - Gigabyte. + 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.7) Wieviel Plattenplatz benötigt eine Datenbank zur Speicherung einer - Datendatei mit zeilenweisen Datensätzen? + 4.6) Wieviel Plattenplatz wird benötigt, um die Daten aus einer typischen + Textdatei abzuspeichern? - 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. + 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) - + 8 Bytes: zwei Integer-Felder @ jedes 4 Bytes - + 4 Bytes: Zeiger auf den Datensatz + +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 + --------------------- = 128 Zeilen pro Seite (abgerundet) + 64 Bytes pro Zeile - 300000 Datenzeilen - ----------------------- = 1755 Datenbankseiten - 171 Zeilen pro Seite + 100.000 Datenzeilen + ----------------------- = 782 Datenbankseiten (aufgerundet) + 128 Zeilen pro Seite -1755 Datenbankseiten * 8192 Bytes pro Seite = 14,376,960 Bytes (14MB) + 782 Datenbankseiten * 8192 Bytes pro Seite = 6.406.144 Byte (6,4 MB) - Indizes haben nicht einen solchen Overhead, sie beinhalten jedoch die - Daten, die sie indizieren und können so auch sehr groß werden. + 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.8) Wie finde ich heraus, welche Indizes oder Operationen in der Datenbank + 4.7) 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. + 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. - 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 + 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.9) Meine Queries sind langsam oder nutzen die Indizes nicht. Warum? + 4.8) Meine Abfragen 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. + 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. - 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. + Die C-Locale muß während der Datenbank-Initialisierung mit initdb + bestimmt worden sein. - 4.10) Auf welche Weise kann ich sehen, wie der Query-Optimierer meine + 4.9) Auf welche Weise kann ich sehen, wie der Abfrage-Optimierer meine Abfrage auswertet? Vgl. die EXPLAIN Man-Page. - 4.11) Was ist ein R-Tree Index? + 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 @@ -877,14 +893,14 @@ Punkte, die sich in einem umgebenden Rechteck befinden" effizienter beantworten. - Die kanonische Veröffentlichung , die das originale R-Tree Design - beschreibt ist: + 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 + Sie können dieses Werk auch in Stonebrakers "Readings in Database Systems" finden. Die eingebauten R-Trees können Polygone und Rechtecke verarbeiten. @@ -893,95 +909,161 @@ Arbeit und wir haben derzeit keinerlei Dokumentation darüber, wie das zu machen wäre. - 4.12) Was ist "Genetic Query Optimization"? + 4.11) Was ist der "Genetic Query Optimizer"? 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. + 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. - Für weitere Informationen siehe die Dokumentation. + 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.13) Wie verfahre ich bei der Suche mit regulären Ausdrücken und bei einer - Suche mit Ignorierung der Groß- und Kleinschreibweisen? + 4.14) Was ist der Unterschied zwischen den verschiedenen CHAR-Typen? - ~ und ~* sind wahrscheinlich das, was Du willst. Vgl. psql's \do - Befehl. +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. - 4.14) Wie ermittle ich in einem Query, daß ein Feld NULL ist? + 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? - Du testest die Spalte mit IS NULL und IS NOT NULL. + 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 + ) + + wird automatisch in: + 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 ); + + umgewandelt. - 4.15) Was ist der Unterschied zwischen den verschiedenen CHAR-Typen? + 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? -Typ interner Name Bemerkungen --------------------------------------------------- -CHAR char 1 Zeichen -CHAR(#) bpchar mit Leerzeichen gefüllt bis zur angegebenen Län -ge -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än -ge beschränkt -BYTEA bytea Bytearray mit variabler Länge + 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')"); - Du mußt die internen Namen benutzen, wenn Du interne Operationen - durchführen willst. + 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. - 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 + 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 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'; + 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'; - 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 + 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 @@ -996,49 +1078,166 @@ BYTEA bytea Bytearray mit variabler L * portal, cursor * range variable, table name, table alias - 4.19) Wieso bekomme ich einen Fehler: "FATAL: palloc failure: memory - exhausted?" + Eine allgemeine Liste der Datenbank-Terminologie erhalten Sie hier: + http://hea-www.harvard.edu/MST/simul/software/docs/pkgs/pgsql/glossary + /glossary.html (engl.). + + 4.18) Wieso bekomme ich einen Fehler: "ERROR: Memory exhausted in + AllocSetAlloc()"? - 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: + 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 - ulimit -d 65536 - limit datasize 64m + 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) + + in: + 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) + + bzw.: + 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 - 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 lo_open ... lo_close. - - 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. + 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.: + http://www.postgresql.org/idocs/index.php?plpgsql-cursors.html + (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): + http://gborg.PostgreSQL.org/genpage?replication_research . + + Eine Multi-Master-Lösung befindet sich in der Entwicklung. Näheres + dazu befindet sich hier: + http://gborg.PostgreSQL.org/project/pgreplication/projdisplay.php . + + 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 @@ -1046,30 +1245,39 @@ BYTEA bytea Bytearray mit variabler L 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 + Dieses Problem kann viele Ursachen haben. Testen Sie Ihre Funktion + zuerst in einem eigenen Testprogramm. - 5.2) Was bedeutet die Meldung: NOTICE:PortalHeapMemoryFree: 0x402251d0 not - in alloc set!? + 5.2) Wie kann ich praktische neue Typen und Funktionen zu PostgreSQL + hinzufügen? - Du pfreest etwas, das Du nicht palloct hast! Stelle sicher, daß Du - nicht malloc/free und palloc/pfree durcheinanderwürfelst. + 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 kann ich ein paar elegante neue Feldtypen und Funktionen zu - PostgreSQL beitragen? + 5.3) Wie schreibe ich eine Funktion in C, die einen Tupel zurückliefert? - Sende Deine Erweiterungen zur pgsql-hackers Mailing Liste, und sie - werden eventuell im contrib/ Verzeichnis enden. + 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) Wie schreibe ich eine Funktion in C, die einen Tuple zurückliefert? + 5.4) Ich habe eine der Quellendateien geändert. Warum macht sich die + Änderung beim erneuten Kompilieren nicht bemerkbar? - Das erfordert derart extreme Genialität, daß die Autoren es niemals - versucht haben, obwohl es im Prinzip zu machen wäre. + 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. + _________________________________________________________________ - 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. diff --git a/doc/src/FAQ/FAQ_german.html b/doc/src/FAQ/FAQ_german.html index 6c40523afce..66b093aba5e 100644 --- a/doc/src/FAQ/FAQ_german.html +++ b/doc/src/FAQ/FAQ_german.html @@ -1,1136 +1,1306 @@ -<HTML> -<HEAD> -<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> -Last updated: Sat Jul 10 00:37:57 EDT 1999 -<P> +<!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>) <BR> -<P> -Deutsche Übersetzung von Karsten Schulz (<A HREF="mailto:schulz@linux-systemhaus.de">schulz@linux-systemhaus.de</a>) <BR> -<P> -Letzte Aktualisierung der deutschen Übersetzung: Don, den 05.08.1999, 09:00 CET -<P> -Die aktuellste Version dieses Dokuments kann auf der PostgreSQL Website <A HREF="http://www.Postgresql.org">http://www.PostgreSQL.org</A> angesehen werden. -<P> -Linux-spezifische Fragen werden in <a href="http://www.PostgreSQL.org/docs/faq-linux.html">http://www.PostgreSQL.org/docs/faq-linux.html</a> -beantwortet (deutsche Übersetzung in Arbeit!).<P> - -Irix-spezifische Fragen werden in <a -href="http://www.PostgreSQL.org/docs/faq-irix.html">http://www.PostgreSQL.org/docs/faq-irix.html</a> beantwortet. -<P> - -HPUX-spezifische Fragen werden in <a -href="http://www.PostgreSQL.org/docs/faq-hpux.shtml">http://www.PostgreSQL.org/docs/faq-hpux.shtml</a> beantwortet. -<P> - -<HR><P> - -<H2><CENTER>Allgemeine Fragen</CENTER></H2> - -<a href="#1.1">1.1</a>) Was ist PostgreSQL?<BR> -<a href="#1.2">1.2</a>) Welches Copyright liegt auf 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 Dokumente sind für PostgreSQL verfügbar?<BR> -<a href="#1.9">1.9</a>) Wie erfahre ich etwas über bekannte Fehler oder fehlende Eigenschaften von PostgreSQL?<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 am Entwicklerteam teilnehmen?<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> - - -<H2><CENTER>Fragen zu Benutzerprogrammen</CENTER></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 PostgreSQL-Datenbanken über Webseiten -verfügbar zu machen?<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 Sprachen sind für die Kommunikation mit PostgreSQL verfügbar?<BR> - - -<H2><CENTER>Administrative Fragen</CENTER></H2> - -<a href="#3.1">3.1</a>) Warum schlägt initdb fehl?<BR> -<a href="#3.2">3.2</a>) Wie installiere ich PostgreSQL woanders als in /usr/local/pgsql?<BR> -<a href="#3.3">3.3</a>) Wenn ich den postmaster starte, bekomme ich einen <I>Bad System Call</I> oder eine <I>core dumped</I> Meldung. Warum?<BR> -<a href="#3.4">3.4</a>) Wenn ich versuche, den postmaster zu starten, bekomme ich eine <I>IpcMemoryCreate</I> Fehlermeldungen. Warum?<BR> -<a href="#3.5">3.5</a>) Wenn ich versuche, den postmaster zu starten, bekomme ich eine <I>IpcSemaphoreCreate</I> Fehlermeldungen. Warum?<BR> -<a href="#3.6">3.6</a>) Wie verhindere ich, daß andere Hosts auf meine PostgreSQL Datenbanken zugreifen?<BR> -<a href="#3.7">3.7</a>) Warum kann ich mich nicht von einer anderen Maschine mit meiner Datenbank verbinden?<BR> -<a href="#3.8">3.8</a>) Warum kann ich nicht als <I>root</I> auf die Datenbank zugreifen?<BR> -<a href="#3.9">3.9</a>) Alle meine Server stürzen bei gleichzeitigem Tabellenzugriff ab. Warum?<BR> -<a href="#3.10">3.10</a>) Wie optimiere ich die Datenbankmaschine für bessere Leistung?<BR> -<a href="#3.11">3.11</a>) Welche Debugging/Fehlersuch-Hilfsmittel sind für PostgreSQL verfügbar?<BR> -<a href="#3.12">3.12</a>) Ich bekomme die Meldung "Sorry, too many clients", wenn ich eine Verbindung versuche. Warum?<BR> -<a href="#3.13">3.13</a>) Was sind die pg_psort.XXX Dateien in meinem Datenbank-Verzeichnis?<BR> -<a href="#3.14">3.14</a>) Wie richte ich eine Benutzergruppe (pg_group) ein?<BR> - -<H2><CENTER>Fragen zum Betrieb</CENTER></H2> - -<a href="#4.1">4.1</a>) Das System scheint Kommata, Dezimalpunkte und Datumsformate durcheinanderzubringen.<BR> -<a href="#4.2">4.2</a>) Was ist der genauer Unterschied zwischen Binary Cursors und Normal Cursors?<BR> -<a href="#4.3">4.3</a>) Wie wähle ich per <I>SELECT</I> nur die ersten paar Zeilen in einem Query aus?<BR> - -<a href="#4.4">4.4</a>) Wie bekomme ich eine Liste der Tabellen oder anderen Dingen, die ich in <I>psql</I> sehen kann<BR> -<a href="#4.5">4.5</a>) Wie entferne ich eine Spalte von einer Tabelle?<BR> - -<a href="#4.6">4.6</a>) Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine Datenbank?<BR> -<a href="#4.7">4.7</a>) Wieviel Plattenplatz benötigt eine Datenbank zur Speicherung einer Datendatei mit zeilenweisen Datensätzen?<BR> - -<a href="#4.8">4.8</a>) Wie finde ich heraus, welche Indizes oder Operationen in der Datenbank definiert sind?<BR> -<a href="#4.9">4.9</a>) Meine Queries sind langsam oder nutzen die Indizes nicht. Warum?<BR> -<a href="#4.10">4.10</a>) Auf welche Weise kann ich sehen, wie der Query-Optimierer meine Abfrage auswertet?<BR> -<a href="#4.11">4.11</a>) Was ist ein R-Tree Index?<BR> -<a href="#4.12">4.12</a>) Was ist "Genetic Query Optimization"?<BR> - -<a href="#4.13">4.13</a>) Wie verfahre ich bei der Suche mit regulären Ausdrücken und bei - einer Suche mit Ignorierung der Groß- und Kleinschreibweisen?<BR> -<a href="#4.14">4.14</a>) Wie ermittle ich in einem Query, daß ein Feld NULL ist?<BR> -<a href="#4.15">4.15</a>) Was ist der Unterschied zwischen den verschiedenen CHAR-Typen?<BR> -<a href="#4.16">4.16</a>) Wie erzeuge ich ein serielles Feld mit automatischer Erhöhung des Inhalts?<BR> - -<a href="#4.17">4.17</a>) Was ist ein Oid? Was ist ein Tid?<BR> -<a href="#4.18">4.18</a>) Was ist die Bedeutung der verschiedenen Ausdrücke, die in PostgreSQL benutzt werden (z.B. attribute, class,...)?<BR> - -<a href="#4.19">4.19</a>) Wieso bekomme ich einen Fehler: "FATAL: palloc failure: memory exhausted?"<BR> -<a href="#4.20">4.20</a>) Wie kann ich feststellen, welche PostgreSQL-Version ich laufen habe?<BR> -<a href="#4.21">4.21</a>) Beim Arbeiten mit "Large-Objects" kommt die Fehlermeldung: <I>invalid large obj descriptor.</I> Warum?<BR> - -<H2><CENTER>PostgreSQL erweitern</CENTER></H2> - -<a href="#5.1">5.1</a>) Ich habe eine benutzerdefinierte Funktion geschrieben. Wenn ich sie in <I>psql</I> aufrufe, kommt ein <I>core dump</I>. Warum?<BR> -<a href="#5.2">5.2</a>) Was bedeutet die Meldung: <I>NOTICE:PortalHeapMemoryFree: 0x402251d0 not in alloc set!</I>?<BR> -<a href="#5.3">5.3</a>) Wie kann ich ein paar elegante neue Feldtypen und Funktionen zu PostgreSQL beitragen?<BR> -<a href="#5.4">5.4</a>) Wie schreibe ich eine Funktion in C, die ein Tuple zurückliefert?<BR> -<a href="#5.5">5.5</a>) Ich habe eine der Quellendateien geändert. Warum macht sich die Änderung beim erneuten Compilerlauf nicht bemerkbar?<BR> - -<HR> - -<H2><CENTER>Allgemeine Fragen</CENTER></H2> -<H4><a -name="1.1">1.1</a>) Was ist PostgreSQL?</H4><P> - -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. -<P> - -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 -(<a href="mailto:scrappy@postgreSQL.org">scrappy@postgreSQL.org</a>) (siehe unten, wie -man sich anmelden kann). Dieses Team ist jetzt für alle aktuellen und zukünftigen Entwicklungen von PostgreSQL -verantwortlich. - -<P> - - -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. - -<P> - -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. -<P> - -<H4><a name="1.2">1.2</a>) Welches Copyright liegt auf PostgreSQL?</H4><P> - -PostgreSQL steht unter folgendem COPYRIGHT (Originaltext):<P> - -PostgreSQL Data Base Management System<P> - -Copyright (c) 1994-6 Regents of the University of California<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> - -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> - -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> - -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: -<BR><P> - -PostgreSQL Datenbank Management System<P> - -Copyright (c) 1994-6 Regents of the University of California<P> - -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. <P> - -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. <P> - -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. - -<H4><a name="1.3">1.3</a>) Auf welchen Unix-Plattformen läuft PostgreSQL?</H4><P> - -Die Autoren haben PostgreSQL auf folgenden Plattformen kompiliert und getestet -(einige dieser Kompilierungen benötigen den C-Compiler gcc): -<UL> -<LI> aix - IBM auf AIX 3.2.5 or 4.x -<LI> alpha - DEC Alpha AXP auf Digital Unix 2.0, 3.2, 4.0 -<LI> BSD44_derived - OS abgeleitet von 4.4-lite BSD (NetBSD, FreeBSD) -<LI> bsdi - BSD/OS 2.x, 3.x, 4.x -<LI> dgux - DG/UX 5.4R4.11 -<LI> hpux - HP PA-RISC auf HP-UX 9.*, 10.* -<LI> i386_solaris - i386 Solaris -<LI> irix5 - SGI MIPS auf IRIX 5.3 -<LI> linux - Intel i86 - Alpha - SPARC - PPC - M68k -<LI> sco - SCO 3.2v5 - Unixware -<LI> sparc_solaris - SUN SPARC auf Solaris 2.4, 2.5, 2.5.1 -<LI> sunos4 - SUN SPARC auf SunOS 4.1.3 -<LI> svr4 - Intel x86 auf Intel SVR4 and MIPS -<LI> ultrix4 - DEC MIPS auf Ultrix 4.4 -</UL> -<P> +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.4">1.4</a>) Welche Nicht-Unix-Versionen sind verfügbar?</H4><P> + <h4><a name="1.15">1.15</a>) Wie kann ich PostgreSQL finanziell unterstützen?</h4> -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. + <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> -Es gibt die Datei <I>win31.mak</I> in der Distribution, um die Win32 libpq-Bibliothek und psql -zu erzeugen.<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> -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.<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> -Es gibt eine weitere Portierung, die U/Win benutzt bei <A HREF="http://surya.wipro.com/uwin/ported.html">http://surya.wipro.com/uwin/ported.html.</A> + <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 /> -<H4><a name="1.5">1.5</a>) Woher bekomme ich PostgreSQL?</H4><P> -Die erste Anlaufadresse für PostgreSQL ist der ftp-Server <a href="ftp://ftp.postgreSQL.org/pub">ftp://ftp.postgreSQL.org/pub</a> -<P> + <h2 align="center">Fragen zu Benutzerprogrammen</h2> -Die entsprechenden Spiegelserver sind auf der Hauptwebseite aufgelistet. + <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> -<H4><a name="1.6">1.6</a>) Wo bekomme ich Support für PostgreSQL?</H4><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> -Es gibt keinen offiziellen Support für PostgreSQL von der Universität von Kalifornien, Berkeley. Der -Support wird durch freiwilligen Einsatz geleistet. -<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> -Die Mailing-Liste ist: <a href="mailto:pgsql-general@postgreSQL.org">pgsql-general@postgreSQL.org</a>. -Die Liste ist für PostgreSQL betreffende Themen vorbehalten. Um sich anzumelden, sende eine -Email mit folgenden Zeilen im Text (nicht in der Betreffzeile): + <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> -<PRE> -<CODE> - subscribe - end -</CODE> -</PRE><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> -an <a href="mailto:pgsql-general-request@postgreSQL.org">pgsql-general-request@postgreSQL.org</a>.<P> + <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> -Es gibt auch eine Digest-Liste (Eine Liste, die Mails zusammengefasst sendet). -Um sich an dieser Digestliste anzumelden, sende eine Email an: -<a href="mailto:pgsql-general-digest-request@postgreSQL.org">pgsql-general-digest-request@postgreSQL.org</a> -mit folgendem Text: + <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> -<PRE> -<CODE> - subscribe - end -</CODE> -</PRE> + <p>Für komplexere Aufgaben bietet sich die Perl-Schnittstelle mit CGI.pm + oder mod_perl.</p> -Die Digests werden an die Mitglieder der Liste geschickt, wenn ca. 30kB an Mails -zusammengekommen sind.<P> + <h4><a name="2.3">2.3</a>) Hat PostgreSQL eine grafische Benutzerschnittstelle? Einen + Report-Generator? Eine eingebaute Query-Schnittstelle?</h4> -Die Bug-Mailingliste ist verfübar. Um sich an dieser Liste anzumelden, -sende eine Email an <a href="mailto:bugs-request@postgreSQL.org">bugs-request@postgreSQL.org</a> -mit folgendem Text:<P> + <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> -<PRE> -<CODE> - subscribe - end -</CODE> -</PRE> + <p>Die Distribution enthält außerdem <em>ecpg</em>, die eine eingebettete + SQL-Query-Schnittstelle für C zur Verfügung stellt.</p> -Es gibt ebenfalls eine Entwickler-Diskussionsliste. Um sich an dieser Liste anzumelden, -sende eine Email an <a href="mailto:hackers-request@postgreSQL.org">hackers-request@postgreSQL.org</a> -mit diesem Text:<P> + <h4><a name="2.4">2.4</a>) Welche Programmiersprachen und Schnittstellen gibt es?</h4> -<PRE> -<CODE> - subscribe - end -</CODE> -</PRE><P> + <p>PostgreSQL bietet:</p> + <ul> + <li>C (libpq)</li> -Weitere Mailinglisten und Informationen zu PostgreSQL können auf der PostgreSQL-Homepage im WWW -gefunden werden: -<BLOCKQUOTE> -<a href="http://postgreSQL.org">http://postgreSQL.org</a> -</BLOCKQUOTE><P> + <li>C++ (libpq++)</li> -Es gibt außerdem einen IRC-Channel im EFNet, Kanal #PostgreSQL. -Bruce nutzt den Unix-Befehl: <CODE>irc -c '#PostgreSQL' "$USER" irc.phoenix.net</CODE> um teilzunehmen<P> + <li>Embedded C (ecpg)</li> -Kommerzieller Support für PostgreSQL ist bei <a href="http://www.pgsql.com">http://www.pgsql.com/</a> verfügbar<P> + <li>Java (jdbc)</li> + <li>Perl (perl5, DBD::Pg)</li> -<H4><a name="1.7">1.7</a>) Was ist die neueste Version von PostgreSQL?</H4><P> + <li>ODBC (odbc)</li> -Das neueste Release von PostgreSQL ist die Version 6.5.<P> + <li>Python (PyGreSQL)</li> -Wir planen alle 4 Monate Hauptreleases herauszugeben.<P> + <li>TCL (libpgtcl)</li> + <li>C Easy API (libpgeasy)</li> -<H4><a name="1.8">1.8</a>) Welche Dokumente sind für PostgreSQL verfügbar? </H4><P> + <li>PHP ('pg_' functions, Pear::DB)</li> + </ul> + <hr /> + <h2 align="center">Administrative Fragen</h2><p> -Einige Handbücher, Man-Pages und einige kleine Testprogramme sind in der Distribution enthalten. -Siehe im /doc-Verzeichnis.<P> + <h4><a name="3.1">3.1</a>) Wie installiere ich PostgreSQL woanders als in /usr/local/pgsql?</h4> -<I>psql</I> -hat einige nette \d-Befehle, um Informationen über Typen, Operatoren, Funktionen, Aggregate, usw. zu zeigen. <P> + <p>Bei der Ausführung von <em>configure</em> die Option <em>--prefix</em> mit dem Zielverzeichnis + angeben.</p> -Die Website enthält sogar noch mehr Unterlagen.<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> -<H4><a name="1.9">1.9</a>) Wie erfahre ich etwas über bekannte Fehler oder fehlende Eigenschaften von PostgreSQL? -</H4><P> + <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> -PostgreSQL unterstützt eine ausgedehnte Untermenge von SQL-92. -Siehe unser <a href="http://www.postgreSQL.org/docs/todo.html">TODO</a> -für eine Auflistung der bekannten Fehler, fehlende Eigenschaften und zukünftige Pläne.<P> + <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="1.10">1.10</a>) Wie kann ich SQL lernen?</H4><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> -Es gibt nette SQL-Tutorials bei <a href="http://w3.one.net/~jhoffman/sqltut.htm"> -http://w3.one.net/~jhoffman/sqltut.htm</a> und bei <a href="http://ourworld.compuserve.com/homepages/Graeme_Birchall/DB2_COOK.HTM"> -http://ourworld.compuserve.com/homepages/Graeme_Birchall/DB2_COOK.HTM.</a><P> + <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> -Viele unserer User mögen <I>The Practical SQL Handbook</I>, Bowman et al., -Addison Wesley.<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="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="3.5">3.5</a>) Wie regle ich Zugriffe von anderen Rechnern?</h4> -<H4><a name="1.12">1.12</a>) Wie kann ich am Entwicklerteam teilnehmen?</H4><P> + <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> -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.<P> -Es gibt ungefähr ein Dutzend Leute, die das <I>commit</I>-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. <P> - -<H4><a name="1.13">1.13</a>) Wie sende ich einen Fehler-Bericht?</H4><P> - -Fülle die "Fehler-Vorlage"-Datei (bug.template im doc-Verzeichnis) aus und sende sie an: -<a href="mailto:bugs@postgreSQL.org">bugs@postgreSQL.org</a><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> -<DD> - -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.<P> - -<DT> <B>Leistung</B> -<DD> - -PostgreSQL läuft in zwei Modi. Im normalen <I>fsync</I>-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.<P> - -Im <I>no-fsync</I>-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 <I>fsync</I>-Modus und die Datenintegrität innerhalb 30 Sekunden -im Falle eines Betriebssystemabsturzes erlaubt. Der Modus ist durch den Datenbankverwalter -auswählbar.<P> - -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 <I>Eigenschaften</I> 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.<P> - - - -<DT> <B>Zuverlässigkeit</B> -<DD> - -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.<P> - -<DT> <B>Support</B> -<DD> - -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), <P> - -<DT> <B>Preis</B> -<DD> -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. -</DL> - - -<HR> - -<H2><CENTER>Fragen zu Benutzerprogrammen</CENTER></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: PostODBC und OpenLink ODBC.<P> - -PostODBC ist in der Distribution enthalten. Mehr Informationen können unter -<a href="http://www.insightdist.com/psqlodbc">http://www.insightdist.com/psqlodbc</a> abgerufen werden.<P> - -OpenLink ODBC kann unter <a href="http://www.openlinksw.com/">http://www.openlinksw.com</a> -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).<P> - -Sie werden dieses Produkt wahrscheinlich an Leute verkaufen, die kommerziellen Qualitäts-Support -brauchen, aber es 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> - - - -<H4><a name="2.2">2.2</a>) Welche Werkzeuge gibt es, um PostgreSQL-Datenbanken über Webseiten -verfügbar zu machen?</H4><P> - -Eine nette Einführung zu Datenbank-gestützten Webseiten kann unter -<a href="http://www.webtools.com">http://www.webtools.com</a> abgerufen werden.<P> - -Eine weitere gibt es bei <a href="http://www.phone.net/home/mwm/hotlist/"> -http://www.phone.net/home/mwm/hotlist/.</a><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> - -PHP ist hervorragend für einfache Anbindungen geeignet. Für komplexere -Aufgaben nutzen viele die Perl-Schnittstelle mit CGI.pm.<P> - -Einen WWW-Gateway, basierend auf WDB, kann man bei -<a href="http://www.eol.ists.ca/~dunlop/wdb-p95">http://www.eol.ists.ca/~dunlop/wdb-p95</a> herunterladen. - -<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 mit Namen -<I>pgaccess,</I> welche in der Distribution enthalten ist. -<I>pgaccess</I> hat auch einen Reportgenerator. Die Webpage liegt hier: -<A HREF="http://www.flex.ro/pgaccess">http://www.flex.ro/pgaccess</A><P> - -In der Distribution gibt es außerdem <I>ecpg,</I>, -welches eine eingebundene SQL-Query-Schnittstelle für C zur Verfügung stellt. - - -<H4><a name="2.4">2.4</a>) Welche Sprachen sind für die Kommunikation mit PostgreSQL verfügbar?</H4><P> - -Wir haben: -<UL> -<LI>C(libpq) -<LI>C++(libpq++) -<LI>Embedded C(ecpg) -<LI>Java(jdbc) -<LI>Perl(perl5) -<LI>ODBC(odbc) -<LI>Python(PyGreSQL) -<LI>TCL(libpgtcl) -<LI>ein rohes C/4GL(contrib/pginterface) -<LI>Embedded HTML(<a href="http://www.php.net">PHP from http://www.php.net</a>) -</UL><P> - -<HR> - -<H2><CENTER>Administrative Fragen</CENTER></H2><P> - - -<H4><a name="3.1">3.1</a>) Warum schlägt initdb fehl?</H4><P> - -<UL> -<LI> -überprüfe, daß keine Binaries vorheriger Versionen in Deinem Pfad -(PATH-Variable) sind. -(Wenn Du die Meldung siehst: <CODE>NOTICE:heap_modifytuple: repl is \ 9</CODE>, ist das das Problem.) -<Li> überprüfe, daß der Pfad richtig gesetzt ist -<LI> überprüfe, ob der User <I>postgres</I> der Eigentümer der entsprechenden Dateien ist -</UL><P> - - -<H4><a name="3.2">3.2</a>) Wie installiere ich PostgreSQL woanders als in /usr/local/pgsql?</H4><P> - -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. -<P> - - -<H4><a name="3.3">3.3</a>) Wenn ich den postmaster starte, bekomme ich einen <I>Bad System Call</I> oder eine <I>core dumped</I> Meldung. Warum?</H4><P> - -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. -<P> - - -<H4><a name="3.4">3.4</a>) Wenn ich versuche, den postmaster zu starten, bekomme ich <I>IpcMemoryCreate</I> Fehlermeldungen. Warum?</H4><P> - -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. - - -<H4><a name="3.5">3.5</a>) Wenn ich versuche, den postmaster zu starten, bekomme ich <I>IpcSemaphoreCreate</I> Fehlermeldungen. Warum?</H4><P> - -Falls die Fehlermeldung <I>IpcSemaphoreCreate: semget failed (No space -left on device)</I> 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 <I>-N</I> Option mit einem Wert kleiner als die standardmäßigen 32. - -Eine dauerhafte Lösung wäre es, die Kernel-Parameter -<I>SEMMNS</I> und <I>SEMMNI</I> zu erhöhen.<P> - -Falls die Fehlermeldung anders aussieht, hast Du möglicherweise keine Semaphoren-Unterstützung -in Deinem Kernel aktiviert.<P> - - -<H4><a name="3.6">3.6</a>) Wie verhindere ich, daß andere Hosts auf meine PostgreSQL Datenbanken zugreifen?</H4><P> - -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 <I>postmaster</I> mit der <I>-i</I> Option gestartet ist und die Host-basierte Authentizierung -in der Datei <I>$PGDATA/pg_hba.conf</I> entsprechend angepasst ist. -Das erlaubt TCP/IP-Verbindungen. -<P> - -<H4><a name="3.7">3.7</a>) Warum kann ich mich nicht von einer anderen Maschine mit meiner Datenbank verbinden?</H4><P> - -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>-i</I> Option gestartet wurde, und füge einen passenden Host-Eintrag in die Datei -<I>pgsql/data/pg_hba.conf</I> ein. Siehe auch die <I>pg_hba.conf</I> Man-Page.<P> - - -<H4><a name="3.8">3.8</a>) Warum kann ich nicht als <I>root</I> auf die Datenbank zugreifen?</H4><P> - -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. -<P> - - -<H4><a name="3.9">3.9</a>) Alle meine Server stürzen bei gleichzeitigem Tabellenzugriff ab. Warum?</H4><P> - -Dieses Problem kann durch einen Kernel verursacht werden, der ohne Support für Semaphoren -konfiguriert wurde. - - -<H4><a name="3.10">3.10</a>) Wie optimiere ich die Datenbankmaschine für bessere Leistung?</H4><P> - -Sicherlich können Indizes Abfragen beschleunigen. Der <I>explain</I> Befehl -erlaubt Dir zu sehen, wie PostgreSQL Deine Abfrage interpretiert und welche Indizes -benutzt werden. -<P> - -Wenn Du eine Menge <I>INSERTs</I> machst, überprüfe, ob Du sie als Stapelverarbeitung -mit dem <I>copy</I>-Befehl abarbeiten kannst. -Das ist viel schneller als einzelne <I>INSERTs</I>. - -Zweitens, SQL-Statements, die nicht in einem <I>begin work/commit</I> 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 -Datenmengen änderst.<P> - -Es gibt verschiedene Tuning-Maßnahmen, die man ergreifen kann. -Du kannst fsync() abschalten, indem Du beim Starten des postmasters die Optionen <I>-o -F</I> 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.<P> - -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ß.<P> - -Der <I>cluster</I> 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. - - -<H4><a name="3.11">3.11</a>) Welche Debugging/Fehlersuch-Hilfsmittel sind für PostgreSQL verfügbar?</H4><P> - -PostgreSQL hat einige Möglichkeiten, Statusinformationen zu berichten, die -nützlich für die Fehlersuche sein können.<P> - -Erstens, wenn beim configure-Lauf die Option --enable-cassert angegeben wurde, -verfolgen viele <I>assert()´s</I> den Fortschritt des Backends und halten das Programm -an, wenn etwas Unerwartetes passiert. -<P> - -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, : -<PRE> -<CODE> - cd /usr/local/pgsql - ./bin/postmaster >server.log 2>&1 & -</CODE> -</PRE><P> - -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! -<P> - -Du kannst tatsächlich das Postgres-Backend auf der Kommandozeile -laufen lassen und SQL-Statements direkt eingeben. -Diese Vorgehensweise wird aber <B>nur</B> 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. -<P> - -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. -<P> - - -<H4><a name="3.12">3.12</a>) Ich bekomme die Meldung "Sorry, too many clients", wenn ich eine Verbindung versuche. Warum?</H4><P> - -Du mußt die Grenze des postmasters, die festlegt, - wieviele gleichzeitige Backend-Prozesse gestartet werden können, hochsetzen.<P> - -In Postgres 6.5 sind das normalerweise 32 Prozesse. Du kannst diesen Wert dadurch erhöhen, -daß Du den postmaster mit einem entsprechenden <I>-N</I> Wert neu startest. -In der Standardkonfiguration kannst Du <I>-N</I> auf maximal 1024 setzen. -Falls Du mehr brauchst, erhöhe <I>MAXBACKENDS</I> in <I>include/pg_config.h</I> und -kompiliere das Paket neu. -Du kannst den Standardwert von <I>-N</I> während der Konfiguration -setzen, indem Du <I>--with-maxbackends</I> angibst. - -Anmerkung: Falls Du <I>-N</I> größer als 32 einstellst, solltest -Du <I>-B</I> 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 <I>SHMMAX,</I> -die Maximalanzahl der Semaphoren <I>SEMMNS</I> und <I>SEMMNI, -</I> die maximale Anzahl von Prozessen <I>NPROC,</I> -die maximale Anzahl von Prozessen pro User <I>MAXUPRC,</I> -und die Maximalzahl der geöffneten Dateien <I>NFILE</I> und <I>NINODE.</I> - -Der Grund für die Begrenzung der erlaubten Backend-Prozesse liegt darin, daß -verhindert werden soll, daß das System seine freien Ressourcen aufbraucht. -<P> - -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 <I>include/storage/sinvaladt.h.</I> -entsprechend angepasst wurde.<P> - -<H4><a name="3.13">3.13</a>) Was sind die pg_psort.XXX Dateien in meinem Datenbank-Verzeichnis?</H4><P> - -Dies sind temporäre Dateien, die durch den Query-Ausführer erzeugt werden. -Wenn zum Beispiel eine Sortierung durchgeführt werden muß, um ein <I>ORDER BY</I> -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. -<P> - -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.<P> - -<H4><a name="3.14">3.14</a>) Wie richte ich eine Benutzergruppe (pg_group) ein?</H4><P> - -Zur Zeit gibt es keine einfache Schnittstelle, um Benutzergruppen einzurichten -Du mußt explizit die pg_group-Tabelle mittels INSERT/UPDATE modifizieren. -Zum Beispiel: - -<PRE> -<CODE> - 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=> -</CODE> -</PRE><P> - - Die Felder in pg_group sind: -<UL> -<LI> groname: der Gruppenname. Dieser Name sollte rein alphanumerisch sein. Keine Unterstriche oder andere Punktionen -<LI> grosysid: die Gruppen-ID. Die Gruppen-ID ist ein int4-Feld. Sie sollte eindeutig für jede Gruppe sein. -<LI> grolist: die Liste der pg_user IDs, die zu dieser Gruppe gehören. (int4[].) -</UL><P> - - -<HR> - -<H2><CENTER>Fragen zum Betrieb</CENTER></H2><P> - - -<H4><a name="4.1">4.1</a>) Das System scheint Kommata, Dezimalpunkte und Datumsformate durcheinanderzubringen.</H4><P> - -Ü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. -<P> - - -<H4><a name="4.2">4.2</a>) Was ist der genauer Unterschied zwischen Binary Cursors und Normal Cursors?</H4><P> - -Vgl. die <I>declare</I> Man-Page für eine Beschreibung.<P> - -<H4><a name="4.3">4.3</a>) Wie wähle ich per <I>SELECT</I> nur die ersten paar Zeilen in einem Query aus?</H4><P> - -Vgl. die <I>fetch</I> Man-Page, oder benutze SELECT ... LIMIT....<P> - -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 <I>ORDER BY</I> benutzt. Es gibt keine Möglichkeit Zeilen -zurückzuliefern, bevor nicht die komplette Abfrage abgearbeitet ist. -<P> - -<H4><a name="4.4">4.4</a>) Wie bekomme ich eine Liste der Tabellen oder anderen Dingen, die ich in <I>psql</I> sehen kann<BR></H4><P> - -Du kannst Dir die Datei pgsql/src/bin/psql/psql.c mit dem Quellcode für <I>psql</I> ansehen. -Sie enthält die SQL-Befehle, die die Backslash-Kommandos (\) ausführen. -Seit Postgres 6.5 kannst Du <I>psql</I> auch mit der <I>-E</I> Option starten. Dadurch gibt -<I>psql</I> die Queries aus, die es bei der Ausführung der Befehle benutzt. -<P> - - -<H4><a name="4.5">4.5</a>) Wie entferne ich eine Spalte von einer Tabelle?</H4><P> - -Wir unterstützen <I>alter table drop column</I> nicht, aber mache es so: -<PRE> <CODE> - 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; -</CODE> -</PRE><P> - - -<H4><a name="4.6">4.6</a>) Was ist die Maximalgröße für eine Zeile, eine Tabelle, eine Datenbank?</H4><P> - -Zeilen sind auf 8 kB begrenzt, aber das kann geändert werden, indem Du in -<I>include/config.h</I> die Konstante <I>BLCKSZ</I> änderst. -Um Attribute mit mehr als 8 kB zu nutzen, kannst Du auch das "Large Object Interface" benutzen.<P> -Zeilen überschreiten keine 8 kB-Grenzen. Eine Zeile mit 5 kB wird 8 kB Speicherplatz benötigen. -<P> - -Tabellen- und Datenbankgrößen haben keine Grenzen. Es gibt viele Datenbanken mit zig Gigabytes und -wahrscheinlich einige mit hunderten Gigabyte. - -<H4><a name="4.7">4.7</a>) Wieviel Plattenplatz benötigt eine Datenbank zur Speicherung einer Datendatei mit zeilenweisen Datensätzen?<BR></H4><P> - -Eine Postgres Datenbank kann ungefähr sechseinhalb mal soviel Platz brauchen, -wie eine einfache Textdatei.<P> - -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. - -<PRE> - 36 Bytes: jeder Zeilenkopf (ungefähr) - + 8 Bytes: zwei Integer-Felder @ jedes 4 Bytes - + 4 Bytes: Zeiger auf den Datensatz + <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 ----------------------------------------------- - 48 Bytes pro Zeile - - Die Größe einer Datenseite in PostgreSQL ist 8192 Bytes (8 KB), also: - + 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 - --------------------- = 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) -</PRE></P> - -Indizes haben nicht einen solchen Overhead, sie beinhalten jedoch die Daten, die sie -indizieren und können so auch sehr groß werden. -<P> - -<H4><a name="4.8">4.8</a>) Wie finde ich heraus, welche Indizes oder Operationen in der Datenbank definiert sind?</H4><P> - -<I>psql</I> hat eine Vielzahl von Backslash Befehlen, um solche Informationen zu zeigen. -Benutze \?, um sie zu sehen. -<P> - -Schaue Dir auch die Datei <I>pgsql/src/tutorial/syscat.source.</I> an. -Sie illustriert viele der <I>SELECT</I>s, die benötigt werden, um diese Informationen -von der Datenbank-Systemtabelle zu erhalten -<P> - - -<H4><a name="4.9">4.9</a>) Meine Queries sind langsam oder nutzen die Indizes nicht. Warum?</H4><P> - -PostgeSQL pflegt automatische Statistiken nicht. -Um die Statistiken zu aktualisieren, mußt Du ein explizites <I>vacuum</I> 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.<P> - -Benutze den Befehl <I> vacuum analyze</I> für die spaltenspezifische Optimierung. - <I>Vacuum analyze</I> 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ß <I>vacuum analyze</I> -regelmäßig aufgerufen werden sollte. -<P> - -Indizes werden nicht für <I>ORDER BY</I> Operationen benutzt.<P> - -Bei der Nutzung von Wildcard-Operatoren wie <I>LIKE</I> oder <I>~,</I> können Indizes -nur benutzt werden, wenn die Suche mit dem Anfang eines Strings startet. -Um also Indizes zu nutzen, sollten <I>LIKE</I>-Suchen nicht mit -<I>%,</I> und <I>~</I> beginnen (Die Sucheparameter regulärer Ausdrücke sollten -mit <I>^.</I> beginnen. - -<H4><a name="4.10">4.10</a>) Auf welche Weise kann ich sehen, wie der Query-Optimierer meine Abfrage auswertet?</H4><P> - -Vgl. die <I>EXPLAIN</I> Man-Page.<P> - -<H4><a name="4.11">4.11</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 <I>POINT</I> -gebildet wird, dann kann das System Abfragen wie z.B. "Zeige alle Punkte, -die sich in einem umgebenden Rechteck befinden" effizienter beantworten. -<P> - -Die kanonische Veröffentlichung , die das originale R-Tree Design beschreibt ist: -<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> - -Du kannst dieses Werk ebenfalls in Stonebraker's "Readings in Database -Systems" finden.<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.12">4.12</a>) Was ist "Genetic Query Optimization"?</H4><P> - -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. -<P> -Für weitere Informationen siehe die Dokumentation. - - -<H4><a name="4.13">4.13</a>) Wie verfahre ich bei der Suche mit regulären Ausdrücken und bei einer Suche mit Ignorierung der Groß- und Kleinschreibweisen?</H4><P> - -<I>~</I> und <I>~*</I> sind wahrscheinlich das, was Du willst. -Vgl. psql's <I>\do</I> Befehl. <P> - - -<H4><a name="4.14">4.14</a>) Wie ermittle ich in einem Query, daß ein Feld NULL ist?</H4><P> - -Du testest die Spalte mit IS NULL und IS NOT NULL.<P> - - -<H4><a name="4.15">4.15</a>) Was ist der Unterschied zwischen den verschiedenen CHAR-Typen?</H4> - -<PRE> -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 -</PRE><P> - -Du mußt die internen Namen benutzen, wenn Du interne Operationen durchführen willst. -<P> - -Die letzten vier Typen sind "varlena"-Typen (d.h. die ersten vier Bytes geben die Länge an, gefolgt -von den Daten). -<I>CHAR(#)</I> belegt die maximale Anzahl von Bytes, unabhängig davon, wieviele Daten im -Feld gespeichert werden. -<I>TEXT, VARCHAR(#)</I> und <I>BYTEA</I> 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. -<P> - - -<H4><a name="4.16">4.16</a>) Wie erzeuge ich ein serielles Feld mit automatischer Erhöhung des Inhalts?</H4><P> - -PostgreSQL unterstützt einen <I>SERIAL</I> Datentyp. Er erzeugt automatisch eine -Sequenz und einen Index auf die Spalte. Siehe die <I>create_sequence</I> Man-Page -für weitere Informationen über Sequenzen. - -Du kannst aber auch das <I>Oid</I> Feld jeder Zeile als eindeutigen Wert nutzen. -Jedoch mußt Du, falls Du Deine Datenbank einmal komplett ausgeben und wieder einlesen willst, -die <I>pg_dump's -o</I> oder die <I>copy with oids</I> Option benutzen, um die Oids zu retten.<P> - -<H4><a name="4.17">4.17</a>) Was ist ein Oid? Was ist ein Tid?</H4><P> - -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 <I>backend/access/transam.h</I>). -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. -<P> -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 <I>sql(l)</I> Man-Page, um die anderen internen Spalten kennenzulernen. -Du kannst einen Index auf ein Oid-Feld erzeugen, um schnelleren Zugriff zu erreichen. -<P> - -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. -<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'; -<!-- - CREATE TABLE new_table (mycol int); - INSERT INTO new_table (oid, mycol) SELECT oid, mycol FROM old_table; ---> -</PRE><P> - -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. - -<H4><a name="4.18">4.18</a>) Was ist die Bedeutung der 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: - -<UL> -<LI> row, record, tuple -<LI> attribute, field, column -<LI> table, class -<LI> retrieve, SELECT -<LI> replace, UPDATE -<LI> append, INSERT -<LI> oid, serial value -<LI> portal, cursor -<LI> range variable, table name, table alias -</UL><P> - -<H4><a name="4.19">4.19</a>) Wieso bekomme ich einen Fehler: "FATAL: palloc failure: memory exhausted?"<BR></H4><P> - -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: - -<PRE> -<CODE> - ulimit -d 65536 - limit datasize 64m -</CODE> -</PRE> - -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. -<P> - -<H4><a name="4.20">4.20</a>) Wie kann ich feststellen, welche PostgreSQL-Version ich laufen habe?<BR></H4><P> - -Gib in <I>psql</I> <CODE>SELECT version();</CODE> ein<P> - -<H4><a name="4.21">4.21</a>) Beim Arbeiten mit "large-object" kommt die Fehlermeldung: <I>invalid large obj descriptor.</I> Warum?<BR></H4><P> - -Du solltest die Befehle <CODE>BEGIN WORK</CODE> und <CODE>COMMIT -</CODE> bei jeden Gebrauch von Large Objects benutzen. Also um -<CODE>lo_open</CODE> ... <CODE>lo_close.</CODE><P> - -Die Dokumentation hat schon immer darauf hingewiesen, daß -<I>lo_open</I> 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.<P> - -Das aktuelle PostgreSQL erzwingt diese Regel, indem es die Handles der Large Objects -beim COMMIT der Transaktion schließt, was sofort nach dem <I>lo_open</I> passiert, -wenn Du nicht innerhalb einer Transaktion bist. -So führt der erste Versuch, etwas mit dem Large Object zu machen zu einem -<I>invalid large obj descriptor</I>. -Also wird der Code, der bisher benutzt wurde, nun diese Fehlermeldung erzeugen, wenn Du -keine Transaktionen benutzt hast. -<P> -Falls Du eine Client-Schnittstelle wie ODBC benutzt, kann es sein, daß Du -<CODE>auto-commit off</CODE> setzen mußt.<P> - -<HR> - -<H2><CENTER>PostgreSQL erweitern</CENTER></H2><P> - - -<H4><a name="5.1">5.1</a>) Ich habe eine benutzerdefinierte Funktion geschrieben. Wenn ich sie in <I>psql</I> aufrufe, kommt ein <I>core dump</I>. Warum?</H4><P> - -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<P> - - -<H4><a name="5.2">5.2</a>) Was bedeutet die Meldung: <I>NOTICE:PortalHeapMemoryFree: 0x402251d0 not in alloc set!</I>?</H4><P> - -Du <I>pfree</I>st etwas, das Du nicht <I>palloc</I>t hast! -Stelle sicher, daß Du nicht <I>malloc/free</I> und <I>palloc/pfree</I> durcheinanderwürfelst. - - -<H4><a name="5.3">5.3</a>) Wie kann ich ein paar elegante neue Feldtypen und Funktionen zu PostgreSQL beitragen? -</H4><P> - -Sende Deine Erweiterungen zur pgsql-hackers Mailing Liste, -und sie werden eventuell im <I>contrib/</I> Verzeichnis enden.<P> + --------------------- = 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> -<H4><a name="5.4">5.4</a>) Wie schreibe ich eine Funktion in C, die einen Tuple zurückliefert?</H4><P> + <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> -Das erfordert derart extreme Genialität, daß die Autoren es niemals versucht haben, -obwohl es im Prinzip zu machen wäre.<P> + <hr /> -<H4><a name="5.5">5.5</a>) Ich habe eine der Quellendateien geändert. Warum macht sich die Änderung beim erneuten Compilerlauf nicht bemerkbar?</H4><P> + <h4>Anmerkungen des Übersetzers</h4> -Die Makefiles finden nicht die richtigen Abhängigkeiten. Du mußt ein <I>make clean</I> und dann ein weiteres <I>make</I> machen. + <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> +</body> +</html> -- GitLab