PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei...

125
PostgreSQL optimieren und mit Perl kombinieren Deutscher Perl-Workshop 2009 - 25-27. Februar 2009 Andreas ’ads’ Scherbaum Web: http://andreas.scherbaum.la/ E-Mail: [email protected] PGP: 9F67 73D3 43AA B30E CA8F 56E5 3002 8D24 4813 B5FE 25. Februar 2009

Transcript of PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei...

Page 1: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

PostgreSQL optimieren und mit Perl kombinierenDeutscher Perl-Workshop 2009 - 25-27. Februar 2009

Andreas ’ads’ Scherbaum

Web: http://andreas.scherbaum.la/

E-Mail: [email protected]

PGP: 9F67 73D3 43AA B30E CA8F 56E5 3002 8D24 4813 B5FE

25. Februar 2009

Page 2: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Inhaltsverzeichnis

1 Performance

2 Konfiguration

3 Analyse

4 Informationen

5 Perl

6 VACUUM

7 Transaktionen

8 Volltextsuche

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 3: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Was ist PostgreSQL?

Relationale Datenbank

BSD Lizenz, weltweit aktive Community

Zahlreiche Features und Funktionen (Foreign Keys,Transaktionen, Trigger)

Lauft auf zahlreichen Betriebssystemen und diverser Hardware

Weitgehendes Einhalten der SQL-Standards - Dokumentationder Abweichungen

Im Schnitt pro Jahr ein Minor-Release mit neuen Features

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 4: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Wer spricht da vorn?

Name: Andreas Scherbaum

Selbststandig im Bereich Datenbanken, Linux aufKleingeraten, Entwicklung von Webanwendungen

Arbeit mit Datenbanken seit 1997, mit PostgreSQL seit 1999

Grundungsmitglied der Deutschen und der EuropaischenPostgreSQL User Group

Board of Directors - European PostgreSQL User Group

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 5: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Ursachen schlechter Performance

Es gibt vielfaltige Ursachen fur eine zu geringe Performance:

Falsche (oder fehlende) Konfiguration

Anwendung stellt Anfragen falsch

Datenbank Layout ist falsch oder ungenugend (fehlendeIndexes, fehlende Normalisierung)

Anwendungen fragen zu viele (unnotige) Daten ab (z.B.:SELECT *, fehlendes WHERE, fehlendes LIMIT )

Latenzzeiten (z.B. Netzwerk, Zugriffszeiten der Festplatten)

Ungenugende Hardware

...

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 6: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Ziele dieses Workshops

Performance: grundlegende Details, Partitionierung, Tablespaces

Konfiguration: (Installation,) Speichernutzung einstellen,Logdateien konfigurieren, Zugriff aus dem Netzwerk ermoglichen.der Planer und seine Statistiken

Analyse: von Anfragen, Auffinden langsamer Queries, Anfrageplaneim Detail

Informationen: was die Datenbank alles mitteilen kann

Perl: mit Perl auf PostgreSQL zugreifen, Stored Procedures in Perlschreiben

VACUUM: der Staubsauger, Sinn, Nutzen und Konfiguration

Transaktionen: Wozu braucht man so etwas?

Volltextsuche: Installation und Anwendungsbeispiele

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 7: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Ungenugende Hardware

Performance - Ungenugende Hardware

Mehr RAM, mehr RAM, noch mehr RAM

Im Speicher vorgehaltene Daten mussen nicht von der Plattegelesen werden

Langsame Festplatten gegen schnellere ersetzen, ggf. einRAID oder Tablespaces nutzen

Es gilt:

die Performance verbessert sich mit der Anzahl derSpindeln

Schwachstellen im I/O-System herausfinden

SSD-Platten in Betracht ziehen: sehr schnell beim Lesen,jedoch derzeit noch Probleme beim Schreiben

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 8: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Performancesteigerung durch Hardware

Performancesteigerung durch Hardware

Soviel RAM wie notwendig: die wichtigen Tabellen/Datensollen komplett im RAM liegen

Ein 64-Bit System bringt bei mehr als 3,x GB RAM Vorteile

RAID kann Plattenzugriffe verteilen - aber nur unabhangigvon der tatsachlichen Nutzung

Mittels Tablespaces kann man Zugriffe gezielt aufverschiedene Platten verteilen - z. B. Tabelle und Index aufzwei Spindeln legen

Wenig genutzte Daten konnen auf langsame (und gunstige)Datentrager ausgelagert werden

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 9: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Partitionierung

Partitionierung - Vorteile

Daten werden ausgehend von der tatsachlichen Situationgespeichert

Sequentielle Scans durchlaufen nicht den gesamtenDatenbestand

Bestimmte Verwaltungsarbeiten lassen sich effizientdurchfuhren

Daten konnen auf unterschiedliche Medien aufgeteilt werden

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 10: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Partitionierung

Partitionierung bei PostgreSQL

Tabellen werden durch Inheritance (Vererbung) von einerMastertabelle erstellt:

Beispiel (Master-Tabelle anlegen)

CREATE TABLE log_data (

id SERIAL NOT NULL

PRIMARY KEY,

insert_at TIMESTAMPTZ NOT NULL,

data VARCHAR(100) NOT NULL

);

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 11: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Partitionierung

Partitionierung bei PostgreSQL

Beispiel (abgeleitete Tabelle anlegen und befullen)

CREATE TABLE log_data_200901 ( ) INHERITS (log_data);

CREATE TABLE log_data_200902 ( ) INHERITS (log_data);

INSERT INTO log_data_200902 (insert_at, data)

VALUES (NOW(), ’Datensatz 42’);

INSERT INTO log_data_200901 (insert_at, data)

VALUES (’2009-01-23’, ’Datensatz 23’);

SELECT * FROM log_data_200901;

SELECT * FROM log_data_200902;

SELECT * FROM log_data;

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 12: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Partitionierung

Korrekte Timestamps erzwingen

Beispiel (abgeleitete Tabelle mit CONSTRAINT anlegen)

CREATE TABLE log_data_200901 ( ) INHERITS (log_data);

CREATE TABLE log_data_200902 (

CHECK (insert_at >= DATE ’2009-02-01’ AND

insert_at < DATE ’2009-03-01’)

) INHERITS (log_data);

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 13: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Partitionierung

Nutzung des Timestamp bei einer Abfrage

Wenn PostgreSQL einen Contraint auf der vererbten Tabellevorfindet, wird dieser dazu genutzt, die komplette Tabelle ggf.aus der Abfrage auszuschließen

Beispiel (CONSTRAINTs nutzen)

SET constraint_exclusion = on;

EXPLAIN SELECT * FROM log_data_200809

WHERE insert_at=’2008-10-11’;

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 14: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Tablespaces

Tablespaces - Vorteile gegenuber RAID

Tabellen und Indexes konnen gezielt (und getrennt) aufverschiedene Datentrager verteilt werden

Verschiedene Datenbanken oder Tabellen konnen sich aufverschieden schnellen Datentragern befinden

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 15: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Tablespaces

Tablespace erstellen

Beispiel (Tablespace anlegen)

CREATE TABLESPACE ts_neu LOCATION ’/mnt/db_neu’;

Der Name des Tablespace muss eindeutig sein und darf bishernicht vergeben sein

Das Verzeichnis ”/mnt/db neu” muss ”postgres” gehoren undleer sein, der absolute Pfad wird verlangt

Tablespaces konnen nur von einem Admin angelegt werden

Das Zuweisen an einen anderen User ist moglich (OWNER)

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 16: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Tablespaces

Tablespace nutzen

Tablespaces werden mit Hilfe der Option ”TABLESPACE”beim Erstellen eines Objekts angewandt:

Beispiel (Index auf Tablespace erstellen)

CREATE INDEX test1_index ON test1(id)

TABLESPACE ts_neu;

Eine nachtragliche Zuweisung zu einem anderen Tablespace istmoglich:

Beispiel (Index nachtraglich verschieben)

ALTER INDEX test1_index SET TABLESPACE ts_neu;

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 17: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Tablespaces

Tablespace per Datenbank angeben

Eine Datenbank kann komplett auf einem anderen Tablespaceerzeugt werden:

Beispiel (Tablespace fur Datenbank angeben)

CREATE DATABASE neue_db TABLESPACE = ts_neu;

Der Default Tablespace fur neue Objekte lasst sich andern:

Beispiel (Default Tablespace andern)

SET default_tablespace = ts_neu;

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 18: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Tablespaces

Neu in PostgreSQL 8.4!

Eine ganze Datenbank kann nachtraglich auf einen anderenTablespace umgezogen werden:

Beispiel (Datenbank auf anderen Tablespace umziehen)

ALTER DATABASE neue_db SET TABLESPACE ts_neu;

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 19: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Voraussetzungen

Voraussetzung fur diesen Workshop

Voller Zugriff auf das System

PostgreSQL ist bereits installiert

Position der PostgreSQL Konfigurationsdateien ist bekannt

psql ist bekannt

Eine Datenbank workshop wird angelegt

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 20: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Installation von PostgreSQL

PostgreSQL installieren

Debian/Ubuntu: apt-get install postgresql-8.3postgresql-client-8.3

Red Hat: yum install postgresql && service postgresql initdb&& service postgresql start

SuSE: uber YaST

Mac OS X: (uber Macports) port install postgresql

Windows: MSI Paket von der Webseite herunterladen

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 21: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

die erste Datenbank erstellen

Datenbank erstellen

Beispiel (Beispieldatenbank erstellen)

CREATE DATABASE workshop;

createdb workshop

Folgende Zeile in pg hba.conf aufnehmen und Datenbank neuladen:

Beispiel (Zugang zur Beispieldatenbank konfigurieren)

local workshop all trust

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 22: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Performance

Performance - falsche Konfiguration

Hinweis: die standardmaßige PostgreSQL Konfiguration ist aufgeringen Ressourcenverbrauch ausgelegt.

shared buffers zu gering

FSM - Free-Space-Map nicht angepasst

Bei umfangreichen Operationen work mem erhohen

maintenance work mem kann mehr Speicher fur VACUUMbereitstellen

temp buffers: bei Uberschreiten werden Daten auf dieFestplatte ausgelagert

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 23: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Performance

Performance - Anwendung stellt Anfragen falsch

Mittels log min duration statement langlaufende Anfragenermitteln

Anfragen mittels EXPLAIN und EXPLAIN ANALYZEuberprufen

Gleiche Anfragen mittels Prepared Statement aufrufen:erspart den Parser Schritt

Zahlreiche INSERT-Operationen mittels Prepared Statementoder besser COPY durchfuhren

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 24: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Performance

Performance - Datenbank Layout ist falsch oderungenugend

Testweise prufen, ob ein Index auf einer Spalte eineVerbesserung der Laufzeit bewirkt

Wichtig: ANALYZE fur die Tabelle nicht vergessen

Tabellen normalisieren - in der Regel ergeben sich dadurch furdie Datenbank besser handhabbare Anfragen

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 25: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Konfiguration

Konfiguration - Ubersicht

Alle Konfigurationen fur PostgreSQL werden in der Dateipostgresql.conf vorgenommen

Alle Einstellungen fur Zugangsberechtigungen werden in derDatei pg hba.conf vorgenommen

Nach Anderungen mittels pg ctl reload die Konfiguration neuladen

Ein Neustart ist nur selten notwendig und ist in derKonfiguration vermerkt

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 26: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Konfiguration

Konfiguration - Speichernutzung

shared buffers: Verfugbarer Speicher fur alle PostgreSQLProzesse

Ev. /etc/sysctl.conf anpassen (kernel.shmmax undkernel.shmall)

http://www.postgresql.org/docs/current/static/kernel-resources.html

work mem: Speicher fur Sortieroperationen und HashingTabellen

maintenance work mem: Speicher fur VACUUM undANALYZE

temp buffers: Speicher fur temporare Tabellen

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 27: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Konfiguration

Konfiguration - Speichernutzung

max fsm pages: bestimmt die Verwaltung von Disk Pages

max fsm relations: bestimmt die Anzahl von Tabellen undIndizes

VACUUM VERBOSE Ausgabe beachten

Neu in PostgreSQL 8.4: FSM Einstellungen entfallen!

max stack depth: Große des nutzbaren Stacks (ulimitbeachten)

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 28: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Konfiguration

Konfiguration - Logdateien

log filename: Format fur Logdateien in pg log (siehestrftime())

log rotation age: Logfiles nach Zeit rotieren

log rotation size: Logfile nach Große rotieren

log error verbosity : PostgreSQL wird gesprachiger (verbose)

log min error statement: minimaler Loglevel (info)

log min duration statement: Ausfuhrungszeit von Anfragenloggen

redirect stderr : leitet Ausgaben in eine Logdatei um

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 29: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Konfiguration

Konfiguration - Netzwerk

listen addresses: genutzte Netzwerkinterfaces (’*’, ’localhost’,IP-Adressen)

port: Netzwerkport (Default: 5432)

max connections: maximale Anzahl Netzwerkverbindungen

superuser reserved connections: Reserve fur den Admin +VACUUM

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 30: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Konfiguration

Konfiguration - Netzwerk

unix socket directory : Verzeichnis fur denUnix-Domain-Socket

unix socket group: Gruppenname fur Domainsocket File

unix socket permissions: Integer Wert fur Zugriffsrechte aufDomainsocket File

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 31: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Konfiguration

Konfiguration - Ubung

PostgreSQL an alle Netzwerkinterfaces binden

42 maximale Verbindungen zulassen

200 MB Shared Memory einstellen

Speicher fur Sortieroperationen auf 3 MB einstellen

Logfiles taglich neu erstellen, der Wochentag erscheint imDateinamen

Queries mit einer Laufzeit uber 5 Sekunden protokollieren

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 32: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Konfiguration

Shared Memory - SHMMAX

Maximale Große eines einzelnen Shared Memory Segments

Auf 32-Bit Systemen maximal 4 GB - jedoch effektiv weniger

Aktuellen SHMMAX Wert abfragen: cat/proc/sys/kernel/shmmax

Neuen Wert setzen: sysctl -w kernel.shmmax=220000000

Hinweis: unter SUSE/OpenSUSE sind Shared-MemoryEinstellungen nicht notwendig.

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 33: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Konfiguration

Shared Memory - SHMALL

Maximale Anzahl der Shared Memory Pages (systemweit)

Sollte mindestens folgenden Wert haben:ceil(shmmax/PAGE SIZE)

Page Size abfragen: getconf PAGE SIZE

Aktuellen SHMALL Wert abfragen: cat/proc/sys/kernel/shmall

Neuen Wert setzen: sysctl -w kernel.shmall=55000

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 34: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Konfiguration

Konfiguration - Losung der Ubung

listen addresses = ’*’

max connections = 42

shared buffers = 200MB

kernel.shmmax und kernel.shmall anpassen

work mem = 3MB

log filename = ’postgresql-%a.log’

log min duration statement = 5000

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 35: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Konfiguration

Konfiguration - Planer

enable bitmapscan, enable hashagg, enable hashjoin,enable hashjoin, enable mergejoin, enable nestloop,enable seqscan, enable sort, enable tidscan

Alle Werte sind per Default on und beeinflussen den Planer

Zur Laufzeit umschaltbar: SET enable seqscan = off

effective cache size: ungefahre Große des Caches imBetriebssystem

geqo: Generic Query Optimizer ein- oder ausschalten

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 36: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Konfiguration

Konfiguration - Planer

seq page cost: Kosten fur das Lesen eines Blocks wahrendeiner laufenden Leseoperation (1.0)

random page cost: Kosten fur das Lesen eines zufalligenBlocks (4.0)

cpu tuple cost: Kosten fur das Bearbeiten einer Zeile (row)(0.01)

cpu index tuple cost: Kosten fur das Bearbeiten einesEintrags im Index (0.005)

cpu operator cost: Kosten fur den Aufruf eines Operatorsoder einer Funktion (0.0025)

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 37: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Konfiguration

Konfiguration - Statistiken

track activities: in 8.3, aktiviere Statistiken fur ausgefuhrteBefehle

stats start collector : in 8.2, aktiviere Statistiken

stats block level : in 8.2, aktiviere Statistiken fur blockbasierteOperationen

stats row level : in 8.2, aktiviere Staristiken fur zeilenbasierteOperationen

track counts: in 8.3, aktiviere Statistiken furDatenbankaktivitaten (Autovacuum)

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 38: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Konfiguration

Konfiguration - Statistiken loggen

log statement stats: Statistiken uber den ausgefuhrten Befehl

log parser stats: Statistiken uber die Parser Operationen

log planner stats: Statistiken uber die Planer Operationen

log executor stats: Statistiken uber die effektiv ausgefuhrtenOperationen

Hinweis: log statement stats kann nicht zusammen mit eineranderen Option aktiviert werden

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 39: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Konfiguration

Konfiguration - Write Ahead Log (WAL)

fsync : aktiviert oder deaktiviert synchrones Schreiben. offkann zu Datenverlusten und einer beschadigten Datenbankfuhren!

synchronous commit: bei off wird nicht auf das Beenden desSchreibens gewartet. Datenverluste sind moglich, aber keinebeschadigte Datenbank.

wal buffers: Große des Speicherbereichs zum Schreiben einesEintrags in das WAL.

checkpoint segments: Anzahl WAL-Logfiles, die rotiert werden

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 40: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Analyse von Anfragen

Analyse von Anfragen - Warum?

Langsame Anfragen schneller gestalten

Performance-Schwachstellen entdecken

Ungenutzte Indexes herausfinden

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 41: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Analyse von Anfragen

Analyse von Anfragen - Wie

EXPLAIN: liefert den Queryplan fur eine Anfrage

EXPLAIN ANALYZE : fuhrt die Anfrage zusatzlich aus undmisst die Laufzeiten

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 42: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Analyse von Anfragen

Analyse von Anfragen - Ubung

Struktur des System-Views pg tables herausfinden

Struktur der beteiligten Tabellen herausfinden

Die pg tables Anfrage mit EXPLAIN und EXPLAINANALYZE analysieren

Bonus: Verwendung von Indexes erzwingen und die Analysewiederholen

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 43: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Analyse von Anfragen

Analyse von Anfragen - Losung

Beispiel (System-View pg tables)

\dS

\d pg_catalog.pg_tables

EXPLAIN <query>

EXPLAIN ANALYZE <query>

SET enable_seqscan = off;

EXPLAIN <query>

EXPLAIN ANALYZE <query>

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 44: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Der Planer

Der Planer

Jede Anfrage wird vom Planer bearbeitet und in einenQueryplan ubersetzt

Zu einzelnen Teilen der Anfrage werden statistischeInformationen aus den Tabellen geholt

Aufgrund dieser Informationen wird entschieden, ob z.B. einIndex genutzt wird

Der Planer kann ggf. Anfragen intern umschreiben (JOINsauflosen, RULEs anwenden)

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 45: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Der Planer

Beispiel Tabelle

Beispiel (Beispiel Tabelle)

CREATE TABLE planer_test (

id SERIAL NOT NULL UNIQUE,

inhalt VARCHAR NOT NULL

);

INSERT INTO planer_test (inhalt) VALUES (’Inhalt 001’);

INSERT INTO planer_test (inhalt) VALUES (’Inhalt 002’);

INSERT INTO planer_test (inhalt) VALUES (’Inhalt 003’);

INSERT INTO planer_test (inhalt) VALUES (’Inhalt 004’);

INSERT INTO planer_test (inhalt) VALUES (’Inhalt 005’);

ANALYZE VERBOSE planer_test;

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 46: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Der Planer

Analyse von Anfragen

PostgreSQL kennt den EXPLAIN Befehl, den man vor einenQuery setzen kann

EXPLAIN liefert detaillierte Aussagen, wie PostgreSQL dieAbfrage bearbeiten wurde

Beispiel (EXPLAIN Ausgabe)

postgres=# EXPLAIN SELECT id, inhalt FROM planer_test WHERE id=1;

QUERY PLAN

------------------------------------------------------------

Seq Scan on planer_test (cost=0.00..1.06 rows=1 width=18)

Filter: (id = 1)

(2 rows)

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 47: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Der Planer

Analyse von Anfragen

Seq Scan on planer test (cost=0.00..1.06 rows=1 width=18)

Sequentieller Scan auf die Tabelle

Gesamtkosten: 1.06

Kosten bis zum Lesen des ersten brauchbaren Wertes: 0.00

Erwartete Anzahl Spalten: 1

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 48: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Der Planer

Analyse von Anfragen

Frage: Warum ein sequentieller Scan, wenn wir doch einenIndex auf id haben?

Erzwingen wir die Nutzung des Index:

SET enable seqscan=0;

Einschatzung: Was wird passieren?

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 49: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Der Planer

Analyse von Anfragen

Beispiel (EXPLAIN Ausgabe)

postgres=# EXPLAIN SELECT id FROM planer_test WHERE id=1;

QUERY PLAN

---------------------------------------------------------

Index Scan using planer_test_id_key on planer_test

(cost=0.00..3.01 rows=1 width=4)

Index Cond: (id = 1)

(2 rows)

Was ist passiert?

Index wird gelesen: Kosten 1-2

Da sich alle Daten in einem Block befinden, muss dieser Blockdanach sowieso gelesen werden

Resultat: Kosten 3

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 50: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Der Planer

Analyse von Anfragen - Erkentnisse

PostgreSQL erstellt jeden Queryplan dynamisch und abhangigvom Zustand der Daten

Zwei Anfragen auf die gleiche Tabelle, bei unterschiedlichenDatenmengen, konnen anders ausgefuhrt werden

Daraus resultiert: PostgreSQL sollte gute Informationen uberdie Daten in den Tabellen haben

Das wichtigste Hilfsmittel ist ANALYZE (bzw. VACUUMANALYZE )

Der Autovacuum Daemon ubernimmt die meiste Arbeit

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 51: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Der Planer

Analyse von Anfragen - Ausfuhrungszeit messen

Beispiel (EXPLAIN ANALYZE Ausgabe)

postgres=# EXPLAIN ANALYZE SELECT id FROM planer_test WHERE id=1;

QUERY PLAN

-------------------------------------------------------------------

Seq Scan on planer_test (cost=0.00..1.06 rows=1 width=4)

(actual time=0.017..0.025 rows=1 loops=1)

Filter: (id = 1)

Total runtime: 0.066 ms

(3 rows)

EXPLAIN ANALYZE fuhrt die Anfrage aus und misst die Zeit

Die gemessenen Zeiten bewegen sich innerhalb der vorabgeschatzten Werte

Sollte es hier grobe Abweichungen geben, hat der Planerfalsche Daten!

Vorsicht: Es werden Daten verandert!

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 52: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Der Planer

Analyse von Anfragen - Negativbeispiel

Beispiel (EXPLAIN ANALYZE Ausgabe)

postgres=# EXPLAIN ANALYZE SELECT id FROM planer_test WHERE id=10;

QUERY PLAN

-------------------------------------------------------------------

Seq Scan on planer_test (cost=0.00..1.06 rows=1 width=4)

(actual time=0.022..0.022 rows=0 loops=1)

Filter: (id = 10)

Total runtime: 0.060 ms

(3 rows)

Eine sequentielle Suche nach einem nicht vorhandenen Wert

Die Datenbank muss die gesamte Tabelle lesen (minimal0.022 gleich 0.022)

Ein Index hatte hier womoglich schneller Auskunft gegeben

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 53: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Information Schema

information schema

Das Information Schema stellt einen standardisierten Wegbereit, Informationen uber die Struktur der Datenbankauszulesen

Dazu gibt es Views im Schema information schema

Z.B. Tabellen, Spalten, Views, User, Sequencen, Trigger,Privilegien u.v.m.

http://www.postgresql.org/docs/current/static/information-schema.html

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 54: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Information Schema

information schema - Ubung

Mit information schema vertraut machen

Ggf. Fragen stellen

Herausfinden wie man alle Spalten einer Tabelle anzeigen kann

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 55: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Information Schema

information schema - Losung

Beispiel (Alle Spalten aller Tabellen)

SELECT table_schema,table_name,column_name,data_type

FROM information_schema.columns

ORDER BY table_schema, table_name;

Beispiel (Alle Spalten einer Tabelle)

SELECT table_schema,table_name,column_name,data_type

FROM information_schema.columns

WHERE table_schema=’<schema name>’

AND table_name=’<tabellen name>’;

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 56: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Systemtabellen

pg * Systemtabellen

Nicht SQL-konform, eine PostgreSQL-Erweiterung

Seit vielen Versionen vorhanden

Struktur kann sich verandern

Wesentlich weitreichendere Informationen als iminformation schema

Anderungen konnen die Datenbank unbrauchbar werden lassen

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 57: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Systemtabellen

pg * Systemtabellen - Ubung

Mit Systemtabellen vertraut machen

Ggf. Fragen stellen

Herausfinden wie man alle Spalten einer Tabelle anzeigen kann

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 58: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Systemtabellen

pg * Systemtabellen - Losung

Beispiel (Alle Spalten einer Tabelle)

psql mit den Optionen -eE starten

\dt <tabelle>

Ausgabe des Queries nutzen

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 59: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Mit Perl zu einer PostgreSQL Datenbank verbinden

Perl und PostgreSQL

In Perl werden Datenbanken mittels DBI angesprochen

Installation von DBI? Geschenkt ...

Beispiel (Aufbauen einer Verbindung)

use DBI;

my $db = DBI->connect("dbi:Pg:dbname=$name;host=$host",

$benutzername, $passwort,

{AutoCommit => 0});

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 60: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Mit Perl zu einer PostgreSQL Datenbank verbinden

Mogliche Verbindungsparameter

dbname ($PGDATABASE): Name der Datenbank

host ($PGHOST): der Hostname des Servers

hostaddr ($PGHOSTADDR): die IP-Adresse des Servers

port ($PGPORT): der TCP-Port, Default ist 5432

username ($PGUSER): der Benutzername zum Verbinden

password ($PGPASSWORD): das Passwort zum Benutzernamen

service ($PGSERVICE): Parameter werden uberpg service.conf angegeben

options ($PGOPTIONS): Parameter fur dasDatenbankbackend

sslmode ($PGSSLMODE): SSL kann/darf/soll genutzt werden

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 61: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Mit Perl zu einer PostgreSQL Datenbank verbinden

Nutzung von pg service.conf und SSL

Beispiel (Details einer Konfiguration mit pg service.conf)

[servicename]

parameter=value

parameter=value

...

SSL:

allow: zuerst ungesicherte Verbindung probieren, danachgesichert

prefer: zuerst gesicherte Verbindung probieren, danachungesichert

require: nur gesicherte Verbindungen

disable: nur ungesicherte Verbindungen

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 62: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Mit Perl zu einer PostgreSQL Datenbank verbinden

Mogliche DBI Optionen

AutoCommit: Implizite Transaktionen werden ausgeschaltet(wenn false). Transaktionen werden zwar gestartet, abernicht automatisch abgeschlossen. Dafur ist ein expliziterCommit notwendig.

InactiveDestroy: Beim Wert true (Default ist false) wirddas Datenbankhandle nicht zerstort. Das ist wichtig in Childs,die mittels fork() erzeugt wurden.

PrintWarn: Gibt (wenn true) Warnungen aus, die von derDatenbank generiert wurden.

PrintError: Gibt (wenn true) Fehlermeldungen aus, die vonder Datenbank generiert wurden.

RaiseError: Erzeugt (wenn true) eine Exception, wenn einFehler aufgetreten ist.

Weitere Optionen stehen in der DBI Dokumentation.Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 63: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Mit Perl zu einer PostgreSQL Datenbank verbinden

Verbindung wieder schließen

Beispiel (Beenden der Verbindung)

$db->disconnect();

Die Verbindung wird auch am Ende des Skripts geschlossen.

Nicht abgeschlossene Transaktionen werden zuruckgerollt.

Nicht abgeschlossene Statements verursachen eine Warnung.

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 64: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Mit Perl zu einer PostgreSQL Datenbank verbinden

Fehlermeldungen ausgeben

Beispiel (Fehlernummer ausgeben)

print $db->err . "\n";

Beispiel (Fehlermeldung ausgeben)

print $db->errstr . "\n";

oder:

Beispiel (globale verfugbare Variablen nutzen)

print $DBI::err . "\n";

print $DBI::errstr . "\n";

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 65: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Anfragen vorbereiten, Ausfuhren und Ergebnisse auslesen

Anfragen vorbereiten und Ausfuhren

Beispiel (Anfrage vorbereiten und ausfuhren)

$st = $db->prepare("SELECT daten FROM tabelle");

if (!$st->execute) {

# Fehlerbehandlung

}

Beispiel (Anfrage ohne Ergebnis ausfuhren)

if (!$db->do("INSERT INTO ...")) {

# Fehlerbehandlung

}

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 66: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Anfragen vorbereiten, Ausfuhren und Ergebnisse auslesen

Prepared Statements vorbereiten und ausfuhren

Prepared Statements konnen wiederholt genutzt werden undersparen den Parser Schritt in der Datenbank.

Bestimmte Attacken wie SQL-Injections werden wirkungsvollverhindert.

Beispiel (Prepared Statement vorbereiten)

$st = $db->prepare("SELECT daten FROM tabelle WHERE id = ?");

Beispiel (Prepared Statement ausfuhren)

$id = 5;

if (!$st->execute($id)) {

# Fehlerbehandlung

}

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 67: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Anfragen vorbereiten, Ausfuhren und Ergebnisse auslesen

Ergebnis(se) auslesen

$st->fetchrow array liest das nachste Ergebnis aus undliefert die Werte als Array zuruck

$st->fetchrow arrayref liest das nachste Ergebnis aus undliefert eine Referenz auf ein Array mit den Werten zuruck(Vorsicht: Das Array wird beim nachsten Aufrufwiederverwendet und uberschreibt die vorherigen Daten)

$st->fetchrow hashref liest das nachste Ergebnis aus undliefert eine Referenz auf einen Hash mit den Werten zuruck,die Schlusselnamen im Hash entsprechen den Spaltennamen inder Anfrage

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 68: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Anfragen vorbereiten, Ausfuhren und Ergebnisse auslesen

Daten auslesen

Beispiel (Daten mittels fetchrow * auslesen)

while (my @zeile = $st->fetchrow_array) {

print "Spalte 1: " . $zeile[0] . "\n";

print "Spalte 2: " . $zeile[1] . "\n";

}

while (my $zeile = $st->fetchrow_arrayref) {

print "Spalte 1: " . $zeile->[0] . "\n";

print "Spalte 2: " . $zeile->[1] . "\n";

}

while (my $zeile = $st->fetchrow_hashref) {

print "Spalte id: " . $zeile->{’id’} . "\n";

print "Spalte wert: " . $zeile->{’wert’} . "\n";

}

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 69: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Anfragen vorbereiten, Ausfuhren und Ergebnisse auslesen

Ergebnis(se) auslesen

$st->fetchall arrayref liest alle Ergebnisse aus und liefertdiese als Referenz auf ein Array zuruck, welches wiederumReferenzen auf die einzelnen Ergebnisse (als Array) enthalt

$st->fetchall hashref($schluessel) liest alleErgebnisse aus und liefert eine Referenz auf ein Hash zuruck,welches wiederum ein Array je Schlusselspalte mit denzugehorigen Daten enthalt

Achtung: Es werden zuerst alle Daten in den Speicher gelesen!

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 70: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Anfragen vorbereiten, Ausfuhren und Ergebnisse auslesen

Daten auslesen

Beispiel (Daten mittels fetchall * auslesen)

my $zeilen = $st->fetchall_arrayref;

for my $zeile (@$zeilen) {

print "Spalte 1: " . $zeile->[0] . "\n";

print "Spalte 2: " . $zeile->[1] . "\n";

my @zeile = @$zeile;

print "Spalte 1: " . $zeile[0] . "\n";

print "Spalte 2: " . $zeile[1] . "\n";

}

my $zeilen = $st->fetchall_hashref(’id’);

print "Spalte id, Zeile 42: " .

$zeilen->{42}->{’id’} . "\n";

print "Spalte wert, Zeile 42: " .

$zeilen->{42}->{’wert’} . "\n";

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 71: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Anfragen vorbereiten, Ausfuhren und Ergebnisse auslesen

Ausfuhren und Auslesen kombinieren

$st->selectrow array kombiniert prepare, execute undfetchrow array

$st->selectrow arrayref kombiniert prepare, executeund fetchrow arrayref

$st->selectrow hashref kombiniert prepare, executeund fetchrow hashref

$st->selectall arrayref kombiniert prepare, executeund fetchall arrayref

$st->selectall hashref kombiniert prepare, executeund fetchall hashref

$st->selectcol arrayref kombiniert prepare, executeund holt eine Spalte von allen Ergebnissen

Achtung: Die Handhabung bei nicht gesetztem RaiseError istzweifelhaft.

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 72: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Anfragen vorbereiten, Ausfuhren und Ergebnisse auslesen

Anzahl Ergebnisse herausfinden

Beispiel (Anzahl Ergebnisse)

$anzahl = $st->rows();

print "Anzahl Ergebnisse: $anzahl\n";

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 73: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Anfragen vorbereiten, Ausfuhren und Ergebnisse auslesen

Statement beenden

Gibt die verbrauchten Ressourcen wieder frei.

Verhindert Warnungen am Ende des Skriptes.

Beispiel (Statement beenden)

$st->finish;

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 74: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Transaktionen

AutoCommit

Ist AutoCommit ausgeschaltet, mussen Anderungen explizitmittels commit bestatigt werden.

Beispiel (AutoCommit ein- und ausschalten)

$db->{AutoCommit} = 0; # Aus

$db->{AutoCommit} = 1; # Ein

Beispiel (Anderungen committen oder zuruckrollen)

$db->commit;

$db->rollback;

Nach commit oder rollback wird automatisch eine neueTransaktion gestartet.

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 75: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Transaktionen

Transaktionen bei aktiviertem AutoCommit

Ist AutoCommit aktiviert, muss eine Transaktion explizitgestartet werden.

Andernfalls ist jede Aktion in eine eigene Transaktiongekapselt.

Beispiel (explizite Transaktion starten)

$db->begin_work;

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 76: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Stored Procedures

Stored Procedures - Vorteile

Funktionalitat (Logik) befindet sich in der Datenbank - dortwo auch die Daten sind

Daten mussen zum Bearbeiten nicht erst in die Applikationkopiert werden

Durch Kapselung in Transaktionen ist die Datenbank immer ineinem ”gesunden” Zustand

Eine definierte Schnittstelle zwischen Anwendung undDatenbank ist moglich

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 77: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Stored Procedures

Stored Procedures - Nachteile

Rechenlast wird in die Datenbank verlagert

Programmierung erfolgt durch Datenbankexperten

Jede Anderung der Logik muss an mindestens zwei Stellenabgestimmt werden

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 78: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Stored Procedures mit Perl

Stored Procedures mit Perl

Eine Programmiersprache fur Frontend und Datenbank

Features aus Perl (Textverarbeitung) konnen weiterverwendetwerden

Netzwerkzugriffe sind moglich (mittels Untrusted Languages)

Alle Argumente und Ruckgabewerte sind ”String”

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 79: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Stored Procedures mit Perl

Installation von PL/Perl - Perl Procedural Language

Beispiel (Installation als Unix User)

createlang plperl meine_datenbank

createlang plperlu meine_datenbank

Beispiel (Installation als DBA)

CREATE TRUSTED LANGUAGE plperl;

CREATE LANGUAGE plperl;

Untrusted Languages konnen nicht von regularen Userngenutzt werden

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 80: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Stored Procedures mit Perl

Trusted und Untrusted

Im ”Trusted” Modus stehen keine Dateioperationen zurVerfugung

”use” und ”require” sind nicht moglich

Funktionen fur ”plperlu” konnen nur von einem Administratorerstellt werden

Diese Funktionen konnen jedoch (wenn erlaubt) von jedemUser aufgerufen werden

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 81: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Stored Procedure erstellen

Funktion erstellen

Beispiel (Aufbau einer Funktion)

CREATE FUNCTION funktions_name (argumente)

RETURNS return_typ AS $$

# hier Funktion einsetzen

$$ LANGUAGE plperl;

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 82: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Stored Procedure erstellen

Funktion erstellen - Beispiel

Beispiel (einfache Beispielfunktion)

CREATE FUNCTION hello_world ()

RETURNS TEXT AS $$

return ’Hello world’;

$$ LANGUAGE plperl;

Beispiel (Aufruf der Beispielfunktion)

SELECT hello_world();

hello_world

-------------

Hello world

(1 row)

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 83: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Stored Procedure erstellen

Funktion erstellen - Beispiel

Beispiel (Beispielfunktion)

CREATE FUNCTION text_ausschnitt (TEXT, INTEGER, INTEGER)

RETURNS TEXT AS $$

my $text = shift;

my $start = shift;

my $laenge = shift;

return substr($text, $start, $laenge);

$$ LANGUAGE plperl;

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 84: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Stored Procedure erstellen

Funktion erstellen - Beispiel

Beispiel (Aufruf der Beispielfunktion)

SELECT text_ausschnitt(’Hello world’, 6, 5);

text_ausschnitt

-----------------

world

(1 row)

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 85: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Stored Procedure erstellen

Funktion erstellen - Beispiel

Beispiel (Beispielfunktion mit Arrays)

CREATE FUNCTION erzeuge_array ()

RETURNS TEXT[] AS $$

return [’23’, ’42’];

$$ LANGUAGE plperl;

Beispiel (Aufruf der Beispielfunktion)

SELECT erzeuge_array();

erzeuge_array

---------------

{23,42}

(1 row)

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 86: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Stored Procedure erstellen

Funktion erstellen - Beispiel

Beispiel (Beispielfunktion mit Hashes und eigenem Datentyp)

CREATE TYPE berechnung AS (min INTEGER, max INTEGER, avg INTEGER);

CREATE FUNCTION erzeuge_hash ()

RETURNS berechnung AS $$

return {min => 23, max => 42, avg => int((23 + 42) / 2)};

$$ LANGUAGE plperl;

Beispiel (Aufruf der Beispielfunktion)

SELECT * FROM erzeuge_hash();

min | max | avg

-----+-----+-----

23 | 42 | 32

(1 row)

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 87: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Stored Procedure erstellen

Funktion erstellen - Beispiel

Beispiel (Beispielfunktion mit mehreren Ausgaben)

CREATE FUNCTION mehrfache_ausgabe ()

RETURNS SETOF INTEGER AS $$

return_next 23;

return_next 42;

$$ LANGUAGE plperl;

Beispiel (Aufruf der Beispielfunktion)

SELECT * FROM mehrfache_ausgabe();

mehrfache_ausgabe

-------------------

23

42

(2 rows)

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 88: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Stored Procedure erstellen

use strict;

Es gibt mehrere Moglichkeiten, ”use strict;” anzuwenden

Die folgende Methode erfordert keine Anderungen an derKonfiguration:

Beispiel (use strict; anwenden)

CREATE OR REPLACE FUNCTION ... ()

RETURNS ... AS $$

BEGIN { strict->import(); }

$$ LANGUAGE plperl;

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 89: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Stored Procedure erstellen

globale Variablen

% SHARED steht innerhalb einer Funktion zur Verfugung

Diese Variable ist global in der aktuellen Session

Tauscht jedoch keine Daten mit anderen Verbindungen aus

Beispiel (globale Variablen in einer Session)

CREATE OR REPLACE FUNCTION ... ()

RETURNS ... AS $$

$_SHARED{’parameter’} = ’Wert’;

$$ LANGUAGE plperl;

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 90: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Queries in Stored Procedures ausfuhren

kleine Anfragen stellen

Fur Anfragen mit kleinen Ergebnissen (geringe Anzahl) wirdspi exec query verwendet

Optional kann die maximale Anzahl der Ergebnisse angegebenwerden

Beispiel (Anfrage senden)

CREATE OR REPLACE FUNCTION ... ()

RETURNS ... AS $$

$res = spi_exec_query(’SELECT id, daten FROM tabelle’, 5);

$$ LANGUAGE plperl;

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 91: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Queries in Stored Procedures ausfuhren

Ergebnisse der Anfrage auslesen

Uber ”rows” und die Ergebnisnummer erhalt man Zugriff aufdie Ergebnisse

”processed” gibt die Anzahl zuruckgelieferter Ergebnisse an

Beispiel (Anfrage senden)

CREATE OR REPLACE FUNCTION ... ()

RETURNS ... AS $$

$res = spi_exec_query(’SELECT id, daten FROM tabelle’, 5);

for (my $i = 0; $i <= $res->{processed}; $i++) {

print $res->{rows}[$i]->{daten} . "\n";

}

$$ LANGUAGE plperl;

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 92: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Queries in Stored Procedures ausfuhren

umfangreichere Anfragen stellen

Mittels spi query werden Anfragen mit unfangreichenErgebnissen gestellt

Beispiel (Anfrage senden)

CREATE OR REPLACE FUNCTION ... ()

RETURNS ... AS $$

my $st = spi_query("SELECT id, daten FROM tabelle");

while (defined (my $row = spi_fetchrow($st))) {

print $row->{daten} . "\n";

}

$$ LANGUAGE plperl;

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 93: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Trigger Funktionen

Trigger Funktionen

In einer Funktion die durch einen Trigger aufgerufen wird,steht die Variable $ TD zur Verfugung

$ TD ist eine Referenz auf einen Hash und kann verandertwerden

Jede aufgerufene Funktion erhalt seine eigene Kopie dieserVariable (die Variable ist ”local”)

Wichtige Inhalte in $ TD:

$ TD{name}: Name des Triggers

$ TD{event}: INSERT, UPDATE, DELETE oder UNKNOWN

$ TD{when}: BEFORE, AFTER oder UNKNOWN

$ TD{level}: ROW, STATEMENT oder UNKNOWN

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 94: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Trigger Funktionen

Trigger Funktionen

Wichtige Inhalte in $ TD (Fortsetzung):

$ TD{table name}: Name des Tabelle

$ TD{table schema}: Name des Schema

$ TD{new}{param}: Wert ”param” aus NEW (zuschreibende Werte)

$ TD{old}{param}: Wert ”param” aus OLD (vorherigeWerte)

$ TD{argc}: Anzahl der Trigger Argumente

@{$ TD->{args}}: Trigger Argumente (nur wenn ”argc”großer 0)

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 95: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Trigger Funktionen

Trigger Funktionen - Ruckgabewerte

Ein Trigger kann folgende Ruckgabewerte zuruckgeben

return; Die Funktion wird ausgefuhrt

return "SKIP"; Diese Funktion wird ubersprungen

return "MODIFY"; In $ TD{new} wurden Daten verandertund sollen ubernommen werden

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 96: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Trigger Funktionen

Trigger Funktion erstellen - Beispiel

Beispiel (Trigger Beispielfunktion)

CREATE FUNCTION trigger_beispiel ()

RETURNS trigger AS $$

$_TD->{new}{zahl} = 23;

return "MODIFY";

$$ LANGUAGE plperl;

Beispiel (Beispieltabelle fur Trigger Funktion)

CREATE TABLE trigger_tabelle (zahl INTEGER);

Beispiel (Trigger anlegen)

CREATE TRIGGER trigger_beispiel_tr

BEFORE INSERT OR UPDATE ON trigger_tabelle

FOR EACH ROW EXECUTE PROCEDURE trigger_beispiel();

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 97: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Trigger Funktionen

Trigger Funktion erstellen - Beispiel

Beispiel (Trigger Beispieldaten)

INSERT INTO trigger_tabelle (zahl) VALUES (42);

SELECT zahl FROM trigger_tabelle;

zahl

------

23

(1 row)

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 98: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Was ist VACUUM?

VACUUM - ein Staubsauger?

Durch MVCC bleiben alte Daten nach Abschluss einerTransaktion in einer Tabelle zuruck

VACUUM gibt diesen Platz wieder frei

ANALYZE aktualisiert die Statistiken fur den Planer

Shortcut: VACUUM ANALYZE

Der Autovacuum Daemon kann die Arbeit automatisierterledigen

Neu in PG 8.3: HOT - Heap-Only-Tuples

quasi ein kleines Vacuum innerhalb des Blocks

Voraussetzung: kein Wert im Index wird geandert

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 99: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Was ist VACUUM?

HOT - Beispiele

Beispiel (Beispieltabelle fur HOT)

CREATE TABLE hot_test (id INTEGER PRIMARY KEY, daten TEXT);

INSERT INTO hot_test (id, daten) VALUES (1, ’Datensatz’);

Beispiel (HOT - Ja)

UPDATE hot_test SET daten = ’etwas anderes’;

Beispiel (HOT - Nein)

UPDATE hot_test SET id = 2;

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 100: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Autovacuum

VACUUM automatisiert

PostgreSQL besitzt einen eingebauten Daemon namensautovacuum

Dieser uberpruft regelmaßig alle Datenbanken und enthalteneTabellen

Die Zeit zwischen zwei Laufen wird mittelsautovacuum naptime eingestellt

Der Daemon selbst wird mittels autovacuum ein- undausgeschaltet

Einzelne Tabellen in einer Datenbank konnen uber diepg autovacuum Tabelle konfiguriert werden

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 101: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Autovacuum

Konfiguration - kostenbasiertes VACUUM

vacuum cost delay : Anzahl Millisekunden fur die Ruhephasedes VACUUM-Befehls, 0 zum Deaktivieren (Default)

vacuum cost page hit: erwartete Kosten fur das VACUUMeines Blocks, der sich im Shared RAM befindet (1)

vacuum cost page miss: erwartete Kosten fur das VACUUMeines Blocks auf der Festplatte (10)

vacuum cost page dirty : erwartete Kosten, wenn ein vorhersauberer Block geschrieben werden muss (20)

vacuum cost limit: Kostenlimit fur eine Runde (200)

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 102: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Autovacuum

Konfiguration - kostenbasiertes Auto-VACUUM

autovacuum und track counts mussen aktiviert sein

autovacuum max workers: Anzahl gleichzeitiger VACUUMProzesse (3)

autovacuum naptime: Zeit zwischen Beenden einer und demPrufen der nachsten Datenbank (1min)

autovacuum vacuum cost delay : Anzahl Millisekunden fur dieRuhepause. Der Wert -1 fuhrt zur Nutzung vonvacuum cost delay (20)

autovacuum vacuum cost limit: Kostenlimit fur eine Runde,wird uber alle aktiven Worker verteilt. -1 fuhrt zur Nutzungvon vacuum cost limit (-1)

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 103: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Autovacuum

Konfiguration - kostenbasiertes Auto-VACUUM

autovacuum vacuum threshold : Anzahl der notwendigengeanderten Tuples fur VACUUM (50)

autovacuum analyze threshold : Anzahl der notwendigengeanderten Tuples fur ANALYZE (50)

autovacuum vacuum scale factor : Prozentwert uber dieTabellengroße, der zu autovacuum vacuum threshold addiertwird (0.2 - 20%)

autovacuum analyze scale factor : Prozentwert uber dieTabellengroße, der zu autovacuum analyze threshold addiertwird (0.1 - 10%)

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 104: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Autovacuum

VACUUM - Ubung

Die Datenbank mittels VACUUM ANALYZE VERBOSEaufraumen

Auf die Ausgaben (am Ende) fur die Anzahl benotigterEintrage fur die Free-Space-Map achten

Hinweis: In PostgreSQL 8.4 sind die FSM Einstellungen entfallen.

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 105: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Was sind Transaktionen?

Transaktionen

Transaktionen kapseln beliebig viele Aktionen in derDatenbank zu einer einzelnen Aktion nach außen

Beispiel: Bankuberweisung

Schritt 1: Geld wird von Ihrem Konto abgebucht

Schritt 2: Geld wird auf das andere Konto gebucht

Was passiert, wenn zwischen Schritt 1 und 2 ein Fehlerauftritt?

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 106: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Was bedeutet ACID?

Transaktionen - ACID

A C I D

A: Atomaritat (Atomicity) - ganz oder gar nicht

C: Konsistenz (Consistency) - Datenbestand ist vor und nachder Transaktion konsistent

I: Isolation (Isolation) - alle Aktionen (Transaktionen) sindvoneinander abgekapselt

D: Dauerhaftigkeit (Durability) - bestatigte Anderungenbleiben erhalten

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 107: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Wie nutzt man Transaktionen?

Transaktionen - Nutzung

Transaktion starten:

BEGIN oder START TRANSACTION

Transaktion abschließen:

COMMIT

Transaktion zuruckrollen:

ROLLBACK

Hinweis: PHP bietet keine eingebauten Funktionen furTransaktionen, Perl DBI kennt begin work, commit undrollback

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 108: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Isolation von Transaktionen

Isolation von Transaktionen

Beispiel:

Transaktion 1 startet mit eigener aktueller Ansicht derDatenbank (I - Isolation)

Transaktion 2 startet

Transaktion 2 andert einen Wert in einer Tabelle

Transaktion 2 committed ihre Anderungen, diese werdensichtbar

Aber: Transaktion 1 muss weiterhin den alten Wert sehenkonnen, da dieser beim Start der Transaktion gultig war

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 109: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Isolation von Transaktionen

Isolation von Transaktionen - Ubung

Zwei Verbindungen zur Datenbank offnen

Eine Tabelle erstellen

In beiden Verbindungen eine Transaktion starten

”SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;”anwenden

Den Inhalt der Tabelle in beiden Verbindungen anzeigen lassen

In einer Transaktion einen Datensatz einfugen

Den Inhalt der Tabelle in beiden Verbindungen anzeigen lassen

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 110: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Isolation von Transaktionen

Isolation von Transaktionen - Ubung

Beispiel (Isolation von Transaktionen)

CREATE TABLE transaktion_test (

id SERIAL NOT NULL

PRIMARY KEY,

wert VARCHAR NOT NULL

);

BEGIN;

SELECT * FROM transaktion_test;

INSERT INTO transaktion_test (wert) VALUES (’etwas Inhalt’);

SELECT * FROM transaktion_test;

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 111: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Isolation von Transaktionen

Isolation von Transaktionen - die Nachteile

Das notwendige Vorhalten alterer Versionen eines Datensatzeswird Multiversion Concurrency Control (kurz: MVCC)genannt

Diese alten Versionen belegen Platz auf der Festplatte und imIndex

Die Uberreste konnen mit dem Befehl VACUUM aufgeraumtwerden, Syntax:

VACUUM ANALYZE tabelle

Hinweis: VACUUM kann nicht innerhalb einer Transaktionstattfinden

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 112: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Isolation von Transaktionen

Isolation von Transaktionen - Transaktionslevel

SQL definiert 4 verschiedene Transaktionslevel:

READ UNCOMMITTED (in PG: READ COMMITTED)READ COMMITTEDREPEATABLE READ (in PG: SERIALIZABLE )SERIALIZABLE

PostgreSQL nutzt nur READ COMMITTED undSERIALIZABLE

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 113: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Isolation von Transaktionen

Isolation von Transaktionen - Transaktionslevel

Unterschiede zwischen READ COMMITTED undSERIALIZABLE :

READ COMMITTED: Daten, die vor dem Beginn des Query,aber nach Beginn der Transaktion sichtbar waren, werdenangezeigt

SERIALIZABLE : Nur Daten, die vor Beginn der Transaktionsichtbar waren, werden angezeigt

Hinweis: bei SERIALIZABLE kann es zuTransaktionsabbruchen kommen, die Applikation muss diesabfangen!

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 114: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Isolation von Transaktionen

Isolation von Transaktionen - Transaktionslevel

PostgreSQL Default: READ COMMITTED

Andern mit: SET TRANSACTION ISOLATION LEVELSERIALIZABLE

Befehl muss nach START TRANSACTION/BEGINaufgerufen werden

Die Einstellung kann nach der ersten Daten-anderndenAnweisung (inkl. SELECT ) nicht mehr geandert werden

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 115: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Vorteile einer Volltextsuche

Volltextsuche - Vorteile

Einen einzelnen Begriff in einem geschriebenen Text zu findenist kompliziert:

Das Wort konnte dekliniert oder konjugiert sein

Das Wort konnte in der Mehrzahl vorliegen

Diese Falle kann man mit einer simplen Suche mittels LIKEnicht abbilden

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 116: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Vorteile einer Volltextsuche

Volltextsuche

Die Losung: Volltextsuche

Der Text wird von einem Parser zerlegt und von einemStemmer normalisiert

Dem Stemmer muss die zu nutzende Sprache mitgeteiltwerden

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 117: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Beispiel fur eine Volltextsuche

Volltextsuche - Beispiel

Beispiel (Beispiel fur eine Volltextsuche)

CREATE TABLE volltextsuche (

id SERIAL NOT NULL

PRIMARY KEY,

text_deutsch TEXT NOT NULL,

text_geparst TSVECTOR

);

CREATE INDEX vt_suche ON volltextsuche USING gist(text_geparst);

INSERT INTO volltextsuche

(text_deutsch, text_geparst)

VALUES (’Ein Text ueber Katzen und Elefanten’,

to_tsvector(’german’,

’Ein Text ueber Katzen und Elefanten’));

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 118: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Beispiel fur eine Volltextsuche

Volltextsuche - Beispiel

Beispiel (Beispiel fur eine Volltextsuche)

SELECT id, text_deutsch

FROM volltextsuche

WHERE text_geparst @@ to_tsquery(’german’, ’Elefanten’);

SELECT id, text_deutsch

FROM volltextsuche

WHERE text_geparst @@ to_tsquery(’german’, ’Elefant & Katze’);

SELECT id, text_deutsch

FROM volltextsuche

WHERE text_geparst @@ to_tsquery(’german’, ’Elefant & Maus’);

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 119: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Beispiel fur eine Volltextsuche

Volltextsuche - Dokumentation

Zwei URLs mit weiteren Informationen zur Gestaltungkomplexer Anfragen

http://www.postgresql.org/docs/current/static/textsearch.html

http://rhodesmill.org/brandon/projects/tsearch2-guide.html

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 120: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Beispiel fur eine Volltextsuche

Volltextsuche - Ubung

Eine Funktion als Trigger erstellen, die die Spalte’text geparst’ automatisch fullt

Hinweis: Vorher mittels createlang plpgsql pl/pgSQLaktivieren

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 121: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Beispiel fur eine Volltextsuche

Volltextsuche - Beispiel

Beispiel (Trigger fur Volltextsuche)

CREATE OR REPLACE FUNCTION update_tsearch_vectors()

RETURNS TRIGGER

AS $$

DECLARE

BEGIN

NEW.text_geparst := to_tsvector(’german’, NEW.text_deutsch);

RETURN NEW;

END;

$$

LANGUAGE ’plpgsql’;

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 122: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Beispiel fur eine Volltextsuche

Volltextsuche - Beispiel

Beispiel (Trigger fur Volltextsuche)

CREATE TRIGGER vt_trigger

BEFORE INSERT OR UPDATE

ON volltextsuche FOR EACH ROW

EXECUTE PROCEDURE update_tsearch_vectors();

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 123: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Schulungen

Open Source School GmbH aus Munchen bietet PostgreSQLSchulungen an:

Administration von PostgreSQL

nachster Termin:

08. Juni - 10. Juni 2009

Nahere Infos unter:

http://www.opensourceschool.de

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 124: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

PostgreSQL Buch

PostgreSQL - Datenbankpraxisfur Anwender, Administratorenund Entwickler

Erscheint Mai 2009 im Ver-lag Open Source Press

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren

Page 125: PostgreSQL optimieren und mit Perl kombinieren · FSM - Free-Space-Map nicht angepasst Bei umfangreichen Operationen work mem erh¨ohen maintenance work mem kann mehr Speicher fu¨r

Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende

Ende

http://andreas.scherbaum.la/

Fragen?

Andreas ’ads’ Scherbaum <[email protected]>PostgreSQL User Group GermanyEuropean PostgreSQL User Group

Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren