Post on 26-Oct-2019
PostgreSQL optimieren und mit Perl kombinierenDeutscher Perl-Workshop 2009 - 25-27. Februar 2009
Andreas ’ads’ Scherbaum
Web: http://andreas.scherbaum.la/
E-Mail: ads@pgug.de
PGP: 9F67 73D3 43AA B30E CA8F 56E5 3002 8D24 4813 B5FE
25. Februar 2009
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Performance Konfiguration Analyse Informationen Perl VACUUM Transaktionen Volltextsuche Ende
Ende
http://andreas.scherbaum.la/
Fragen?
Andreas ’ads’ Scherbaum <ads@pgug.de>PostgreSQL User Group GermanyEuropean PostgreSQL User Group
Andreas ’ads’ Scherbaum PostgreSQL optimieren und mit Perl kombinieren