Aktuelles in der Kategorie PostgreSQL

debianlogo.png
Etwas mehr als zwei Jahre nach dem letzten Release wurde Debian 7 alias Wheezy veröffentlicht. Neben einem Update der Standardsoftware unterstützt Wheezy eine sprachgeführte Installation und bietet ein ruhiges, modernes Design. Und: Debian wird nun auch im All genutzt.


Debian 7.0 alias Wheezy hat etwas mehr als zwei Jahre nach seinem Vorgänger Squeeze das Licht der Welt erblickt, und bietet umfangreiche Neuerungen.

Da ist zum einen die Liste aktualisierter Pakete: Gnome, der Debian-Standard-Desktop, wird nun in einer 3er-Version mitgeliefert, bietet also die neue Gnome-Shell. Auch die Desktops KDE und XFCE wurden aufgefrischt, und liegen jeweils in der Version 4.8 vor. Libreoffice ersetzt OpenOffice, PostgreSQL lässt mit 9.1 die Ära der 8 hinter sich und die Compiler-Suite GCC springt von 4.4 auf 4.7. Abgerundet werden die aktualisierten Pakete durch das ruhigere, aufgeräumtere Design des neuen Debian.

Gerade für Desktop-Anwender ist darüber hinaus interessant, dass Wheezy auch nahezu alle wichtigen Multimedia-Formate wie MP3 und x264 unterstützt. Die Zeiten, in denen diese umständlich nachinstalliert werden mussten, sind damit vorbei.

Doch auch abseits der Desktop-Anwender finden sich umfangreiche Neuerungen: Wheezy integriert die Cloud-Lösung OpenStack gebrauchsfertig! Es enthält out-of-the-box alle Komponenten, die Sie benötigen um einen beliebig großen Cloud-Cluster aufzubauen - egal ob mit zwei oder mit zweitausend Servern.

Für Server-Betrieb ebenfalls interessant ist die neue Unterstützung für Multiarch-Installationen: unter Wheezy können Pakete für verschiedene Prozessorarchitekturen direkt nebeneinander installiert und genutzt werden. Eine eigene chroot ist so für andere Architekturen nicht mehr notwendig, und auch proprietäre Software wie Skype oder unter Wine laufende Programme lassen sich so deutlich einfacher handhaben.

Doch auch abseits der Veröffentlichung von Wheezy feiert Debian noch einen ganz anderen Erfolg: die Laptops auf der internationalen Raumstation werden fortan unter Linux betrieben! Keith Chuvala, ein Mitarbeiter der der NASA zuarbeitenden United Space Alliance, sah Bedarf nach einer staiblen und verlässlichen Linux-Distribution, und wählte daher Debian:

Um allen Ansprüchen der Astronauten zu genügen suchte Chuvala nach einem moderneren, robusteren Enterprise Support, der mit der Migration von Scientific Linux nach Debian 6 erreicht wurde.
To manage all of the astronaut’s needs Chuvala was looking for newer, more robust enterprise support, which was achieved by moving from a Scientific Linux distribution to Debian 6.

Wir von der credativ GmbH beglückwünschen Debian zu beiden Erfolgen!

Alle Blog-Artikel zum Thema Debian werden auch als Kategorie Debian samt eigenem Feed angeboten - und bei Bedarf bieten wir auch gerne Support und Services rund um Debian.

Deutsche PostgreSQL Konferenz

| Keine Kommentare

postgreslogo.png


Im Rahmen der alljährlichen OpenRheinRuhr, einer jährlichen Konferenz rund um Freie Software, wird die deutschsprachige PGConf.DE am 11. November 2011 in Oberhausen das Rheinland besuchen.

Als Fortsetzung des sehr erfolgreichen PGDay.EU im letzten Jahr, werden auch in diesem Jahr interessante und informative Vorträge rund um PostgreSQL angeboten. Entwickler und Anwender, aber auch Interessierte anderer Bereiche, treffen auf PostgreSQL-Entwickler, -Spezialisten oder erfahrene Anwender zum Erfahrungsaustausch und um die neuesten Entwicklungen rund um das freie Datenbanksystem zu erfahren.

Das Vortragsprogramm ist online verfügbar, ebenso wie die Registrierung der Konferenz bereits möglich ist. Besucher, die sich vorab registrieren erhalten einen Kostenvorteil von 10 € gegenüber dem Eintrittspreis an der Tageskasse. Der Eintrittspreis berechtigt gleichzeitig auch zum Besuch der OpenRheinRuhr für das ganze Wochenende.

Mitarbeiter der credativ GmbH, die die PGConf.DE als Goldsponsor unterstützt, werden selbstverständlich ebenfalls anwesend sein und in ihren Vorträgen von ihren Erfahrungen berichten.

Alle Blog-Artikel zum Thema PostgreSQL werden auch als Kategorie PostgreSQL samt eigenem Feed angeboten. Wir helfen auch gerne mit Support und Services für PostgreSQL.

VACUUM FULL - Viel hilft viel?

| Keine Kommentare

postgreslogo.png


VACUUM in PostgreSQL ist seit jeher mit Mythen und falschen Informationen behaftet. Besonders verbreitet ist offenbar die Einstellung, VACUUM FULL helfe vorbeugend. Das genaue Gegenteil ist häufig der Fall.

VACUUM - Der Staubsauger

Seit der Einführung von MVCC (Multi Version Concurrency Control) in PostgreSQL 6.5 im Jahr 1999 gibt es das Kommando VACUUM. Mit Hilfe dieses Kommandos wird der sogenannte Heap, also die Dateien, die die Tabellendaten enthalten, defragmentiert und nicht mehr belegter Speicherplatz freigegeben. Dies ist notwendig, da PostgreSQL Zeilen bei UPDATE oder DELETE nicht etwa physikalisch löscht, sondern eine neue Version der Zeile anlegt bzw. die Zeile einfach als gelöscht markiert. Die alte Version muss noch so lange beibehalten werden, wie es auch Transaktionen gibt, die diese Zeilenversion noch "sehen" können. Ist eine Tabelle sehr stark durch UPDATE oder DELETE/INSERT frequentiert, und passiert VACUUM zu selten (beispielsweise weil Autovacuum nicht verwendet wird), so kann der sogenannte "tote" Speicherplatz in einer Tabelle sehr stark anwachsen.

VACUUM FULL - Vorbeugende Reorganisation?

Viele Administratoren sind daher der Auffassung, dass es aus diesem Grund angebracht ist, dies im Vorfeld durch nächtliche VACUUM FULL Jobs dem Anwachsen der Tabelle vorzubeugen. Dies ist eine schlechte Strategie, aus mehreren Gründen:

  1. VACUUM FULL benötigt im Gegensatz zu normalem VACUUM eine exklusive Tabellensperre, d.h. der Zugriff ist für alle nebenläufigen Transaktionen nicht möglich (auch reine Leseanfragen).
  2. VACUUM FULL führt eine komplette physische Reorganisation der Tabelle durch, nicht jedoch der Indexe. Dies hat sich mit PostgreSQL 9.0 geändert. Eine exklusive Tabellensperre ist weiterhin notwendig.
  3. Läuft eine Datenbank mit WAL-Archiving, so kommt es durch VACUUM FULL zu massiv erhöhtem Datenaufkommen im Transaktionslog. Dies kann Probleme mit dem Backuparchiv nach sich ziehen.
  4. Man benötigt auf jeden Fall ein Wartungsfenster für exklusiven Zugriff der Tabellen.
  5. Im Gegensatz zu normalen VACUUM ist VACUUM FULL daher nicht für den Einsatz in 24/7-Datenbanken geeignet.

Während sich die meisten Nachteile durch ein Wartungsfenster umschiffen lassen, sind die Nachteile durch sehr häufiges VACUUM FULL gravierender. Besonders PostgreSQL-Versionen bis einschließlich 8.4 sind davon betroffen. Um das zu verstehen, muss man sich die Funktionsweise des VACUUM FULL Kommandos in diesen Versionen ansehen:

  1. VACUUM FULL untersucht die Tabelle sequentiell nach totem Speicherplatz. Hierzu werden die gefundenen toten Bereiche während VACUUM FULL in einem Array im Hauptspeicher gespeichert. Ist das Array voll (begrenzt durch maintenance_work_mem), so werden sichtbare (also aktive) Zeilen von unten her in die gefundenen toten Bereiche verlagert (sofern Platz hierfür ausreichend zur Verfügung steht).
  2. Sind Indexe auf der Tabelle vorhanden, so müssen diese ebenfalls aktualisiert werden.
  3. Ist das Array abgearbeitet, beginnt der Algorithmus wieder von vorne, solange, bis das Ende der Tabelle erreicht ist.
  4. Anschließend wird die Tabelle physisch verkleinert.

Das Hauptproblem ist das Umsortieren der Zeilen in den freigewordenen Speicherplatz. Dies sorgt für massive I/O auf dem Speichersystem. Noch schwerwiegender ist jedoch die Tatsache, dass beim Umsortieren der Index ebenfalls aktualisiert werden muss. Passiert das sehr häufig, so kann es passieren, dass der Index selbst sehr stark fragmentiert. In diesem Fall wächst der Index selbst an, man spricht dann vom sogenannten Index Bloat. Daher kann es erforderlich sein, direkt nach dem VACUUM FULL ein REINDEX auf die Tabellen auszuführen, insbesondere wenn Tabellen sehr stark fragmentiert waren und viele Tupel umsortiert wurden. Dies alles sorgt bei sehr großen Tabellen auch für sehr lange Laufzeiten.

Ab PostgreSQL 9.0 verhält sich VACUUM FULL wie das CLUSTER Kommando, d.h. die Tabelle wird sequentiell gelesen und parallel komplett neu aufgebaut. Dies hat den Vorteil, dass man nur die Zeilen liest, die aktiv sind und die "toten" Zeilen außen vor lässt. Anschließend werden die Indexe neu erzeugt. Dies eliminiert viele Nachteile des alten Algorithmus, vermeidet jedoch nicht die Notwendigkeit exklusiver Tabellensperren. Ferner benötigt die Reorganisation der Tabelle im schlechtesten Falle nochmal soviel Speicherplatz, wie die aktuell zu bearbeitende Tabelle.

VACUUM und Autovacuum für tägliche oder sehr granulare Wartung

VACUUM bzw. Autovacuum sind für die tägliche oder dauerhafte Wartung von PostgreSQL-Datenbanken ausgelegt.

  1. Wer sich eine sorgfältige VACUUM-Policy mit normalem VACUUM oder, noch besser, Autovacuum zurechtlegt, benötigt kein VACUUM FULL.
  2. Autovacuum sollte auf jeden Fall in Betracht gezogen werden, muss jedoch an den Workload angepasst werden.
  3. Ist dennoch mal eine Tabelle sehr stark aufgebläht, so kann mit aktuellen 8er PostgreSQL-Versionen mit CLUSTER die Tabelle häufiger deutlich schneller verkleinert werden, ohne das Problem der Indexfragmentierung. Da CLUSTER anhand eines Index die Tabelle reorganisiert, benötigt man mindestens einen Index. Ferner sollte unbedingt danach die Optimizerstatistiken mit ANALYZE aktualisiert werden.
  4. Bis einschließlich PostgreSQL 8.3 ist es unbedingt notwendig, sich vor Inbetriebnahme die Parameter max_fsm_pages und max_fsm_relations anzuschauen. Die Werte dieser Parameter kann nur durch einen Neustart der Datenbank geändert werden und beeinflussen die Anzahl an erfassten fragmentierten Speicherplatz in Tabellen und Indexe sowie die Anzahl an Tabellen und Indexe die durch VACUUM erfasst werden können (VACUUM FULL benutzt die sogenannte Free Space Map nicht). Ab PostgreSQL 8.4 werden die FSM pro Tabelle automatisch angepasst.
  5. Auch VACUUM kann unter günstigen Umständen eine Tabelle verkleinern. Wenn die Tabelle am Ende nur noch leere Blöcke enthält und aktuell keine Transaktion neue Zeilen in diese Bereiche einlagern möchte, dann kann auch normales VACUUM die Tabelle entsprechend eindampfen.

Warum dann überhaupt noch VACUUM FULL?

VACUUM FULL ist ein Kommando, das nicht für die tägliche Wartung ausgelegt ist. Ist das Kind einmal in den sprichwörtlichen Brunnen gefallen und eine Tabelle stark aufgebläht, so ist es je nach PostgreSQL-Version unausweichlich mit VACUUM FULL den Speicherplatz freizugeben. Bei älteren PostgreSQL-Versionen sollte sich der Administrator besonders bei sehr großen Speicherbedarf der Tabelle besser überlegen, auf das CLUSTER-Kommando auszuweichen. Möchte man dennoch VACUUM FULL benutzen, so sollte man bei älteren PostgreSQL-Versionen mit REINDEX ebenfalls die Indexe neu erzeugen. Weitere Infos zu diesem Thema finden sich im PostgreSQL Wiki.

Weitere Informationen

Alle Blog-Artikel zum Thema PostgreSQL werden auch als Kategorie PostgreSQL samt eigenem Feed angeboten. Wir helfen auch gerne mit Support und Services für PostgreSQL.

credativ beim PGDay Europe 2010

| Keine Kommentare

postgreslogo.png
Letzten Monat fand die alljährliche europäische PostgreSQL-Konferenz in Stuttgart statt. Die credativ GmbH war nicht nur Sponsor der Veranstaltung, sondern auch mit vier Mitarbeitern vor Ort, welche mehrere Vorträge gehalten haben. Die Folien der Vorträge sind nun verfügbar.


Die Konferenz fand im Stuttgarter Millennium-Hotel statt und wurde professionell und effizient von PostgreSQL Europe organisiert. Durch zahlreiche Kaffee-Pausen und die Konferenz-Party am Montag Abend war ein reger Austausch zwischen den Teilnehmern möglich.

Die Vorträge von credativ waren im einzelnen:

  • "Migration auf Freie Software in unternehmenskritischen Bereichen" (Folien)

    Dr. Michael Meskes fasste in diesem Vortrag die langjährige Erfahrung der credativ GmbH bei der Migration von kritischen Unternehmens-Bereichen auf Freie Software im allgemeinen und PostgreSQL für Datenbanken im speziellen zusammen.

  • "Embedded SQL für PostgreSQL" (Folien)

    In seinem zweiten Vortrag befasste sich Dr. Michael Meskes mit dem von ihm im PostgreSQL-Projekt als ECPG betreuten Embedded SQL, eine Datenbankschnittstelle in der Programmiersprache C. Da sie im SQL-Standard definiert ist und schon sehr lange und für alle Datenbanksysteme existiert, wird sie vielfach verwendet, so dass in dem Vortrag vor allem auch auf Migrationen eingegangen wurde.

  • "Die PostgreSQL Community" (Folien)

    Bernd Helmle, der technische Leiter der credativ GmbH für den Bereich Datenbanken, stellte in seinem Vortrag die Geschichte und den momentanen Stand der PostgreSQL-Community und deren Prozesse und Organisation vor und erläuterte zusätzlich die verschiedenen Möglichkeiten der Mitarbeit durch neue Mitglieder.

  • "Advanced Analytics with PL/R" (Folien)

    Schließlich hielt Joe Conway, CEO der US-amerikanischen credativ LLC einen (englisch-sprachigen) Vortrag über die PostgreSQL-Erweiterung PL/R, eine Zusammenführung von PostgreSQL mit R, der im Bereich Freier Software führenden Umgebung für mathematische und statistische Berechnungen und deren Visualisierung).

Das nächste PostgreSQL-Event der credativ GmbH ist die Schulung im Linux-Hotel vom 23. bis 25. Februar 2011.

Alle Blog-Artikel zum Thema PostgreSQL werden auch als Kategorie PostgreSQL samt eigenem Feed angeboten. Wir helfen auch gerne mit Support und Services für PostgreSQL.

PGDay Europe 2010 in Stuttgart

| Keine Kommentare


Die PostgreSQL Europe Community wird dieses Jahr ihren jährlichen Kongress in Stuttgart abhalten. Das umfangreiche Vortragsprogramm umfasst vielfältige Themen rund um PostgreSQL, darunter Vorträge aus den Gebieten GIS, Entwicklung, Hochverfügbarkeit und vieles mehr.

Die credativ GmbH wird mit Michael Meskes, Joe Conway und Bernd Helmle als Silbersponsor mit Vorträgen zu den Themen

auf dem Kongress vertreten sein. Darüber hinaus bietet der PGDay ein eintägiges Tutorialprogramm. Details für die Registrierung, Unterkunft und Anreise können über die Seite des Kongresses abgerufen werden.

Alle Blog-Artikel zum Thema PostgreSQL werden auch als Kategorie PostgreSQL samt eigenem Feed angeboten. Wir helfen auch gerne mit Support und Services für PostgreSQL.

PostgreSQL 9.0 veröffentlicht

| Keine Kommentare

postgreslogo.png


Die PostgreSQL Community hat heute die Veröffentlichung der stabilen Version 9.0.0 bekanntgegeben.

Mit der Version 9.0 verfügt PostgreSQL erstmals über eine eingebaute Replikationslösung (Streaming Replication) und die Möglichkeit, Standbyknoten im reinen Lesemodus zu betreiben (Hot Standby). Streaming Replication ermöglicht die transparente Replikation auf einen oder mehrere Standbyknoten mit geringer Latenz. Des Weiteren gibt es viele Änderungen im Bereich Skalierbarkeit, Geschwindigkeit und Wartung:

  • JOIN Removal
  • Unterstützung für 64 Bit Windows
  • Trigger mit Bedingungen
  • Spaltenbasierte Trigger
  • Anonyme Prozedurale Codeblöcke mit DO
  • Verbessertes Nachrichtensystem mit LISTEN/NOTIFY

Weitergehende Informationen können direkt über die Release Notes der PostgreSQL Global Development Group eingesehen werden.

postgreslogo.png


Entwickler-Team beantwortet Fragen zur neuen PostgreSQL Version 9.0.

Mönchengladbach, 20. September 2010 - Anlässlich der neuen PostgreSQL Version 9.0 bietet das internationale PostgreSQL-Entwicklerteam der credativ allen interessierten Unternehmen eine „Entwickler-Sprechstunde" an.
Mit dieser Aktion ermöglicht credativ eine direkte Kommunikation zwischen Unternehmen und PostgreSQL-Entwicklern und steht für alle Fragen rund um die neue PostgreSQL Version 9.0 zur Verfügung.

Das neutrale und kostenfreie Informationsangebot richtet sich gezielt an Unternehmen, die den Einsatz von PostgreSQL planen, oder Ihre Anwendungen für die Unterstützung von PostgreSQL 9.0 vorbereiten möchten.
Als Ansprechpartner aus dem PostgreSQL-Entwicklerteam stellen sich folgende Personen zur Verfügung:

  • Dr. Michael Meskes (Deutschland)
    Schwerpunkte: PostgreSQL 9.0 im Enterprise-Bereich, Migration und Strategie, Hochverfügbarkeit und Skalierbarbeit, PostgreSQL Embedded SQL.
  • Bernd Helmle (Deutschland)
    Schwerpunkte: Neue Funktionalitäten in PostgreSQL 9.0, Replikation (Hot Standby & Streaming Replication), Skalierbarkeit, Performance und Tuning, Anwendungsentwicklung für PostgreSQL 9.0.
  • Joe Conway (USA)
    Schwerpunkte: Neue Funktionalitäten in PostgreSQL 9.0, PostgreSQL 9.0 im Enterprise- Bereich, Migration und Strategie, Replikation (Hot Standby & Streaming Replication), Procedural Language.
  • Dave Cramer (Kanada)
    Schwerpunkte: Neue Funktionalitäten in PostgreSQL 9.0, PostgreSQL 9.0 JDBC Driver, Anwendungsentwicklung, PostgreSQL und Embedded SQL.

Dr. Michael Meskes, Geschäftsführer der credativ GmbH, erklärt dazu: „Mit diesem Informationsangebot wollen wir eine direkte Verbindung zu den Unternehmen herstellen, die PostgreSQL bereits einsetzen, oder den Einsatz von PostgreSQL in ihrem Unternehmen evaluieren möchten. Als PostgreSQL-Entwickler sind wir natürlich sehr daran interessiert die Wünsche und Anregungen aufzunehmen, die aus Anwendersicht an uns gestellt werden. Die weitere Entwicklung einer Open Source Datenbank wie PostgreSQL lebt von dem Dialog und den Erfahrungen aller, die an PostgreSQL entwickeln oder PostgreSQL einsetzen."

Weitere Informationen können über unsere Internetseite eingesehen werden.

PostgreSQL Optimizer Bits: Auto Explain

| Keine Kommentare

postgreslogo.png
In dieser Folge stellen wir im Rahmen der "Optimizer Bits" das Modul auto_explain vor, das seit PostgreSQL Version 8.4 Bestandteil des contrib-Zweiges ist. Das Modul ermöglicht das Protokollieren von Abfrageplänen im PostgreSQL-Log und so eine bessere Analyse von Abfrageproblemen während der Laufzeit.

Problemstellung

Für viele Datenbank-Entwickler und -Administratoren stellt sich täglich das Problem, problematische Abfragen zu finden, zu analysieren und effizienter zu gestalten. Hauptproblem dieser Aufgabe ist das Identifizieren solcher Abfragen. Erstes Mittel ist der Logparameter

log_min_duration_statement = '30s'

In diesem Falle werden alle Abfragen, die länger als 30 Sekunden dauern, in das Log der PostgreSQL-Datenbank geschrieben. Der Administrator hat dann die Möglichkeit, diese Abfrage aus dem Logfile zu ermitteln oder aber über weitere Tools wie bspw. pgfouine zu analysieren. Allerdings kann es unter Umständen passieren, dass bei der späteren Analyse andere Pläne entstehen, die es schwer machen, das tatsächliche Problem zu spezifizieren. Solche Abhängigkeiten machen es dem Entwickler schwer, das tatsächliche Problem genau einzugrenzen.

Das Modul auto_explain

Seit PostgreSQL 8.4 gibt es das contrib-Modul auto_explain, dass die Ausgabe von Abfrageplänen während der Testphase von Abfragen gestattet. Beispielsweise lassen sich damit Läufe von umfangreichen Batchjobs protokollieren, die Pläne später analysieren und entsprechende Optimierungen an den entsprechenden Abfragen vornehmen. auto_explain kann permanent oder nur zur Fehlersuche in die Datenbank geladen werden.

Zunächst müssen die contrib-Module von PostgreSQL 8.4 oder höher installiert sein. Dies ist von Distribution zu Distribution unterschiedlich, in der Regel sollte man nach einen Paket postgresql-contrib Ausschau halten. Wenn man PostgreSQL selbst aus den Tarballs baut, wechselt man in der Verzeichnis des entpackten Quelltextes und von dort aus in das entsprechende contrib-Verzeichnis (die folgenden Schritte erfordern in der Regel Rootrechte auf dem System):

$ cd <QUELLTEXT>
$ cd contrib/auto_explain

Je nachdem. ob bereits PostgreSQL komplett gebaut wurde (in der Regel hat man dann ja noch alle benötigten Sourcen), kann man dann auto_explain zusätzlich bauen:

$ make install

Sollte der Quelltextbaum bereits bereinigt worden (make clean), aber eine komplette Installation zur Verfügung stehen, so kann man mit PGXS-Unterstützung, ohne den kompletten Quelltextbaum nochmals kompilieren zu müssen, das Modul wie folgt bauen:

$ USE_PGXS=1 make install

Dies erfordert jedoch mindestens die Präsenz des Tools pg_config im Pfad der aktuellen Umgebung.
Ist alles installiert, so kann das Modul direkt in eine Datenbankverbindung geladen werden. Dies ist nur als Superuser möglich, wie in diesem Beispiel über eine lokale Verbindung:

$ psql -U <superuser> <dbname>
#= LOAD 'auto_explain';
LOAD

Ist das Modul erfolgreich geladen worden, so steht es nur in dieser Datenbankverbindung zur Verfügung und kann auch nur von dort aus verwendet werden. Interessant ist dies, um nur Abfragen aus speziellen Verbindungen heraus zu protokollieren. Mit der folgenden SQL-Abfrage können die nun hinzugekommenen Konfigurationsparameter für auto_explain abgefragt werden:

#= SELECT name, setting FROM pg_settings WHERE name LIKE 'auto_explain%';

Dies sollte folgende Liste liefern:

                 name                   | setting 
------------------------------------+---------
 auto_explain.log_analyze           | off
 auto_explain.log_buffers           | off
 auto_explain.log_format            | text
 auto_explain.log_min_duration      | -1
 auto_explain.log_nested_statements | off
 auto_explain.log_verbose           | off
(6 rows)

Der wichtigste Parameter hier ist

auto_explain.log_min_duration

Dieser aktiviert (Werte ab 0ms) oder deaktiviert (Wert -1) das Protokollieren von Abfrageplänen. Die weiteren Einstellungen sind im Einzelnen:

  • auto_explain.log_analyze = true|false: Aktiviert oder deaktiviert das Loggen von EXPLAIN ANALYZE. Dies bedeutet das Timinginformationen aller Abfragen erfasst werden (auch diejenigen, die schneller ausgeführt werden als auto_explain.log_min_duration). Dies hat einen signifikanten Einfluss auf die Ausführungsgeschwindigkeit und sollte mit Bedacht gewählt werden.
  • auto_explain.log_verbose = true|false: Ausgabeformat mit zusätzlichen Informationen für EXPLAIN.
  • auto_explain.log_nested_statements = true|on: Hiermit werden auch Ausführungspläne von Statements innerhalb von Funktionen mitprotokolliert. So ist es nun auch möglich, die Pläne von SQL-Abfragen, die bspw. aus pl/pgsql-Prozeduren heraus ausgeführt werden, genauer zu untersuchen.

Mit PostgreSQL 9.0 kommen zwei weitere Konfigurationsmöglichkeiten hinzu:

  • auto_explain.log_format = 'text'|'xml'|'json'|'yaml': Ermöglicht die Ausgabe der Abfragepläne im XML, JSON, oder YAML Format. text entspricht dem Standardformat.
  • auto_explain.log_buffers = true|false: Aktiviert oder deaktiviert die Ausgabe von Bufferinformationen in der Ausgabe des Planes. Dies enthält u.a. Informationen über Bufferhits (Treffer im Shared Buffer Pool). Voraussetzung hierfür ist das gleichzeitige Aktivieren des Parameters log_analyze.

Anwendungsbeispiel

Im folgenden betrachten wir ein wegen der Übersichtlichkeit ein stark vereinfachtes Anwendungsbeispiel. In einer Datenbank gibt es seit kurzem ein Geschwindigkeitsproblem mit einer Funktion, die plötzlich stark variierende Ausführungszeiten aufweist. Die Funktion wird vielfältig eingesetzt, da sie bestimmte ID-Nummern einem Datum zuordnet. Die Definition dieser Funktion sei wie folgt:

CREATE OR REPLACE FUNCTION get_test_datum_ids(p_datum timestamp) 
RETURNS SETOF integer 
STABLE 
LANGUAGE plpgsql
AS 
$$ 
DECLARE 
   v_id int; 
BEGIN 
   FOR v_id IN SELECT * FROM test WHERE datum < p_datum 
   LOOP 
      RETURN 
         NEXT v_id; 
   END LOOP; 

   RETURN; 
END; 
$$;

Geübte PostgreSQL-Anwender werden schnell bemerken, dass diese Funktion deutlich effizienter implementiert werden kann, für dieses Beispiel jedoch ist eine derartige Implementierung gut geeignet. Der Administrator kann nun über log_min_duration_statement langsame Funktionsaufrufe zwar protokollieren, muss jedoch um dem Geschwindigkeitsproblem auf den Grund zu gehen, u.U. auf das System übertragen oder von Hand ausführen. Bei näherer Betrachtungsweise entsteht dann der Verdacht, dass die Schleife und die dort enthaltene Abfrage suboptimal sein könnte. Üblicherweise wird dann die Abfrage mit EXPLAIN geprüft:

#= \timing on
#= EXPLAIN ANALYZE SELECT id FROM test WHERE datum < '01.02.2008'::timestamp;
                                                       QUERY PLAN                                                        
-------------------------------------------------------------------------------------------------------------------------
 Bitmap Heap Scan on test  (cost=4.50..16.90 rows=32 width=4) (actual time=0.039..0.054 rows=31 loops=1)
   Recheck Cond: (datum < '2008-02-01 00:00:00'::timestamp without time zone)
   ->  Bitmap Index Scan on test_datum_idx  (cost=0.00..4.49 rows=32 width=0) (actual time=0.025..0.025 rows=31 loops=1)
         Index Cond: (datum < '2008-02-01 00:00:00'::timestamp without time zone)
 Total runtime: 0.114 ms
(5 rows)

Insofern nichts Verdächtiges, die Abfrage nutzt einen vorhandenen Index auf dem Feld datum. Mit auto_explain können wir nun jedoch ebenfalls direkt die Pläne aus dem Funktionskörper heraus prüfen:

#= SET auto_explain.log_analyze TO on;
SET
#= SET auto_explain.log_nested_statements TO on;
SET
#= SET auto_explain.log_min_duration TO '0ms';
SET
#= SELECT get_test_datum_ids('01.02.2008'::timestamp);

Durch das Setzen von auto_explain.log_analyze TO on wird die Funktion tatsächlich ausgeführt und alle Timingparameter erfasst. Nach dem Ausführen sollten sich folgende Zeilen auf STDOUT, im Logfile oder syslog finden, je nach dem was für ein log_destination verwendet wird:

LOG:  duration: 0.616 ms  plan:
	Query Text: SELECT * FROM test WHERE datum < p_datum
	Seq Scan on test  (cost=0.00..25.70 rows=365 width=12) (actual time=0.424..0.597 rows=31 loops=1)
	  Filter: (datum < $1)
ZUSAMMENHANG:  PL/pgSQL function "get_test_datum_ids" line 1 at FOR über SELECT-Zeilen

Dieser Plan sieht schon deutlich anders aus. Zwar ist die Ausführungsgeschwindigkeit aufgrund der in diesem Beispiel recht kleinen Datenmengen noch überschaubar, jedoch kann man sich jetzt schon vorstellen, dass bei einer größeren Datenmenge dieser Plan schnell ineffizient werden kann. Doch warum wird an dieser Stelle ein anderer Plan verwendet?

Des Rätsels Lösung liegt an der parametrisierten Form dieser Abfrage, die in der FOR-Schleife verwendet wird. Der Optimizer kann nur einen generischen Plan für diese Art der WHERE-Bedingung erzeugen. Da der Offset für den Bereich innerhalb der Bedingung nicht zur Planungszeit zur Verfügung steht, muss der Optimizer den Plan auf einem möglichst allgemeingültigen Kostenmodell berechnen, der effizient für jeden Wert in der WHERE-Bedingung ist.

Konfiguration über postgresql.conf

auto_explain lässt sich auch global über die postgresql.conf konfigurieren. Möchte man als DBA beispielsweise das Modul auf jeden Fall für jede Datenbankverbindung laden, so benötigt man einen entsprechend konfigurierten Parameter shared_preload_libraries in der postgresql.conf (diese befindet sich in der Regel im Datenbankverzeichnis ihrer PostgreSQL-Installation, kann aber bei einigen Distributionen abweichen):

## globales Aktivieren von auto_explain
shared_preload_libraries = 'auto_explain'

Dies lädt das Modul bereits beim Start für jede Datenbankverbindung. Da PostgreSQL noch nicht die Konfigurationsparameter beim Laden der Konfigurationsdatei kennt, muss dies noch zusätzlich über den Parameter custom_variable_classes dem Server bekannt gemacht werden:

custom_variable_classes = 'auto_explain'

Nun kann in der Datei postgresql.conf der Parameter global konfiguriert werden, wie an folgendem Listing beispielhaft gezeigt:

auto_explain.log_min_duration = '30s'
auto_explain.log_format = 'xml'

Zusammenfassung

auto_explain ist ein nützliches Tool, um Geschwindigkeitsproblemen innerhalb der Datenbank anhand der EXPLAIN-Ausgaben auf den Grund zu gehen. Als wertvoll stellt sich die Möglichkeit heraus, eingebettete Abfragen innerhalb von SQL- oder PL/pgsql-Prozeduren mitprotokollieren zu können, um so auch die Abfragen im entsprechenden Kontext auf Fehler oder unterschiedliche Pläne hin untersuchen zu können.
auto_explain eignet sich jedoch nicht, um dauerhaft auf produktiven Datenbankmaschinen eingeschaltet zu sein, hierfür ist der zusätzliche Aufwand für das Ausschreiben der Pläne zu groß. Insofern sollte auf jeden Fall Gebrauch von auto_explain.log_min_duration gemacht werden, so dass wirklich nur sehr problematische Abfragen bei Überschreiten einer bestimmten Zeitschwelle protokolliert werden. Auch sollte dann auf produktiven Maschinen auf jeden Fall auto_explain.log_analyze deaktiviert sein, da dies auch Abfragen, die noch unterhalb der Zeitschwelle von auto_explain.log_min_duration liegen, negativ beeinflusst.

Die US-Abteilung von credativ ist mit dem auf Forst-Ressourcen-Management spazialisierten Unternehmen Forest Informatics eine Partnerschaft eingegangen. Zusammen bieten die beiden Unternehmen Training und Support für die Verarbeitung von Geodaten mit Hilfe von Open-Source-Software an.


Forest Informatics bietet Lösungen rund um die Verwaltung von forstwirtschaftlichen Gebieten mit Hilfe von Geodaten an. Ein Schwerpunkt liegt dabei auf der Offenheit der eingesetzten Lösungen: bewusst wird den Kunden von proprietären Lösungen abgeraten, die Vorteile von Open Source werden klar wahr genommen und vermittelt. Dieser Ansatz versteht sich exzellent mit der Perspektive credativs: als Open-Source-Unternehmen kennen wir nicht nur die Vorteile von Open Source, wir vermitteln sie aktiv an unsere Kunden weiter und stehen für die Vorteile und Ideale dahinter ein.

Auf Grund dieser Gemeinsamkeiten haben sich beide Unternehmen dazu entschlossen, eine Partnerschaft einzugehen, und Kunden gemeinsam Open-Source-Lösungen und -Schulungen für GIS und Forst-Ressourcen-Management anzubieten. Die Themenschwerpunkte sind dabei PostgreSQL, PostGIS, R, und PL/R.

Zur Einführung wird es im September einen dreitägigen Kurs Intro to PostgreSQL with Spatial Analysis Extensions in San Diego geben. Den Kursteilnehmern werden dabei sowohl Datenbank-Grundlagen anhand von PostgreSQL näher gebracht, also auch Geodaten-Management mit Hilfe von PostGIS und die Prinzipien der Datenverarbeitung mit Hilfe von PL/R und R erlernen können.

Wir von credativ freuen uns über diesen neuen Partner, und wünschen von Deutschland aus alles Gute auf die andere Seite des Atlantiks!

Mehr über credativs Open-Source-Angebote erfahrt Ihr auf unserer Webseite. Wir freuen uns aber auch gerne über Kommentare und Fragen hier auf dem Blog oder über unser Kontakt-Formular.

PostgreSQL 9.0beta2

| Keine Kommentare

postgreslogo.png
Vor einigen Tagen wurde eine weitere Betaversion von PostgreSQL 9.0 veröffentlicht, die unter anderem Syntax-Änderungen und pg_upgrade mit sich bringt.


Die Fertigstellung der neuen PostgreSQL-Version 9.0 schreitet voran, es wurden einige wichtige Änderungen gegenüber der Beta1 vorgenommen:

  • Die Syntax für benannte Parameter in Funktionen wurde geändert. Statt CREATE FUNCTION f(expression AS parameter_name, ...) wird nun CREATE FUNCTION f(parameter_name := expression, ...) verwandt. Grund hierfür ist insbesondere eine vorbereitende Maßnahme auf den Entwurf des kommenden SQL Standard 2011. Dieser sieht für die Zuweisung die Syntax CREATE FUNCTION f(parameter_name => value, ...) vor, jedoch kann PostgreSQL nicht ohne weiteres => adaptieren, da beliebige Operatoren diesen Bezeichner annehmen können (siehe auch die CREATE OPERATOR Syntax). Da der SQL Standard 2011 sich noch in der Entwurfsphase befindet, und die Anpassung hierfür aufwändig ist sowie einige heftige Inkompatibilitäten nach sich ziehen würde, wurde entschieden, vorerst eine möglichst ähnliche Syntax zu implementieren.
  • pg_upgrade für Migrationen ohne Dump/Restore auf PostgreSQL 9.0 wurde in den contrib-Zweig des Quelltextbaumes aufgenommen. pg_upgrade erlaubt die Konvertierung eines binärkompatiblen Datenbankclusters ab Version 8.3.
  • Sicherheitsrelevante Fixes, siehe hierzu auch die Veröffentlichungen der Updates für 8.4.4, 8.3.11, 8.2.17, 8.1.21, 8.0.27 und 7.4.29
  • Bug Fixes nach Reports von Betatestern, aber auch wichtige Korrekturen für Hot Standby und Streaming Replication

Wie immer sind alle Interessierten aufgefordert, ihre Testergebnisse und -Eindrücke den Entwicklern mitzuteilen. Informationen für das Vorgehen für Tests und Erstellen von Fehlerberichten können im Wiki eingesehen werden.

Alle Blog-Artikel zum Thema PostgreSQL werden auch als Kategorie PostgreSQL samt eigenem Feed angeboten. Wir helfen auch gerne mit Support und Services für PostgreSQL.