<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>de.credativ-Blog: Kategorie PostgreSQL</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/" />
    <link rel="self" type="application/atom+xml" href="http://blog.credativ.com/de/atom.xml" />
    <id>tag:blog.credativ.com,2010-03-05:/de//1</id>
    <updated>2011-04-26T14:50:44Z</updated>
    <subtitle>All about Linux and Open Source</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.34-en</generator>

<entry>
    <title>VACUUM FULL - Viel hilft viel?</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/2011/04/postgresql-vs-vacuum-full.html" />
    <id>tag:blog.credativ.com,2011:/de//1.198</id>

    <published>2011-04-26T13:00:00Z</published>
    <updated>2011-04-26T14:50:44Z</updated>

    <summary> 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...</summary>
    <author>
        <name>Bernd Helmle</name>
        
    </author>
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="postgresql" label="PostgreSQL" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://blog.credativ.com/de/">
        <![CDATA[<p><img alt="postgreslogo.png" src="/de/static/postgreslogo.png" width="97" height="100" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /></p>

<p><em><br />
<a href="http://www.postgresql.org/docs/9.0/static/sql-vacuum.html">VACUUM</a> 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.<br />
</em></p>

<h2>VACUUM - Der Staubsauger</h2>

<p>Seit der <a href="http://www.postgresql.org/docs/9.0/static/release-6-5.html">Einführung von MVCC</a> (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.</p>

<h2>VACUUM FULL - Vorbeugende Reorganisation?</h2>

<p>Viele Administratoren sind daher der Auffassung, dass es aus diesem Grund angebracht ist, dies im Vorfeld durch nächtliche <a href="http://www.postgresql.org/docs/9.0/interactive/sql-vacuum.html">VACUUM FULL</a> Jobs dem Anwachsen der Tabelle vorzubeugen. Dies ist eine schlechte Strategie, aus mehreren Gründen:</p>

<ol>
	<li>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).</li>
        <li>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.</li>
        <li>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.
        <li>Man benötigt auf jeden Fall ein Wartungsfenster für exklusiven Zugriff der Tabellen.</li>
        <li>Im Gegensatz zu normalen VACUUM ist VACUUM FULL daher nicht für den Einsatz in 24/7-Datenbanken geeignet.
</ol>

<p>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:</p>

<ol>
	<li>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).</li>
        <li>Sind Indexe auf der Tabelle vorhanden, so müssen diese ebenfalls aktualisiert werden.</li>
        <li>Ist das Array abgearbeitet, beginnt der Algorithmus wieder von vorne, solange, bis das Ende der Tabelle erreicht ist.
        <li>Anschließend wird die Tabelle physisch verkleinert. 
</ol>

<p>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 <em>Index Bloat</em>. Daher kann es erforderlich sein, direkt nach dem VACUUM FULL ein <a href="http://www.postgresql.org/docs/9.0/interactive/sql-reindex.html">REINDEX</a> 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.</p>

<p>Ab PostgreSQL 9.0 verhält sich VACUUM FULL wie das <a href="http://www.postgresql.org/docs/9.0/static/sql-cluster.html">CLUSTER</a> 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.</p>

<h2>VACUUM und Autovacuum für tägliche oder sehr granulare Wartung</h2>

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

<ol>
	<li>Wer sich eine sorgfältige VACUUM-Policy mit normalem VACUUM oder, noch besser, Autovacuum zurechtlegt, benötigt kein VACUUM FULL.</li>
        <li>Autovacuum sollte auf jeden Fall in Betracht gezogen werden, muss jedoch an den Workload angepasst werden.</li>
        <li>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.</li>
        <li>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.
       <li>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.</li>
</ol>

<h2>Warum dann überhaupt noch VACUUM FULL?</h2>

<p>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 <a href="http://wiki.postgresql.org/wiki/VACUUM_FULL">PostgreSQL Wiki</a>.</p>]]>
        
    </content>
</entry>

<entry>
    <title>credativ beim PGDay Europe 2010</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/2011/01/credativ-beim-pgday-europe-2010.html" />
    <id>tag:blog.credativ.com,2011:/de//1.196</id>

    <published>2011-01-17T10:53:43Z</published>
    <updated>2011-01-25T09:38:07Z</updated>

    <summary> 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...</summary>
    <author>
        <name>Michael Banck</name>
        
    </author>
    
        <category term="Open Source" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="credativ" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="pgdayeurope" label="PGDay Europe" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="postgresql" label="PostgreSQL" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://blog.credativ.com/de/">
        <![CDATA[<p><img alt="postgreslogo.png" src="/de/static/postgreslogo.png" width="97" height="100" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /><br />
<em>Letzten Monat fand die alljährliche europäische <a href="http://2010.pgday.eu">PostgreSQL-Konferenz</a> in Stuttgart statt. Die credativ GmbH war nicht nur <a href="http://2010.pgday.eu/sponsors">Sponsor</a> der Veranstaltung, sondern auch mit vier Mitarbeitern vor Ort, welche mehrere Vorträge gehalten haben. Die Folien der Vorträge sind nun verfügbar.</em><br />
<p><br />
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.<br />
<p></p>

<p>
Die Vorträge von credativ waren im einzelnen:
<p>
<ul>
<li><a
href="http://www.postgresql.eu/events/schedule/pgday2010/session/68-migration-auf-freie-software-in-unternehmenskritischen-bereichen-unter-besonderer-betrachtung-von-postgresql/">
"Migration auf Freie Software in unternehmenskritischen Bereichen"</a> 
(<a
href="http://wiki.postgresql.org/images/a/a8/Pgday2010-migration.pdf">Folien</a>)
<p>
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.  
<p>
<li><a
href="http://www.postgresql.eu/events/schedule/pgday2010/session/76-embedded-sql-fur-postgresql/">
"Embedded SQL für PostgreSQL"</a> 
(<a href="http://wiki.postgresql.org/images/e/e0/Pgday2010-ecpg.pdf">Folien</a>)
<p>
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.
<p>
<li><a
href="http://www.postgresql.eu/events/schedule/pgday2010/session/64-die-postgresql-community/">
"Die PostgreSQL Community"</a> 
(<a href="http://wiki.postgresql.org/images/7/74/Pg-community.pdf">Folien</a>)
<p>
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.  
<p>
<li><a
href="http://www.postgresql.eu/events/schedule/pgday2010/session/59-advanced-analytics-with-plr/">
"Advanced Analytics with PL/R"</a>
(<a
href="http://wiki.postgresql.org/images/8/84/PLR-PGDay.EU-2010.pdf">Folien</a>)
<p>
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).
</ul>
<p>
Das nächste PostgreSQL-Event der credativ GmbH ist die <a href="http://www.linuxhotel.de/kurs/postgresql/">Schulung</a> im <a href="http://www.linuxhotel.de/">Linux-Hotel</a> vom 23. bis 25. Februar 2011.]]>
        
    </content>
</entry>

<entry>
    <title>PGDay Europe 2010 in Stuttgart</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/2010/10/pgday-europe-2010-in-stuttgart.html" />
    <id>tag:blog.credativ.com,2010:/de//1.194</id>

    <published>2010-10-26T08:00:00Z</published>
    <updated>2010-10-26T08:12:01Z</updated>

    <summary> 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...</summary>
    <author>
        <name>Bernd Helmle</name>
        
    </author>
    
        <category term="Open Source" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="credativ" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="pgdayeurope" label="PGDay Europe" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="postgresql" label="PostgreSQL" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://blog.credativ.com/de/">
        <![CDATA[<p><img src="http://2010.pgday.eu/_media/pgdayeu10.small_banner.en.png" class="mt-image-right" width="120" height="60"></p>

<p><em><br />
Die <a href="http://www.postgresql.eu/">PostgreSQL Europe Community </a> wird dieses Jahr ihren jährlichen <a href="http://2010.pgday.eu/">Kongress</a> in Stuttgart abhalten. Das umfangreiche <a href="https://www.postgresql.eu/events/schedule/pgday2010/">Vortragsprogramm</a> umfasst vielfältige Themen rund um PostgreSQL, darunter Vorträge aus den Gebieten GIS, Entwicklung, Hochverfügbarkeit und vieles mehr. <br />
</em></p>

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

<ul>
	<li><a href="https://www.postgresql.eu/events/schedule/pgday2010/session/64-die-postgresql-community/">Community</a></li>
        <li><a href="https://www.postgresql.eu/events/schedule/pgday2010/session/68-migration-auf-freie-software-in-unternehmenskritischen-bereichen-unter-besonderer-betrachtung-von-postgresql/">Migration auf freie Software in unternehmenskritischen Bereichen</a></li>
        <li><a href="https://www.postgresql.eu/events/schedule/pgday2010/session/59-advanced-analytics-with-plr/">Datenanalyse mit PL/R</a></li>
        <li><a href="https://www.postgresql.eu/events/schedule/pgday2010/session/76-embedded-sql-fur-postgresql/">Embedded SQL (ecpg)</a></li>
</ul>

<p>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 <a href="http://2010.pgday.eu/venue">Seite</a> des Kongresses abgerufen werden.<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>PostgreSQL 9.0 veröffentlicht</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/2010/09/postgresql-90-veroffentlicht.html" />
    <id>tag:blog.credativ.com,2010:/de//1.193</id>

    <published>2010-09-20T13:39:20Z</published>
    <updated>2010-09-20T14:09:53Z</updated>

    <summary> 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...</summary>
    <author>
        <name>Bernd Helmle</name>
        
    </author>
    
        <category term="Open Source" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="de" xml:base="http://blog.credativ.com/de/">
        <![CDATA[<p><img alt="postgreslogo.png" src="/de/static/postgreslogo.png" width="97" height="100" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /></p>

<p><em><br />
Die PostgreSQL Community hat heute die<a href="http://www.postgresql.org/about/news.1235"> Veröffentlichung</a> der stabilen Version 9.0.0 bekanntgegeben. <br />
</em><br />
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:</p>

<ul>
	<li><a href="http://blog.credativ.com/de/2010/03/postgresql-optimizer-bits-join-removal.html">JOIN Removal</a></li>
        <li>Unterstützung für 64 Bit Windows</li>
        <li>Trigger mit Bedingungen</li>
        <li>Spaltenbasierte Trigger</li>
        <li>Anonyme Prozedurale Codeblöcke mit DO</li>
        <li>Verbessertes Nachrichtensystem mit LISTEN/NOTIFY</li>
</ul>

<p>Weitergehende Informationen können direkt über die <a href="http://www.postgresql.org/docs/9.0/static/release-9-0.html">Release Notes</a> der PostgreSQL Global Development Group eingesehen werden.</p>]]>
        
    </content>
</entry>

<entry>
    <title>PostgreSQL 9.0 - Entwickler-Sprechstunde bei credativ</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/2010/09/postgresql-90---entwickler-sprechstunde-bei-credativ.html" />
    <id>tag:blog.credativ.com,2010:/de//1.191</id>

    <published>2010-09-16T13:36:27Z</published>
    <updated>2010-09-20T08:09:46Z</updated>

    <summary> 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&quot; an. Mit dieser Aktion ermöglicht credativ eine direkte Kommunikation...</summary>
    <author>
        <name>Bernd Helmle</name>
        
    </author>
    
        <category term="Open Source" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="credativ" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="credativ" label="credativ" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="postgresql" label="PostgreSQL" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://blog.credativ.com/de/">
        <![CDATA[<p><img alt="postgreslogo.png" src="/de/static/postgreslogo.png" width="97" height="100" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /></p>

<p><em><br />
Entwickler-Team beantwortet Fragen zur neuen PostgreSQL Version 9.0.<br />
</em></p>

<p>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.<br />
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.</p>

<p>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.<br />
Als Ansprechpartner aus dem PostgreSQL-Entwicklerteam stellen sich folgende Personen zur Verfügung:</p>

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

<p>Dr. Michael Meskes, Geschäftsführer der credativ GmbH, erklärt dazu: <em>„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."</em></p>

<p>Weitere Informationen können über unsere <a href="http://www.credativ.de/news/2010/09/17/postgresql-90-entwickler-sprechstunde-bei-credativ/">Internetseite</a> eingesehen werden.</p>]]>
        
    </content>
</entry>

<entry>
    <title>PostgreSQL Optimizer Bits: Auto Explain</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/2010/08/postgresql-optimizer-bits-auto-explain.html" />
    <id>tag:blog.credativ.com,2010:/de//1.189</id>

    <published>2010-08-31T09:34:21Z</published>
    <updated>2010-08-31T11:49:36Z</updated>

    <summary> In dieser Folge stellen wir im Rahmen der &quot;Optimizer Bits&quot; 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...</summary>
    <author>
        <name>Bernd Helmle</name>
        
    </author>
    
        <category term="Open Source" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tipp" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="credativ" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="postgresql" label="PostgreSQL" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://blog.credativ.com/de/">
        <![CDATA[<p><img alt="postgreslogo.png" src="/de/static/postgreslogo.png" width="97" height="100" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /><br />
<em>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.</em></p>

<h3>Problemstellung</h3>

<p>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 <br />
</p>
<pre class='brush: text'>log_min_duration_statement = '30s'</pre><p></p>

<p>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. <a href="http://pgfouine.projects.postgresql.org/">pgfouine</a> 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. </p>

<h3>Das Modul auto_explain</h3>

<p>Seit PostgreSQL 8.4 gibt es das contrib-Modul <em>auto_explain</em>, 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. <em>auto_explain</em> kann permanent oder nur zur Fehlersuche in die Datenbank geladen werden.</p>

<p>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):<br />
</p>
<pre class='brush: plain'>
$ cd &lt;QUELLTEXT&gt;
$ cd contrib/auto_explain
</pre><p></p>

<p>Je nachdem. ob bereits PostgreSQL komplett gebaut wurde (in der Regel hat man dann ja noch alle benötigten Sourcen), kann man dann <em>auto_explain</em> zusätzlich bauen:<br />
</p>
<pre class='brush: plain'>
$ make install
</pre><p></p>

<p>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:<br />
</p>
<pre class='brush: plain'>
$ USE_PGXS=1 make install
</pre><p></p>

<p>Dies erfordert jedoch mindestens die Präsenz des Tools <em>pg_config</em> im Pfad der aktuellen Umgebung.<br />
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:<br />
</p>
<pre class='brush: sql'>
$ psql -U &lt;superuser&gt; &lt;dbname&gt;
#= LOAD 'auto_explain';
LOAD
</pre><p></p>

<p>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 <em>auto_explain</em> abgefragt werden:<br />
</p>
<pre class='brush: sql'>
#= SELECT name, setting FROM pg_settings WHERE name LIKE 'auto_explain%';
</pre><p></p>

<p>Dies sollte folgende Liste liefern:<br />
</p>
<pre class='brush: plain'>
                 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)
</pre><p></p>

<p>Der wichtigste Parameter hier ist</p> <pre class='brush: plain'>auto_explain.log_min_duration</pre><p> Dieser aktiviert (Werte ab 0ms) oder deaktiviert (Wert -1) das Protokollieren von Abfrageplänen. Die weiteren Einstellungen sind im Einzelnen:</p>

<ul>
	<li><em>auto_explain.log_analyze = true|false</em>: Aktiviert oder deaktiviert das Loggen von EXPLAIN ANALYZE. Dies bedeutet das Timinginformationen <strong>aller</strong> Abfragen erfasst werden (auch diejenigen, die schneller ausgeführt werden als <em>auto_explain.log_min_duration</em>). Dies hat einen signifikanten Einfluss auf die Ausführungsgeschwindigkeit und sollte mit Bedacht gewählt werden.</li>
        <li><em>auto_explain.log_verbose = true|false</em>: Ausgabeformat mit zusätzlichen Informationen für EXPLAIN.</li>
        <li><em>auto_explain.log_nested_statements = true|on</em>: 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.</li>

</ul>

<p>Mit PostgreSQL 9.0 kommen zwei weitere Konfigurationsmöglichkeiten hinzu:</p>

<ul>
	<li><em>auto_explain.log_format = 'text'|'xml'|'json'|'yaml'</em>: Ermöglicht die Ausgabe der Abfragepläne im XML, JSON, oder YAML Format. <em>text</em> entspricht dem Standardformat.</li>
        <li><em>auto_explain.log_buffers = true|false</em>: 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 <em>log_analyze</em>.</li>
</ul>

<h3>Anwendungsbeispiel</h3>

<p>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:<br />
</p>
<pre class='brush: sql'>
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 &lt; p_datum 
   LOOP 
      RETURN 
         NEXT v_id; 
   END LOOP; 

   RETURN; 
END; 
$$;
</pre><p></p>

<p>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 <em>log_min_duration_statement</em> 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:<br />
</p>
<pre class='brush: sql'>
#= \timing on
#= EXPLAIN ANALYZE SELECT id FROM test WHERE datum &lt; '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 &lt; '2008-02-01 00:00:00'::timestamp without time zone)
   -&gt;  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 &lt; '2008-02-01 00:00:00'::timestamp without time zone)
 Total runtime: 0.114 ms
(5 rows)
</pre><p></p>

<p>Insofern nichts Verdächtiges, die Abfrage nutzt einen vorhandenen Index auf dem Feld <em>datum</em>. Mit <em>auto_explain</em> können wir nun jedoch ebenfalls direkt die Pläne aus dem Funktionskörper heraus prüfen:<br />
</p>
<pre class='brush: sql'>
#= 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);
</pre><p></p>

<p>Durch das Setzen von <em>auto_explain.log_analyze TO on</em> wird die Funktion tatsächlich ausgeführt und alle Timingparameter erfasst. Nach dem Ausführen sollten sich folgende Zeilen auf STDOUT, im Logfile oder <em>syslog</em> finden, je nach dem was für ein <em>log_destination</em> verwendet wird:<br />
</p>
<pre class='brush: plain'>
LOG:  duration: 0.616 ms  plan:
	Query Text: SELECT * FROM test WHERE datum &lt; 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 &lt; $1)
ZUSAMMENHANG:  PL/pgSQL function &quot;get_test_datum_ids&quot; line 1 at FOR über SELECT-Zeilen
</pre><p></p>

<p>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?</p>

<p>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 <strong>WHERE</strong>-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 <strong>WHERE</strong>-Bedingung ist.</p>

<h3>Konfiguration über postgresql.conf</h3>

<p><em>auto_explain</em> 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 <em>shared_preload_libraries</em> in der postgresql.conf (diese befindet sich in der Regel im Datenbankverzeichnis ihrer PostgreSQL-Installation, kann aber bei einigen Distributionen abweichen):<br />
</p>
<pre class='brush: plain'>
## globales Aktivieren von auto_explain
shared_preload_libraries = 'auto_explain'
</pre><p></p>

<p>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 <em>custom_variable_classes</em> dem Server bekannt gemacht werden:<br />
</p>
<pre class='brush: plain'>
custom_variable_classes = 'auto_explain'
</pre><p></p>

<p>Nun kann in der Datei <em>postgresql.conf</em> der Parameter global konfiguriert werden, wie an folgendem Listing beispielhaft gezeigt:<br />
</p>
<pre class='brush: plain'>
auto_explain.log_min_duration = '30s'
auto_explain.log_format = 'xml'
</pre><p></p>

<h3>Zusammenfassung</h3>

<p><em>auto_explain</em> 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.  <br />
<em>auto_explain</em> 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 <em>auto_explain.log_min_duration</em> 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 <em>auto_explain.log_analyze</em> deaktiviert sein, da dies auch Abfragen, die noch unterhalb der Zeitschwelle von <em>auto_explain.log_min_duration</em> liegen, negativ beeinflusst.</p>]]>
        
    </content>
</entry>

<entry>
    <title>credativ US und Forest Informatics vereinbaren Partnerschaft</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/2010/06/credativ-us-und-forest-informatics-vereinbaren-partnerschaft.html" />
    <id>tag:blog.credativ.com,2010:/de//1.167</id>

    <published>2010-06-17T10:37:58Z</published>
    <updated>2010-06-17T10:40:26Z</updated>

    <summary>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...</summary>
    <author>
        <name>Roland Wolters</name>
        <uri>http://www.credativ.de</uri>
    </author>
    
        <category term="News" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Open Source" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Support" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="credativ" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="de" xml:base="http://blog.credativ.com/de/">
        <![CDATA[<p><em>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.</em><br />
<br /><br />
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.</p>

<p>Auf Grund dieser Gemeinsamkeiten haben sich beide Unternehmen dazu entschlossen, <a href="http://www.prweb.com/releases/2010/06/prweb4125794.htm">eine Partnerschaft einzugehen</a>, 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.</p>

<p>Zur Einführung wird es im September einen dreitägigen Kurs <a href="http://www.credativ.us/pg_w_spatial/">Intro to PostgreSQL with Spatial Analysis Extensions</a> 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.</p>

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

<p>Mehr über credativs <a href="http://www.credativ.de/home/open-source-support-center/unser-support-angebot/">Open-Source-Angebote</a> erfahrt Ihr auf unserer Webseite. Wir freuen uns aber auch gerne über Kommentare und Fragen hier auf dem Blog oder über unser <a href="http://www.credativ.de/home/uber-credativ/kontakt/">Kontakt-Formular</a>.</p>]]>
        
    </content>
</entry>

<entry>
    <title>PostgreSQL 9.0beta2</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/2010/06/postgresql-90beta2.html" />
    <id>tag:blog.credativ.com,2010:/de//1.166</id>

    <published>2010-06-10T10:40:56Z</published>
    <updated>2010-06-10T22:04:15Z</updated>

    <summary> 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...</summary>
    <author>
        <name>Bernd Helmle</name>
        
    </author>
    
        <category term="News" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Open Source" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="postgresql" label="PostgreSQL" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://blog.credativ.com/de/">
        <![CDATA[<p><img alt="postgreslogo.png" src="/de/static/postgreslogo.png" width="97" height="100" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /><br />
<em>Vor einigen Tagen wurde eine weitere Betaversion von PostgreSQL 9.0 veröffentlicht, die unter anderem Syntax-Änderungen und pg_upgrade mit sich bringt.</em><br />
<br /><br />
Die Fertigstellung der neuen PostgreSQL-Version 9.0 schreitet voran, es wurden einige wichtige Änderungen gegenüber der Beta1 vorgenommen:</p>

<ul>
	<li>Die Syntax für benannte Parameter in Funktionen wurde geändert. Statt <code>CREATE FUNCTION f(expression AS parameter_name, ...)</code> wird nun <code>CREATE FUNCTION f(parameter_name := expression, ...)</code> verwandt. Grund hierfür ist insbesondere eine <a href="http://archives.postgresql.org/pgsql-hackers/2010-05/msg01501.php">vorbereitende Maßnahme</a> auf den Entwurf des kommenden SQL Standard 2011. Dieser sieht für die Zuweisung die Syntax <code>CREATE FUNCTION f(parameter_name => value, ...)</code> vor, jedoch kann PostgreSQL nicht ohne weiteres <em>=></em> adaptieren, da beliebige Operatoren diesen Bezeichner annehmen können (siehe auch die <em><a href="http://www.postgresql.org/docs/9.0/static/sql-createoperator.html">CREATE OPERATOR</a></em> 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.</li>
    <li>pg_upgrade für Migrationen ohne Dump/Restore auf PostgreSQL 9.0 wurde in den <em>contrib</em>-Zweig des Quelltextbaumes aufgenommen. pg_upgrade erlaubt die Konvertierung eines binärkompatiblen Datenbankclusters ab Version 8.3.</li>
    <li>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</li>
    <li>Bug Fixes nach Reports von Betatestern, aber auch wichtige Korrekturen für Hot Standby und Streaming Replication</li>
</ul>

<p>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 <a href="http://wiki.postgresql.org/wiki/HowToBetaTest">Wiki</a> eingesehen werden.</p>

<p>Alle Blog-Artikel zum Thema PostgreSQL werden auch als <a href="/de/postgresql/">Kategorie PostgreSQL</a> samt eigenem Feed angeboten. Wir helfen auch gerne mit <a href="http://www.credativ.de/home/software/softwareubersicht/datenbanken/postgresql_brief/">Support und Services für PostgreSQL</a>.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Gelebtes Open Source - PostgreSQL-Entwickler bei credativ</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/2010/05/gelebtes-open-source---postgresql-entwickler-bei-credativ.html" />
    <id>tag:blog.credativ.com,2010:/de//1.165</id>

    <published>2010-05-25T14:20:26Z</published>
    <updated>2010-05-25T14:15:20Z</updated>

    <summary> Kürzlich wurde eine Statistik veröffentlicht, bei der die einzelnen Committer des PostgreSQL-Projekts aufgelistet wurden. Mit dabei sind mehrere Mitarbeiter von credativ. PostgreSQLs Andrew Dunstan Statistiken hat eine Statistik über die Produktivität der PostgreSQL-Committer veröffentlicht. Darin ist aufgeführt, welche Entwickler...</summary>
    <author>
        <name>Roland Wolters</name>
        <uri>http://www.credativ.de</uri>
    </author>
    
        <category term="News" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Open Source" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="credativ" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="de" xml:base="http://blog.credativ.com/de/">
        <![CDATA[<p><img alt="postgreslogo.png" src="/de/static/postgreslogo.png" width="97" height="100" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /><br />
<em>Kürzlich wurde eine Statistik veröffentlicht, bei der die einzelnen Committer des PostgreSQL-Projekts aufgelistet wurden. Mit dabei sind mehrere Mitarbeiter von credativ.</em><br />
<br /><br />
PostgreSQLs Andrew Dunstan Statistiken hat eine Statistik über die Produktivität der PostgreSQL-Committer <a href="http://people.planetpostgresql.org/andrew/index.php?/archives/79-30,000-commits-and-still-going-strong.html">veröffentlicht</a>. Darin ist aufgeführt, welche Entwickler mit Commit-Rechten wie viele Commits durchgeführt haben. Zwar lässt dies keine Rückschlüsse darauf zu, wie viel Code der jeweilige Entwickler tatsächlich beigesteuert oder wie viel Review-Mühen er sich gemacht hat; aber es es ist ein Indiz dafür, dass sich bestimmte Entwickler viel in das Projekt einbringen.</p>

<p>Die credativ GmbH versteht sich als Teil der Community vieler Open-Source-Projekte - so auch bei PostgreSQL. Dass dies ernst gemeint ist und in der Firma gelebt wird, zeigt sich so auch in der von Andrew Dunstan erstellten Statistik: von den aufgeführten Committern arbeiten gleich mehrere in den verschiedenen internationalen Büros von credativ: Michael Meskes, Joe Conway und davec, Dave Cramer. Dabei fehlen aber auch noch die Mitarbeiter von credativ, die selbst viel Code beisteuern, aber keine Commits vornehmen. So ist z.B. Bernd Helmle den Lesern dieses Blogs wegen seiner <a href="http://blog.credativ.com/de/postgresql/">umfangreichen Artikel zu PostgreSQL</a> nicht nur als Autor, sondern auch als Entwickler bestens bekannt, taucht aber in Andrews Statistik nicht auf.</p>

<p>Als Indiz bestätigt die Liste uns aber, dass die Bemühungen der Firma, aber auch die Verbundenheit unserer Mitarbeiter mit Open Source Früchte trägt. Wenn Ihr mehr über unser Open-Source-Engagement wissen wollt, hinterlasst einfach einen Kommentar. Falls Ihr euch für unser <a href="http://www.credativ.de/home/open-source-support-center/unser-support-angebot/">Open Source Support Angebot</a> interessiert, gibt es auch noch diverse andere <a href="http://www.credativ.de/home/uber-credativ/kontakt/">Kontaktmöglichkeiten</a>.</p>]]>
        
    </content>
</entry>

<entry>
    <title>PostgreSQL 9.0 ab sofort in Betaphase</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/2010/05/postgresql-90-ab-sofort-in-betaphase.html" />
    <id>tag:blog.credativ.com,2010:/de//1.159</id>

    <published>2010-05-04T08:57:00Z</published>
    <updated>2010-06-10T10:40:59Z</updated>

    <summary> Die PostgreSQL Entwicklergemeinde hat heute die erste Betaversion der kommenden 9.0-Release veröffentlicht. Über 200 neue Funktionen und Verbesserungen werden durch den Sprung auf den 9er-Zweig unterstrichen. Mit dem neuen Release verfügt PostgreSQL unter Anderem nun über eine eingebaute Replikationslösung...</summary>
    <author>
        <name>Bernd Helmle</name>
        
    </author>
    
        <category term="News" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="credativ" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="postgresql" label="PostgreSQL" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://blog.credativ.com/de/">
        <![CDATA[<p><img alt="postgreslogo.png" src="/de/static/postgreslogo.png" width="97" height="100" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /><br />
<em>Die PostgreSQL Entwicklergemeinde hat heute die erste Betaversion der kommenden 9.0-Release veröffentlicht. Über 200 neue Funktionen und Verbesserungen werden durch den Sprung auf den 9er-Zweig unterstrichen.</em></p>

<p>Mit dem <a href="http://www.postgresql.org/about/news.1198">neuen Release</a> verfügt PostgreSQL unter Anderem nun über eine eingebaute Replikationslösung sowie die Fähigkeit, lesend auf Standby-Knoten zuzugreifen, die über <a href="http://www.postgresql.org/docs/8.4/static/warm-standby.html">Log-Shipping </a> kontinuierlich aktualisiert werden (Hot Standby). Streaming Replication gestattet das Senden von Transaktionsinformationen direkt an einen oder mehrere Standby-Knoten, was den Zeitverlust gegenüber herkömmlichen, dateibasiertem Log-Shipping erheblich reduziert. In Kombination stellen beide Funktionen eine äußerst leistungsfähige Lösung für hochverfügbare oder leistungsverteilte Systeme dar.</p>

<p>Des weiteren bietet die neue PostgreSQL-Version weitere Neuerungen:</p>

<ul>
	<li>Hauptspeicherbasiertes <strong>LISTEN/NOTIFY</strong>; dies löst die bisherige Tabellenbasierte Implementierung mit deutlicher Geschwindigkeitssteigerung ab.</li>
        <li><strong>Exclusion Constraints</strong>, erweitert Constraints um die Fähigkeit, übergreifende Einschränkungen über komplexe Datentypen hinweg zu definieren</li>
        <li>Prozeduraler Code wie PL/pgSQL, PL/Perl und PL/Python kann nun inline per <strong>DO</strong>-Befehl ausgeführt</li> werden. Damit entfällt das vorher notwendige definieren einer Prozedur bzw. Funktion mit <strong>CREATE FUNCTION</strong>
        <li>Trigger auf Spaltenebene</li>
        <li>Trigger können nun ebenfalls an Bedingungen geknüpft werden</li>
        <li>Benannte Argumentlisten für Prozeduren</li>
        <li>Parameter können nun flexibel an Rollen/Datenbanken geknüpft werden</li>
</ul>

<p>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 <a href="http://wiki.postgresql.org/wiki/HowToBetaTest">Wiki</a> eingesehen werden.</p>

<p>Alle Blog-Artikel zum Thema PostgreSQL werden auch als <a href="/de/postgresql/">Kategorie PostgreSQL</a> samt eigenem Feed angeboten - und falls ihr nach <a href="http://www.credativ.de/home/software/softwareubersicht/datenbanken/postgresql_brief/">Support und Services für PostgreSQL</a> sucht, seit ihr bei uns ebenfalls richtig.</p>]]>
        
    </content>
</entry>

<entry>
    <title>PostgreSQL Release Updates</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/2010/03/postgresql-release-updates.html" />
    <id>tag:blog.credativ.com,2010:/de//1.154</id>

    <published>2010-03-25T12:49:43Z</published>
    <updated>2010-03-29T11:35:35Z</updated>

    <summary> Die PostgreSQL-Entwickler haben die aktuellen stabilen Versionszweige 8.4, 8.2, 8.1, 8.0 und 7.4 mit neuen Updates versorgt. Die PostgreSQL Community hat neue Versionen der aktuellen stabilen Zweige veröffentlicht. Dies aktualisiert diese auf die Versionen 8.4.3, 8.3.10, 8.2.16, 8.1.20 und...</summary>
    <author>
        <name>Bernd Helmle</name>
        
    </author>
    
        <category term="Open Source" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Security" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="postgresql" label="PostgreSQL" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://blog.credativ.com/de/">
        <![CDATA[<p><img alt="postgreslogo.png" src="/de/static/postgreslogo.png" width="97" height="100" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /><br />
<em>Die PostgreSQL-Entwickler haben die aktuellen stabilen Versionszweige 8.4, 8.2, 8.1, 8.0 und 7.4 mit neuen Updates versorgt.</em></p>

<p>Die <a href="http://www.postgresql.org">PostgreSQL Community</a> hat neue Versionen der aktuellen stabilen Zweige veröffentlicht. Dies aktualisiert diese auf die Versionen 8.4.3, 8.3.10, 8.2.16, 8.1.20 und 8.0.24 sowie 7.4.28.</p>

<p>Upgrades können ohne Dump/Restore der Datenbanken innerhalb eines Zweiges durchgeführt werden. Neben einigen kleineren Fehlerkorrekturen beheben diese Aktualisierungen unter anderem:</p>

<ul>
	<li>Neuer Konfigurationsparameter <em><a href="http://www.postgresql.org/docs/8.4/interactive/runtime-config-connection.html">ssl_renegotiation_limit</a></em>. Dies erlaubt das Setzen der Menge an Daten, die über eine Datenbankverbindung übertragen werden darf, bevor die SSL-Verbindung neu ausgehandelt wird. Einige ältere OpenSSL-Versionen können einen Fix für das Sicherheitsleck (<a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-3555">CVE-2009-3555</a>) enthalten, die in diesem Fall zu Abbrüchen der Datenbankverbindung führen können, so dass dies mit Setzen des Parameters auf 0 abgeschaltet werden kann.</li>
        <li>Beheben eines Deadlocks bei Neustart des Datenbankserver</li>
        <li>Bessere Fehlerbehandlung bei Neuladen des Relcache</li>
        <li>Abstürze beim Recovern von Subtransaktionen wurden behoben</li>
        <li>Fix für mögliche Indexkorrumpierung bei GiST-Indexe, sowie Datenverlust bei GIN-Indexe</li>
</ul>

<p>Es wird empfohlen, beim nächsten Wartungsfenster auf die neueste jeweilige Minor-Version des eingesetzten stabilen Zweiges zu wechseln. Detaillierte Informationen über die einzelnen Fixes können über die <a href="http://www.postgresql.org/about/news.1188">Releasenotes</a> der Projektseite eingesehen werden.</p>

<p>Alle Blog-Artikel zum Thema PostgreSQL werden auch als <a href="/de/postgresql/">Kategorie PostgreSQL</a> samt eigenem Feed angeboten - und falls ihr nach <a href="http://www.credativ.de/home/software/softwareubersicht/datenbanken/postgresql_brief/">Support und Services für PostgreSQL</a> sucht, seit ihr bei uns ebenfalls richtig.</p>]]>
        
    </content>
</entry>

<entry>
    <title>[Howto] PostgreSQL und das Linux Memory Management</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/2010/03/postgresql-und-linux-memory-management.html" />
    <id>tag:blog.credativ.com,2010:/de//1.149</id>

    <published>2010-03-22T15:42:00Z</published>
    <updated>2010-03-24T09:09:57Z</updated>

    <summary>Der OOM-Killer kann auf stark ausgelasteten Maschinen für böse Überraschungen sorgen: Prozesse werden plötzlich und unerwartet beendet. Dieses Verhalten lässt sich aber mit Kernel-Bord-Mitteln sehr genau beeinflussen. Administratoren auf Linuxmaschinen mit hoher RAM-Nutzung erleben oft eine Begegnung der unheimlichen Art:...</summary>
    <author>
        <name>Bernd Helmle</name>
        
    </author>
    
        <category term="Howto" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Linux" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Open Source" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="credativ" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="linux" label="Linux" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="postgresql" label="PostgreSQL" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://blog.credativ.com/de/">
        <![CDATA[<p><img alt="postgreslogo.png" src="/de/static/postgreslogo.png" width="97" height="100" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /><em>Der OOM-Killer kann auf stark ausgelasteten Maschinen für böse Überraschungen sorgen: Prozesse werden plötzlich und unerwartet beendet. Dieses Verhalten lässt sich aber mit Kernel-Bord-Mitteln sehr genau beeinflussen.</em></p>

<p>Administratoren auf Linuxmaschinen mit hoher RAM-Nutzung erleben oft eine Begegnung der unheimlichen Art: den Linux <a href="http://linux-mm.org/OOM_Killer">OOM-Killer</a> (OOM = Out Of Memory). Der Administrator findet in diesem Szenario eine "abgestürzte" PostgreSQL-Instanz vor, im Serverlog finden sich dann einer oder meist mehrere Einträge der Form<br />
</p>
<pre class='brush: text'>
Out of Memory: Killed process PID (Prozessname)
</pre><p></p>

<p>Doch was genau steckt dahinter?</p>

<h3>Virtueller Speicher und Overcommit</h3>

<p>Virtueller Speicher in Linuxsystemen wird auf vielfältige Weise adressiert: RAM, mmap(), Swap oder Shared Memory, um ein paar Beispiele zu nennen. Es ist möglich, durch das sogenannte Overcommit-Verhalten bei Allokieren von Speicher mehr Ressourcen anzufordern, als tatsächlich im System aktuell vorhanden ist. In solchen Situationen spricht man von einer OOM-Situation, das System hat alle Ressourcen aufgebraucht und ist nicht mehr in der Lage, mehr virtuellen Speicher zu adressieren. Hier wird der OOM-Killer aktiv, der Prozesse nach festgelegten Kriterien auswählt und diese terminiert, um dem System ein wenig Luft zu verschaffen. Dieses Verhalten ist insbesondere für Datenbanksysteme zu berücksichtigen, die nicht auf dedizierter Hardware laufen. Der OOM-Killer bevorzugt in solchen Umgebungen häufig PostgreSQL, da als Kandidaten zum Terminieren solche Prozesse ausgewählt werden, die mit aggressiver Speichernutzung auffallen. Da der OOM-Killer den gesamten Adressraum aller Kinder inklusive Shared Memory in Summe sieht, erkennt man recht schnell, dass PostgreSQL auf jeden Fall weit oben in der Liste der Kandidaten auftauchen wird.<br />
Wie stark der zur Verfügung stehende Speicher genutzt wird, findet man am schnellsten über das <tt>/proc</tt>-Filesystem heraus:<br />
</p>
<pre class='brush: text'>
$ grep Commit /proc/meminfo 
CommitLimit:    376176 kB
Committed_AS:   265476 kB
</pre><p></p>

<p>In diesem Beispiel sind aktuell als Obergrenze <tt>376176 kB</tt>(<tt>CommitLimit</tt>) an Speichernutzung möglich, zugewiesen wurden <tt>265476 kB</tt> (<tt>Committed_AS</tt>). Nähert sich <tt>CommitLimit</tt> sehr stark an <tt>Committed_AS</tt> an oder übersteigt diesen sogar, dann ist der Einsatz des OOM-Killers wahrscheinlich.</p>

<p>Der Linux-Kernel stellt einige Schnittstellen zur Verfügung, die das Verhalten des OOM-Killers gegenüber PostgreSQL beeinflusst.</p>

<h3>Overcommit abschalten</h3>

<p>Die radikalste Methode ist, Overcommit generell im Kernel abzuschalten. Allerdings kommt dies nur für dedizierte Datenbanksysteme in Frage, auf denen PostgreSQL exklusiv läuft. Das Overcommit-Verhalten lässt sich in modernen 2.6ern Kernel in drei Kategorien mit dem Parameter<br />
</p>
<pre class='brush: text'>
vm.overcommit_memory = 0
</pre><p></p>

<p>konfigurieren. Die einzelnen Kategorien hierbei sind:</p>

<ul>
	<li><strong>0</strong>: Vorsichtiges Overcommitverhalten. Während gemäßigte Allokierungen erlaubt sind, werden extrem große Allokierungen, die zu übermäßigem Overcommit führen, abgelehnt. In diesem Modus kann root auch mehr Speicher allokieren als ein unprivilegierter Benutzer. Dieser Modus ist auch die Standardeinstellung des Kernels.</li>
        <li><strong>1</strong>: Overcommit unterliegt keinen Einschränkungen</li>
        <li><strong>2</strong>: Schaltet Overcommitverhalten ab. Generell bedeutet dies, dass der maximale allokierbare tatsächliche Adressraum nicht größer werden kann, als <tt>swap</tt> + ein konfigurierbarer Anteil an Prozent des physkalischen RAM. 
</ul> 

<p>Der Anteil des physikalischen RAM bei Modus <tt>2</tt> wird über den zusätzlichen Parameter<br />
</p>
<pre class='brush: text'>
vm.overcommit_ratio = 50
</pre><p></p>

<p>kontrolliert.</p>

<p>Während <tt>vm.overcommit_memory=1</tt> für Spezialanwendungen interessant sein könnte, wird es im Praxiseinsatz eher zum Einsatz für die Parameterwerte <tt>0</tt> oder <tt>2</tt> kommen. Wird Overcommit über <tt>vm.overcommit_memory=2</tt> abgeschaltet, so wird ein Prozess (in Abhängigkeit von <tt>vm_overcommit_ratio</tt>) sofort eine "Out Of Memory"-Bedingung beim Allokieren von Speicher erhalten. Abhängig von der Distribution sollte man die Einstellungen permanent in die Datei <tt>/etc/sysctl.conf</tt> speichern, so dass diese auch nach einem Neustart des Systems aktiv sind:<br />
</p>
<pre class='brush: text'>
$ echo &quot;vm.overcommit_memory=2 &gt;&gt; /etc/sysctl.conf
$ echo &quot;vm.overcommit_ratio=60 &gt;&gt; /etc/sysctl.conf
$ sysctl -p /etc/sysctl.conf
</pre><p></p>

<p> Die Änderungen wirken sich sofort auf den virtuellen Speicher aus, man kann dies erneut durch Abrufen von <tt>/proc/meminfo</tt> überprüfen:<br />
</p>
<pre class='brush: text'>
$ grep Commit /proc/meminfo 
CommitLimit:    401440 kB
Committed_AS:   266456 kB
</pre><p></p>

<p>Die Maschine verfügt über <tt>249848 kB</tt> Swap und <tt>252656 kB</tt> physikalischen RAM. Nach der Formel <tt>Swap + vm.overcommit_ratio * RAM</tt> ergibt dies ein <tt>CommitLimit</tt> von 401440 kB. </p>

<h3>OOM-Killer auf Prozessebene konfigurieren</h3>

<p>Ist PostgreSQL nicht auf einem dedizierten Server installiert und wird mit einer speicherhungrigen Middleware (bspw. JBoss- oder Tomcat-Installation) auf demselben System betrieben, so ist es wünschenswert, Overcommit-Verhalten zwar zu erlauben, im Falle einer "Out Of Memory"-Situation aber PostgreSQL vom OOM-Killer auszunehmen. Seit Kernel 2.6.11 bietet Linux daher ein Interface an, um den OOM-Score eines Prozesses zu tunen, so dass dieser vom OOM-Killer weniger oder stärker berücksichtigt wird. Dies erlaubt ein sehr feinfühliges Einstellen des Systems auf die Speicherbedürfnisse einzelner Prozesse. Die Konfiguration wird über eine Datei im <tt>/proc-Filesystem</tt> des Kernel vorgenommen, beispielsweise hier für den <tt>PostgreSQL</tt>-Hauptprozess unter Debian (0 ist die Standardeinstellung für Prozesse):<br />
</p>
<pre class='brush: text'>
$ cat /proc/$(cat /var/run/postgresql/8.4-main.pid)/oom_adj
0
</pre><p></p>

<p>Die erlaubten Werte sind von -17 bis +15, negative Werte verringern die Affinität des Prozesses gegenüber den OOM-Killer, positive Werte erhöhen diese. -17 schaltet den OOM-Killer für den jeweiligen Prozess komplett ab. Die Einstellung wird vom Parent an etwaige Kindprozesse weitervererbt. Da PostgreSQL sich für eine Datenbankverbindung forked, reicht es, diese Einstellung dem PostgreSQL-Hauptprozess mitzugeben:<br />
</p>
<pre class='brush: text'>
$ echo -17 &gt;&gt; /proc/$(cat /var/run/postgresql/8.4-main.pid)/oom_adj
$ psql -q postgres
test=# SELECT pg_backend_pid();
 pg_backend_pid 
----------------
           3429
(1 Zeile)

test=# 
[1]+  Stopped                 psql -q test
$ cat /proc/3429/oom_adj
-17
</pre><p></p>

<p>Der Nachteil dieser Methode ist, dass dies nun für <strong>alle</strong> Kindprozesse des PostgreSQL-Hauptprozesses gilt, was eventuell vom DBA nicht mehr gewünscht ist. Beispielsweise möchte man zwar gerne die PostgreSQl-Systemprozesse wie <tt>Background Writer</tt> oder <tt>Autovacuum</tt> vor dem OOM-Killer schützen, nicht jedoch normale Datenbankverbindungen.</p>

<p>Das Setzen von <tt>/proc/PID/oom_adj</tt> erfordert jedoch einen privilegierten Benutzer, so dass man am Besten die Einstellung direkt im Startskript der PostgreSQL-Datenbank vornimmt.</p>

<h3>Erweiterungen in PostgreSQL 9.0</h3>

<p><a href="/de/2010/02/postgresql-agenda-2010.html">PostgreSQL 9.0</a> wird hinsichtlich der Zusammenarbeit mit dem <tt>/proc</tt>-Interface ebenfalls einige <a href="http://archives.postgresql.org/pgsql-committers/2010-01/msg00169.php">Neuerungen</a> mitbringen. Zum einen wurde das im Quelltext mitgelieferte <a href="http://git.postgresql.org/gitweb?p=postgresql.git;a=blob_plain;f=contrib/start-scripts/linux;hb=HEAD">Linux-Startskript</a> dahingehend erweitert, zum anderen bietet das Backend nun auch Unterstützung, falls man die <tt>/proc</tt>-Einstellungen eben nicht an normale Datenbankverbindungen weitervererben möchte. Hierzu kann der PostgreSQL-Server mit dem Makro <tt>LINUX_OOM_ADJ=0</tt> kompiliert werden, beispielsweise:<br />
</p>
<pre class='brush: text'>
$ ./configure CC=&quot;ccache gcc&quot; CFLAGS=&quot;-DLINUX_OOM_ADJ=0&quot;
</pre><p></p>

<p>Diese Methode schützt dann die PostgreSQL-Systemprozesse effektiv, erlaubt aber dem OOM-Killer etwaige Amoklaufende Backends trotzdem zu terminieren.</p>

<h3>Alternativen</h3>

<p>Eine alternative Lösung gibt es auch in Form eines <a href="http://www.cybertec.at/en/linux-kernel-patch">Kernelpatches</a>. Dies ergänzt das <tt>/proc</tt>-Filesystem um eine Liste an Prozessnamen, die explizit vom OOM-Killer nicht berücksichtigt werden dürfen. Da dies jedoch eine inoffizielle Erweiterung des Kernels ist, muss man seinen eigenen Kernel damit pflegen, auch ist diese Erweiterung bei weitem nicht so flexibel wie das Interface über <tt>oom_adj</tt>. Des weiteren sind Prozessnamen relativ ungeeignet, um spezifische Prozesse eindeutig zu identifizieren (z.B. Java- oder Perlbasierte Prozesse).</p>

<h3>Zusammenfassung</h3>

<p>Der Linuxkernel bietet mittlerweile umfassende Möglichkeiten, die Speichernutzung von Prozessen an das Memory Management des Kernels anzupassen. Die flexibelste Lösung stellt das <tt>/proc</tt>-Filesystem mit dem <tt>oom_adj</tt>-Interface dar. PostgreSQL 9.0 ergänzt dies durch weitere Maßnahmen. Dedizierte Datenbanksysteme können vom Administrator dahingehend angepasst werden, gar kein Overcommit des virtuellen Speichers zuzulassen, hier muss jedoch sorgfältig abgewogen werden, welche Anforderungen die PostgreSQL-Instanz an die VM des Kernels stellt.</p>

<p>Alle Blog-Artikel zum Thema PostgreSQL werden auch als <a href="/de/postgresql/">Kategorie PostgreSQL</a> samt eigenem Feed angeboten - und falls ihr nach <a href="http://www.credativ.de/home/software/softwareubersicht/datenbanken/postgresql_brief/">Support und Services für PostgreSQL</a> sucht, seit ihr bei uns ebenfalls richtig.</p>]]>
        
    </content>
</entry>

<entry>
    <title>PostgreSQL Optimizer Bits: Join Removal</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/2010/03/postgresql-optimizer-bits-join-removal.html" />
    <id>tag:blog.credativ.com,2010:/de//1.131</id>

    <published>2010-03-11T10:00:28Z</published>
    <updated>2010-03-11T16:16:36Z</updated>

    <summary>In der Serie &quot;PostgreSQL Optimizer Bits&quot; werden Strategien und Besonderheiten des PostgreSQL Optimizers vorgestellt. Heute beschäftigt sich die Serie mit dem Feature Join Removal des Optimizers in der kommenden Version 9.0. Nachdem im letzten Beitrag unserer Serie Semi und Anti...</summary>
    <author>
        <name>Bernd Helmle</name>
        
    </author>
    
        <category term="Open Source" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="postgresql" label="PostgreSQL" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://blog.credativ.com/de/">
        <![CDATA[<p><img alt="postgreslogo.png" src="http://blog.credativ.com/de/static/postgreslogo.png" width="97" height="100" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /><em>In der Serie "PostgreSQL Optimizer Bits" werden Strategien und Besonderheiten des PostgreSQL Optimizers vorgestellt. Heute beschäftigt sich die Serie mit dem Feature Join Removal des Optimizers in der kommenden Version 9.0.</em></p>

<p>Nachdem im letzten Beitrag unserer Serie <a href="/de/2010/02/postgresql-optimizer-bits-semi-und-anti-joins.html">Semi und Anti Joins besprochen</a> wurden, setzen wir uns heute mit Join Removal auseinander. Join Removal ist eine Optimierungsstrategie des Optimizers, die Tabellen der rechten Seite in LEFT JOINs aus der Join-Evaluierung ausschließen kann, wenn keine Spalten aus dieser Tabelle in der Ergebnismenge qualifiziert wurden und die rechte Seite des LEFT JOINs eindeutig ist, so dass hierdurch keine weiteren Tupel hinzukommen. Dies macht auch erforderlich, dass mindestens ein UNIQUE CONSTRAINT existiert, der beide Seiten entsprechend eindeutig qualifiziert wie gefordert.</p>

<p>Betrachten wir folgendes kleines Beispiel mit zwei Tabellen <tt>a</tt> und <tt>b</tt>, wobei <tt>b</tt> Detaildatensätze verknüpft mit <tt>a</tt> enthält.<br />
</p>
<pre class='brush: sql'>
EXPLAIN SELECT 
   a.name 
FROM 
   a LEFT JOIN b ON (b.id = a.id) 
WHERE 
   a.name LIKE 'M%';
</pre><p></p>

<p>Diese Query selektiert aus einem LEFT JOIN den Namen einer Person aus der Relation <tt>a</tt>. Man erkennt schnell, dass der LEFT JOIN auf die Relation <tt>b</tt> in diesem Fall nutzlos ist, wenn die verknüpften Felder <tt>a.id</tt> und <tt>b.id</tt> eindeutig sind. In diesem Fall würde auch bei Auftreten eines verknüpften Tupels kein weiteres Tupel erzeugt werden. In PostgreSQL 8.4 wird dennoch der Join ausformuliert:</p>

<pre>Nested Loop Left Join  (cost=0.00..9.33 rows=1 width=6)
   ->  Seq Scan on a  (cost=0.00..1.05 rows=1 width=10)
         Filter: (name ~~ 'M%'::text)
   ->  Index Scan using b_pkey on b  (cost=0.00..8.27 rows=1 width=4)
         Index Cond: (b.id = a.id)
</pre>

<p>In PostgreSQL 9.0alpha4 hingegen wird der Join eliminiert: dadurch vereinfacht sich der Plan wie folgt:</p>

<pre>Seq Scan on b  (cost=0.00..1.05 rows=1 width=11) (actual time=0.012..0.013 rows=1 loops=1)
   Filter: (name ~~ 'M%'::text)
 Total runtime: 0.045 ms
</pre>

<p>Der Optimizer kann an dieser Stelle nur die linke Seite berücksichtigen und daher die Relation <tt>b</tt> komplett aus dem Join eliminieren. Interessant wird diese Optimierungsmöglichkeit bei Verknüpfungen mit vielen LEFT JOINs (bspw. <tt>a LEFT JOIN b LEFT JOIN c LEFT JOIN d ...</tt>), wo mehrere Relationen aufgrund der Zusammensetzung der Abfrage aus dem Join entfernt werden können. Dadurch verbessern sich auch die Möglichkeiten des Optimizers, der weniger Tabellen bei der Optimierung der Verknüpfungspfade berücksichtigen muss. Auch für Views ist diese Optimierungsmöglichkeit interessant, da nicht qualifizierte Spalten aus der zugrundeliegenden Definition des Views eliminiert werden und daher implizit zu derartigen Abfragen führen können.</p>

<p>So weit zum aktuellen Artikel der Serie, der nächste wird bald folgen. Alle Blog-Artikel zum Thema PostgresQL werden auch als <a href="/de/postgresql/">Kategorie PostgreSQL</a> samt eigenem Feed angeboten - und falls ihr nach <a href="http://www.credativ.de/home/software/softwareubersicht/datenbanken/postgresql_brief/">Support und Services für PostgreSQL</a> sucht, seit ihr bei uns ebenfalls richtig.</p>]]>
        
    </content>
</entry>

<entry>
    <title>PostgreSQL 9.0alpha4 erschienen</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/2010/02/postgresql-90alpha4-erschienen.html" />
    <id>tag:platon.credativ.com,2010:/de//1.33</id>

    <published>2010-02-25T10:43:17Z</published>
    <updated>2010-03-05T10:49:08Z</updated>

    <summary>Das PostgreSQL-Projekt hat die Alpha 4 der kommenden Version PostgreSQL 9.0 veröffentlicht. Ab sofort steht die Alpha-Version 4 des kommenden PostgreSQL 9.0-Releases zum Download bereit. Alpha4 wird voraussichtlich die letzte Version vor der finalen Betaphase für PostgreSQL 9.0 werden. Einige...</summary>
    <author>
        <name>Bernd Helmle</name>
        
    </author>
    
        <category term="News" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Open Source" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="de" xml:base="http://blog.credativ.com/de/">
        <![CDATA[<p><img alt="postgreslogo.png" src="/de/static/postgreslogo.png" width="97" height="100" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /><em>Das PostgreSQL-Projekt hat die Alpha 4 der kommenden Version PostgreSQL 9.0 veröffentlicht.</em></p>

<p>Ab sofort steht die Alpha-Version 4 des kommenden PostgreSQL 9.0-Releases zum <a href="http://www.postgresql.org/developer/alpha">Download</a> bereit. Alpha4 wird voraussichtlich die letzte Version vor der finalen Betaphase für PostgreSQL 9.0 werden. Einige Highlights der Alphaversion sind:<br />
<ul>	<li>Überarbeitete LISTEN/NOTIFY Infrastrukur. Durch eine reine Hauptspeicherlösung ist diese neue Lösung deutlich performanter als die alte tabellenbasierte Implementierung. Auch unterstützt die neue Lösung sogenannte <em>"Payloads"</em>, womit sich bespielsweise Nachrichten übertragen lassen.</li><br />
	<li>Streaming Replication, eine integrierte Replikationslösung, die deutlich geringere Latenzen vorweist als die üblichen, auf WAL-Shipping basierende Lösungen.</li><br />
	<li>Prozeduraler Code mit plpgsql oder plperl kann nun mit dem DO-Statement ausgeführt werden, ohne vorher eine Funktion mit CREATE FUNCTION erzeugen zu müssen.</li></ul><br />
Interessierte sind herzlich eingeladen, die Alphaversion zum Testen oder Ausprobieren <a href="http://www.postgresql.org/developer/alpha">herunterzuladen</a>. Bugs oder interessante Testresultate sind willkommen, die Vorgehensweise hierfür kann dem <a href="http://wiki.postgresql.org/wiki/HowToBetaTest">Wiki</a> der PostgreSQL-Entwicklergruppe entnommen werden.</p>]]>
        
    </content>
</entry>

<entry>
    <title>PostgreSQL Optimizer Bits: Semi und Anti Joins</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/2010/02/postgresql-optimizer-bits-semi-und-anti-joins.html" />
    <id>tag:platon.credativ.com,2010:/de//1.28</id>

    <published>2010-02-17T18:04:05Z</published>
    <updated>2010-03-11T10:05:25Z</updated>

    <summary>In der Serie &quot;PostgreSQL Optimizer Bits&quot; werden Strategien und Besonderheiten des PostgreSQL Optimizers vorgestellt. Den Startpunkt setzt ein neues Feature aus der Version 8.4: Semi und Anti Joins. PostgreSQL bietet seit Version 8.4 eine neue Optimizerstrategie für die Optimierung von...</summary>
    <author>
        <name>Bernd Helmle</name>
        
    </author>
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="de" xml:base="http://blog.credativ.com/de/">
        <![CDATA[<img alt="postgreslogo.png" src="/de/static/postgreslogo.png" width="97" height="100" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /><em>In der Serie "PostgreSQL Optimizer Bits" werden Strategien und Besonderheiten des PostgreSQL Optimizers vorgestellt. Den Startpunkt setzt ein neues Feature aus der Version 8.4: Semi und Anti Joins.</em>
<br /><br />
PostgreSQL bietet seit Version 8.4 eine neue Optimizerstrategie für die Optimierung von bestimmten Abfragen an: Semi und Anti Joins.
<br />
Ein <strong>Semi Join</strong> ist eine spezielle Form eines Joins, die nur die Schlüssel einer Relation <tt>a</tt> berücksichtigt, sobald diese ebenfalls in der verknüpften Tabelle <tt>b</tt> auftreten.
<br />
<br />
Ein <strong>Anti Join</strong> ist die negative Form eines Semi Join: Tritt ein in Tabelle <tt>a</tt> gewählter Schlüssel in Tabelle <tt>b</tt> nicht auf, so wird er bei dieser speziellen Form berücksichtigt. Ein Semi- bzw. Anti-Join sind also spezielle Formen eines Joins, die einen bestimmten Schlüssel nur auf der linken Seite berücksichtigen. Interessant wird dies nun für Abfragen, die nur ein Vorhandensein eines bestimmten Schlüssels prüfen wollen bzw. dies als Filterprädikat nutzen. Bekannt ist ein solches Vorgehen teils von Object Relation Mapper (ORM), die entsprechende Anfragen mit <tt>EXISTS()</tt> bzw. <tt>NOT EXISTS()</tt> formulieren.
<br />
<br />
Im Vergleich zu PostgreSQL 8.3 ergibt sich für dieselbe Anfrage ein unterschiedlicher und deutlich effizienter Abfrageplan, wie im folgenden Beispiel (mit relativ einfacher Abfrage) dargestellt. Gegeben seien zwei Tabellen <tt>a,b</tt> und eine Anfrage über EXISTS(). Es soll ein bestimmter Datensatz aus <tt>a</tt> ermittelt werden, der eine Entsprechung über <tt>a.id2 = b.id</tt> in <tt>b</tt> hat. Selbstverständlich lässt sich dies auch über einen Join lösen, beispielhaft soll dies jedoch zeigen, wie der Optimizer eine derartig formulierte Anfrage auflösen kann:
<pre class='brush: sql'>
EXPLAIN SELECT id FROM a WHERE a.id = 200 AND EXISTS(SELECT id FROM b WHERE a.id2 = b.id);
</pre>
Der Optimizer in PostgreSQL 8.3 ermittelt für dieses Beispiel in der Regel folgenden Plan (zu beachten ist, dass die beiden Tabellen <tt>a,b</tt> jeweils einen Index auf den Spalten <tt>id</tt> bzw. <tt>id2</tt> haben):
<pre class='brush: sql'>
                                QUERY PLAN
--------------------------------------------------------------------------
 Index Scan using a_id_idx on a  (cost=0.00..8355.27 rows=503 width=4)
   Index Cond: (id = 200)
   Filter: (subplan)
   SubPlan
     -&gt;  Index Scan using b_id_idx on b  (cost=0.00..8.27 rows=1 width=4)
           Index Cond: ($0 = id)
</pre>
Im Gegensatz dazu kann PostgreSQL 8.4 hash Semi Join nutzen:
<br />
<pre class='brush: sql'>
                                QUERY PLAN
---------------------------------------------------------------------------
 Hash Semi Join  (cost=27.52..78.16 rows=969 width=4)
   Hash Cond: (a.id2 = b.id)
   -&gt;  Index Scan using a_id_idx on a  (cost=0.00..37.32 rows=969 width=8)
         Index Cond: (id = 200)
   -&gt;  Hash  (cost=15.01..15.01 rows=1001 width=4)
         -&gt;  Seq Scan on b  (cost=0.00..15.01 rows=1001 width=4)
</pre>

Man sieht deutlich die reduzierten Kosten des Planes, die auch weniger I/O-Zugriffe bedeuten. Für derartige Abfragen lohnt sich also ein genauerer Blick.

So weit zum aktuellen Artikel der Serie, der nächste wird bald folgen. Alle Blog-Artikel zum Thema PostgresQL werden auch als <a href="/de/postgresql/">Kategorie PostgreSQL</a> samt eigenem Feed angeboten - und falls ihr nach <a href="http://www.credativ.de/home/software/softwareubersicht/datenbanken/postgresql_brief/">Support und Services für PostgreSQL</a> sucht, seit Ihr bei uns ebenfalls richtig.]]>
        
    </content>
</entry>

</feed>

