SlideShare ist ein Scribd-Unternehmen logo
Explain verstehen
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
Zielsetzung
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
EXPLAIN . . .
Was versucht uns PostgreSQL zu sagen?
Wie kann diese Information genutzt werden?
Wie erkenne ich Probleme?
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
Abfragen in PostgreSQL
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
Mehrstufige Ausf¨uhrung
Parser: Syntax wird ¨uberpr¨uft
Rewrite System: Rules, etc.
Optimizer: Erstellung eines Plans
Executor: Ausf¨uhrung des Plans
EXPLAIN hilft uns, dem Optimizer in die Karten zu schauen
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
Demo Daten
CREATE TABLE t_test (id serial, name text);
INSERT INTO t_test (name) SELECT ’hans’
FROM generate_series(1, 2000000);
INSERT INTO t_test (name) SELECT ’paul’
FROM generate_series(1, 2000000);
ANALYZE;
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
Ein einfacher Plan
test=# explain SELECT count(*) FROM t_test;
QUERY PLAN
------------------------------------------
Aggregate (cost=71622.00..71622.01 rows=1 width=0)
-> Seq Scan on t_test
(cost=0.00..61622.00 rows=4000000 width=0)
(2 rows)
Die Tabelle wird gelesen und aggregiert
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
Kosten
Kosten dienen zur Bewertung einer Query
Kosten k¨onnen nicht in Zeit umgerechnet werden
Jede Hardware liefert die exakt selben Zahlen
Der Optimizer ist konfigurierbar
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
seq page cost = 1
Wie teuer ist es, Bl¨ocke sequentiell zu lesen?
Erh¨oht man diesen Wert, werden Index Scans wahrscheinlicher
Senkt man diesen Wert, wird sequential I/O relativ gesehen
billiger
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
random page cost = 4
Auf mechanischen Platten ist Random I/O teurer als
sequentielle I/O
4 ist “falsch”:
Sind viele Daten gecacht, ist ein niedriger Wert besser
Ist nichts gecacht, ist ein wesentlich h¨oherer Wert besser
Im Mittel ist 4 nicht so schlecht.
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
cpu tuple cost = 0.01
Wie teuer ist es, eine Zeile mit der CPU zu bearbeiten?
Dieser Wert ist von der Breite der Zeile unabh¨angig.
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
cpu operator cost = 0.0025
Wie teuer ist es, einen Operator oder eine Funktion
aufzurufen?
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
cpu index tuple cost = 0.005
Wie teuer ist es, w¨ahrend einem Index Scan einen Index
Eintrag zu bearbeiten?
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
Ein Beispiel (1):
test=# SELECT pg_relation_size(’t_test’) / 8192.0;
?column?
--------------------
21622.000000000000
(1 row)
test=# SELECT 21622*1 + 4000000*0.01;
?column?
----------
61622.00
(1 row)
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
Ein Beispiel (2):
test=# SELECT 61622 + 4000000*0.0025;
?column?
------------
71622.0000
(1 row)
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
Zum Vergleich
test=# explain SELECT count(*) FROM t_test;
QUERY PLAN
------------------------------------------
Aggregate (cost=71622.00..71622.01 rows=1 width=0)
-> Seq Scan on t_test
(cost=0.00..61622.00 rows=4000000 width=0)
(2 rows)
Das sind exakt die Kosten aus dem Plan
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
Kostenparameter anpassen
K¨onnen zur Laufzeit angepasst werden.
“Korrekte” Parameter zu finden ist ziemlich schwierig.
In die Kosten einzugreifen kann risky sein.
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
Wie liest man einen Plan?
Immer von “innen nach außen”:
explain SELECT * FROM t_test
WHERE id > (SELECT avg(id) FROM t_test);
QUERY PLAN
-----------------------------------------------
Seq Scan on t_test (cost=71622.01..153244.01)
Filter: ((id)::numeric > $0)
InitPlan 1 (returns $0)
-> Aggregate (cost=71622.00..71622.01 rows=1)
-> Seq Scan on t_test t_test_1
(cost=0.00..61622.00 rows=4000000 width=4)
(5 rows)
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
Startup Costs
Startup Costs sagen, wie hoch die Kosten sind, bis
PostgreSQL die erste Zeile liefern kann.
Es ist quasi die zu leistende Vorarbeit.
F¨ur die praktische Arbeit sind total costs (f¨ur mich pers¨onlich)
relevanter.
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
EXPLAIN ANALYZE (1)
PostgreSQL f¨uhrt die Query aus
Mehr Information ¨uber die Laufzeit der Abfrage
Ideal, um “Soll” und “Ist” zu vergleichen
Tip: Sollte immer verwendet werden, wenn eine Abfrage
langsam erscheint.
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
EXPLAIN ANALYZE (2)
Command: EXPLAIN
Description: show the execution plan of a statement
Syntax:
EXPLAIN [ ( option [, ...] ) ] statement
EXPLAIN [ ANALYZE ] [ VERBOSE ] statement
where option can be one of:
ANALYZE [ boolean ] VERBOSE [ boolean ]
COSTS [ boolean ] BUFFERS [ boolean ]
TIMING [ boolean ]
FORMAT { TEXT | XML | JSON | YAML }
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
EXPLAIN ANALYZE bei der Arbeit (1)
test=# explain (ANALYZE true, VERBOSE true, COSTS true,
BUFFERS true, TIMING true)
SELECT * FROM t_test ORDER BY id;
Sort (cost=636977.37..646977.37 rows=4000000 width=9)
(actual time=1899.322..2306.699 rows=4000000 loops=1)
Output: id, name
Sort Key: t_test.id
Sort Method: external sort Disk: 74304kB
Buffers: shared hit=16005 read=5620,
temp read=9288 written=9288
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
EXPLAIN ANALYZE bei der Arbeit (2)
-> Seq Scan on public.t_test
(cost=0.00..61622.00 rows=4000000)
(actual time=7.469..396.204 rows=4000000 loops=1)
Output: id, name
Buffers: shared hit=16002 read=5620
Planning time: 0.037 ms
Execution time: 2530.554 ms
(10 rows)
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
Daten interpretieren
“external sort Disk”?
Ist am work mem etwas faul?
Fehlt ein Index?
shared hit + read:
Wie gut ist die Cache Hit Rate?
Hohe “shared read” k¨onnen bei Index Scans auf teure Random
I/O hindeuten
Stimmen die Sch¨atzungen und die Realit¨at ¨uberein?
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
Fehlsch¨atzungen
In komplexeren Statements k¨onnen Fehlsch¨atzungen passieren.
Wenn der Optimizer den falschen Plan w¨ahlt, kann das zu
einem Disaster f¨uhren.
H¨aufige Probleme:
Falsch gesch¨atze Funktion (kann weitgehend korrigiert werden)
Vollkommen untersch¨atzte Nested Loops
Cross Column Correlation
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
Ein Beispiel: Funktionen
test=# explain SELECT id
FROM generate_series(1, 10000000) AS id
GROUP BY 1;
QUERY PLAN
-----------------------------------------------------
HashAggregate (cost=12.50..14.50 rows=200 width=4)
Group Key: id
-> Function Scan on generate_series id
(cost=0.00..10.00 rows=1000 width=4)
(3 rows)
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
Ein Beispiel: Nested Loops
test=# explain analyze SELECT * FROM pg_stats;
QUERY PLAN
----------------------------------------------------------
Nested Loop Left Join (cost=64.28..157.15 rows=6)
(actual time=2.814..8.408 rows=434)
-> Hash Join (cost=64.15..155.45 rows=6 width=475)
(actual time=2.532..7.241 rows=434 loops=1)
Hash Cond: ((a.attrelid = c.oid) AND ...
Join Filter: has_column_privilege(c.oid, a.attnum,
’select’::text)
-> Seq Scan on pg_attribute a (... rows=2519 ...)
(actual time=0.006..4.101 rows=2519 loops=1)
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
Beispiel: Cross Column Correlation
PostgreSQL h¨alt Statistiken f¨ur jede Spalte
Fragestellung:
10% aller Patienten haben Hodenkrebs
50% aller Patienten sind M¨anner
Wieviele m¨annliche Patienten haben Hodenkrebs?
Normalerweise m¨usste man nur die Wahrscheinlichkeiten
multiplizieren.
Die Daten sind jedoch nicht statistisch unabh¨angig
Das kann b¨ose Sch¨atzfehler geben
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
Pl¨ane und Loops (1):
Eine einfache (ineffiziente) Abfrage:
test=# explain analyze SELECT *,
(SELECT min(id)
FROM t_test
WHERE t_test.id = a.id)
FROM t_test AS a LIMIT 100;
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
Pl¨ane und Loops (2):
Limit (actual time=0.298..2.052 rows=100 loops=1)
-> Seq Scan on t_test a (... rows=100 loops=1)
SubPlan 2
-> Result (... rows=1 loops=100)
InitPlan 1 (returns $1)
-> Limit (... rows=1 loops=100)
-> Seq Scan on t_test
(... rows=1 loops=100)
Filter: ((id IS NOT NULL) AND (id = a.id))
Rows Removed by Filter: 50
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
Finally . . .
Hans-J¨urgen Sch¨onig
www.postgresql-support.de
Contact us . . .
Cybertec Sch¨onig & Sch¨onig GmbH
Gr¨ohrm¨uhlgasse 26
A-2700 Wiener Neustadt, Austria
More than 15 years of PostgreSQL experience:
Training
Consulting
24x7 support
Hans-J¨urgen Sch¨onig
www.postgresql-support.de

Weitere ähnliche Inhalte

Andere mochten auch

Walbouncer: Filtering PostgreSQL transaction log
Walbouncer: Filtering PostgreSQL transaction logWalbouncer: Filtering PostgreSQL transaction log
Walbouncer: Filtering PostgreSQL transaction logHans-Jürgen Schönig
 
PostgreSQL: Joining 1 million tables
PostgreSQL: Joining 1 million tablesPostgreSQL: Joining 1 million tables
PostgreSQL: Joining 1 million tablesHans-Jürgen Schönig
 
PostgreSQL instance encryption: More database security
PostgreSQL instance encryption: More database securityPostgreSQL instance encryption: More database security
PostgreSQL instance encryption: More database securityHans-Jürgen Schönig
 
PostgreSQL: Data analysis and analytics
PostgreSQL: Data analysis and analyticsPostgreSQL: Data analysis and analytics
PostgreSQL: Data analysis and analyticsHans-Jürgen Schönig
 

Andere mochten auch (7)

Walbouncer: Filtering PostgreSQL transaction log
Walbouncer: Filtering PostgreSQL transaction logWalbouncer: Filtering PostgreSQL transaction log
Walbouncer: Filtering PostgreSQL transaction log
 
PostgreSQL: The NoSQL way
PostgreSQL: The NoSQL wayPostgreSQL: The NoSQL way
PostgreSQL: The NoSQL way
 
PostgreSQL: Joining 1 million tables
PostgreSQL: Joining 1 million tablesPostgreSQL: Joining 1 million tables
PostgreSQL: Joining 1 million tables
 
PostgreSQL instance encryption: More database security
PostgreSQL instance encryption: More database securityPostgreSQL instance encryption: More database security
PostgreSQL instance encryption: More database security
 
PostgreSQL Replication Tutorial
PostgreSQL Replication TutorialPostgreSQL Replication Tutorial
PostgreSQL Replication Tutorial
 
PostgreSQL: Advanced indexing
PostgreSQL: Advanced indexingPostgreSQL: Advanced indexing
PostgreSQL: Advanced indexing
 
PostgreSQL: Data analysis and analytics
PostgreSQL: Data analysis and analyticsPostgreSQL: Data analysis and analytics
PostgreSQL: Data analysis and analytics
 

Ähnlich wie Explain explain

Komplex und schnell_20_min
Komplex und schnell_20_minKomplex und schnell_20_min
Komplex und schnell_20_minmiracee
 
Java Streams und Lambdas
Java Streams und LambdasJava Streams und Lambdas
Java Streams und LambdasNane Kratzke
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeFrank Müller
 
JdbcTemplate aus Spring
JdbcTemplate aus SpringJdbcTemplate aus Spring
JdbcTemplate aus Springtutego
 
Ausgewählte PL/SQL Packages (3)
Ausgewählte PL/SQL Packages (3)Ausgewählte PL/SQL Packages (3)
Ausgewählte PL/SQL Packages (3)Ulrike Schwinn
 
Differenzial Analyse in der Praxis (Florian Walther)
Differenzial Analyse in der Praxis (Florian Walther)Differenzial Analyse in der Praxis (Florian Walther)
Differenzial Analyse in der Praxis (Florian Walther)GEEKcon
 
SQL Tuning Sets: Generieren, Verwenden, Transferieren, Szenarios
SQL Tuning Sets: Generieren, Verwenden, Transferieren, Szenarios SQL Tuning Sets: Generieren, Verwenden, Transferieren, Szenarios
SQL Tuning Sets: Generieren, Verwenden, Transferieren, Szenarios Ulrike Schwinn
 
Oracle Performance-Analyse mit frei verfügbaren Mitteln
Oracle Performance-Analyse mit frei verfügbaren Mitteln Oracle Performance-Analyse mit frei verfügbaren Mitteln
Oracle Performance-Analyse mit frei verfügbaren Mitteln OPITZ CONSULTING Deutschland
 
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der BanensoftwareBei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der BanensoftwareSAP SE
 
PureSQL APEX Connect
PureSQL APEX ConnectPureSQL APEX Connect
PureSQL APEX ConnectTrivadis
 
Pure SQL for batch processing
Pure SQL for batch processingPure SQL for batch processing
Pure SQL for batch processingAndrej Pashchenko
 
Oracle Old Features DOAG 2011
Oracle Old Features DOAG 2011Oracle Old Features DOAG 2011
Oracle Old Features DOAG 2011Uwe Küchler
 
Funktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit ScalaFunktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit Scalathoherr
 
TYPO3 coding guidelines
TYPO3 coding guidelinesTYPO3 coding guidelines
TYPO3 coding guidelinesAlex Kellner
 
Performance trotz Entity Framwork
Performance trotz Entity FramworkPerformance trotz Entity Framwork
Performance trotz Entity FramworkAndré Krämer
 
Komponententests und Testabdeckung
Komponententests und TestabdeckungKomponententests und Testabdeckung
Komponententests und TestabdeckungChristian Baranowski
 
TYPO3 CMS 7.4 - Die Neuerungen - pluswerk
TYPO3 CMS 7.4 - Die Neuerungen - pluswerkTYPO3 CMS 7.4 - Die Neuerungen - pluswerk
TYPO3 CMS 7.4 - Die Neuerungen - pluswerkdie.agilen GmbH
 

Ähnlich wie Explain explain (20)

Komplex und schnell_20_min
Komplex und schnell_20_minKomplex und schnell_20_min
Komplex und schnell_20_min
 
Java Streams und Lambdas
Java Streams und LambdasJava Streams und Lambdas
Java Streams und Lambdas
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare Systeme
 
Microbenchmarks - Wer nicht weiß, was er misst misst Mist
Microbenchmarks - Wer nicht weiß, was er misst misst MistMicrobenchmarks - Wer nicht weiß, was er misst misst Mist
Microbenchmarks - Wer nicht weiß, was er misst misst Mist
 
JdbcTemplate aus Spring
JdbcTemplate aus SpringJdbcTemplate aus Spring
JdbcTemplate aus Spring
 
Ausgewählte PL/SQL Packages (3)
Ausgewählte PL/SQL Packages (3)Ausgewählte PL/SQL Packages (3)
Ausgewählte PL/SQL Packages (3)
 
Differenzial Analyse in der Praxis (Florian Walther)
Differenzial Analyse in der Praxis (Florian Walther)Differenzial Analyse in der Praxis (Florian Walther)
Differenzial Analyse in der Praxis (Florian Walther)
 
SQL Tuning Sets: Generieren, Verwenden, Transferieren, Szenarios
SQL Tuning Sets: Generieren, Verwenden, Transferieren, Szenarios SQL Tuning Sets: Generieren, Verwenden, Transferieren, Szenarios
SQL Tuning Sets: Generieren, Verwenden, Transferieren, Szenarios
 
Oracle Performance-Analyse mit frei verfügbaren Mitteln
Oracle Performance-Analyse mit frei verfügbaren Mitteln Oracle Performance-Analyse mit frei verfügbaren Mitteln
Oracle Performance-Analyse mit frei verfügbaren Mitteln
 
Bei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der BanensoftwareBei uns testen lauter Affen - Das Ende der Banensoftware
Bei uns testen lauter Affen - Das Ende der Banensoftware
 
PureSQL APEX Connect
PureSQL APEX ConnectPureSQL APEX Connect
PureSQL APEX Connect
 
Pure SQL for batch processing
Pure SQL for batch processingPure SQL for batch processing
Pure SQL for batch processing
 
Oracle Old Features DOAG 2011
Oracle Old Features DOAG 2011Oracle Old Features DOAG 2011
Oracle Old Features DOAG 2011
 
Typescript
TypescriptTypescript
Typescript
 
Funktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit ScalaFunktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit Scala
 
TYPO3 coding guidelines
TYPO3 coding guidelinesTYPO3 coding guidelines
TYPO3 coding guidelines
 
Pyparsing
PyparsingPyparsing
Pyparsing
 
Performance trotz Entity Framwork
Performance trotz Entity FramworkPerformance trotz Entity Framwork
Performance trotz Entity Framwork
 
Komponententests und Testabdeckung
Komponententests und TestabdeckungKomponententests und Testabdeckung
Komponententests und Testabdeckung
 
TYPO3 CMS 7.4 - Die Neuerungen - pluswerk
TYPO3 CMS 7.4 - Die Neuerungen - pluswerkTYPO3 CMS 7.4 - Die Neuerungen - pluswerk
TYPO3 CMS 7.4 - Die Neuerungen - pluswerk
 

Explain explain

  • 3. EXPLAIN . . . Was versucht uns PostgreSQL zu sagen? Wie kann diese Information genutzt werden? Wie erkenne ich Probleme? Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 4. Abfragen in PostgreSQL Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 5. Mehrstufige Ausf¨uhrung Parser: Syntax wird ¨uberpr¨uft Rewrite System: Rules, etc. Optimizer: Erstellung eines Plans Executor: Ausf¨uhrung des Plans EXPLAIN hilft uns, dem Optimizer in die Karten zu schauen Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 6. Demo Daten CREATE TABLE t_test (id serial, name text); INSERT INTO t_test (name) SELECT ’hans’ FROM generate_series(1, 2000000); INSERT INTO t_test (name) SELECT ’paul’ FROM generate_series(1, 2000000); ANALYZE; Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 7. Ein einfacher Plan test=# explain SELECT count(*) FROM t_test; QUERY PLAN ------------------------------------------ Aggregate (cost=71622.00..71622.01 rows=1 width=0) -> Seq Scan on t_test (cost=0.00..61622.00 rows=4000000 width=0) (2 rows) Die Tabelle wird gelesen und aggregiert Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 8. Kosten Kosten dienen zur Bewertung einer Query Kosten k¨onnen nicht in Zeit umgerechnet werden Jede Hardware liefert die exakt selben Zahlen Der Optimizer ist konfigurierbar Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 9. seq page cost = 1 Wie teuer ist es, Bl¨ocke sequentiell zu lesen? Erh¨oht man diesen Wert, werden Index Scans wahrscheinlicher Senkt man diesen Wert, wird sequential I/O relativ gesehen billiger Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 10. random page cost = 4 Auf mechanischen Platten ist Random I/O teurer als sequentielle I/O 4 ist “falsch”: Sind viele Daten gecacht, ist ein niedriger Wert besser Ist nichts gecacht, ist ein wesentlich h¨oherer Wert besser Im Mittel ist 4 nicht so schlecht. Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 11. cpu tuple cost = 0.01 Wie teuer ist es, eine Zeile mit der CPU zu bearbeiten? Dieser Wert ist von der Breite der Zeile unabh¨angig. Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 12. cpu operator cost = 0.0025 Wie teuer ist es, einen Operator oder eine Funktion aufzurufen? Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 13. cpu index tuple cost = 0.005 Wie teuer ist es, w¨ahrend einem Index Scan einen Index Eintrag zu bearbeiten? Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 14. Ein Beispiel (1): test=# SELECT pg_relation_size(’t_test’) / 8192.0; ?column? -------------------- 21622.000000000000 (1 row) test=# SELECT 21622*1 + 4000000*0.01; ?column? ---------- 61622.00 (1 row) Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 15. Ein Beispiel (2): test=# SELECT 61622 + 4000000*0.0025; ?column? ------------ 71622.0000 (1 row) Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 16. Zum Vergleich test=# explain SELECT count(*) FROM t_test; QUERY PLAN ------------------------------------------ Aggregate (cost=71622.00..71622.01 rows=1 width=0) -> Seq Scan on t_test (cost=0.00..61622.00 rows=4000000 width=0) (2 rows) Das sind exakt die Kosten aus dem Plan Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 17. Kostenparameter anpassen K¨onnen zur Laufzeit angepasst werden. “Korrekte” Parameter zu finden ist ziemlich schwierig. In die Kosten einzugreifen kann risky sein. Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 18. Wie liest man einen Plan? Immer von “innen nach außen”: explain SELECT * FROM t_test WHERE id > (SELECT avg(id) FROM t_test); QUERY PLAN ----------------------------------------------- Seq Scan on t_test (cost=71622.01..153244.01) Filter: ((id)::numeric > $0) InitPlan 1 (returns $0) -> Aggregate (cost=71622.00..71622.01 rows=1) -> Seq Scan on t_test t_test_1 (cost=0.00..61622.00 rows=4000000 width=4) (5 rows) Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 19. Startup Costs Startup Costs sagen, wie hoch die Kosten sind, bis PostgreSQL die erste Zeile liefern kann. Es ist quasi die zu leistende Vorarbeit. F¨ur die praktische Arbeit sind total costs (f¨ur mich pers¨onlich) relevanter. Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 20. EXPLAIN ANALYZE (1) PostgreSQL f¨uhrt die Query aus Mehr Information ¨uber die Laufzeit der Abfrage Ideal, um “Soll” und “Ist” zu vergleichen Tip: Sollte immer verwendet werden, wenn eine Abfrage langsam erscheint. Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 21. EXPLAIN ANALYZE (2) Command: EXPLAIN Description: show the execution plan of a statement Syntax: EXPLAIN [ ( option [, ...] ) ] statement EXPLAIN [ ANALYZE ] [ VERBOSE ] statement where option can be one of: ANALYZE [ boolean ] VERBOSE [ boolean ] COSTS [ boolean ] BUFFERS [ boolean ] TIMING [ boolean ] FORMAT { TEXT | XML | JSON | YAML } Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 22. EXPLAIN ANALYZE bei der Arbeit (1) test=# explain (ANALYZE true, VERBOSE true, COSTS true, BUFFERS true, TIMING true) SELECT * FROM t_test ORDER BY id; Sort (cost=636977.37..646977.37 rows=4000000 width=9) (actual time=1899.322..2306.699 rows=4000000 loops=1) Output: id, name Sort Key: t_test.id Sort Method: external sort Disk: 74304kB Buffers: shared hit=16005 read=5620, temp read=9288 written=9288 Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 23. EXPLAIN ANALYZE bei der Arbeit (2) -> Seq Scan on public.t_test (cost=0.00..61622.00 rows=4000000) (actual time=7.469..396.204 rows=4000000 loops=1) Output: id, name Buffers: shared hit=16002 read=5620 Planning time: 0.037 ms Execution time: 2530.554 ms (10 rows) Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 24. Daten interpretieren “external sort Disk”? Ist am work mem etwas faul? Fehlt ein Index? shared hit + read: Wie gut ist die Cache Hit Rate? Hohe “shared read” k¨onnen bei Index Scans auf teure Random I/O hindeuten Stimmen die Sch¨atzungen und die Realit¨at ¨uberein? Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 25. Fehlsch¨atzungen In komplexeren Statements k¨onnen Fehlsch¨atzungen passieren. Wenn der Optimizer den falschen Plan w¨ahlt, kann das zu einem Disaster f¨uhren. H¨aufige Probleme: Falsch gesch¨atze Funktion (kann weitgehend korrigiert werden) Vollkommen untersch¨atzte Nested Loops Cross Column Correlation Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 26. Ein Beispiel: Funktionen test=# explain SELECT id FROM generate_series(1, 10000000) AS id GROUP BY 1; QUERY PLAN ----------------------------------------------------- HashAggregate (cost=12.50..14.50 rows=200 width=4) Group Key: id -> Function Scan on generate_series id (cost=0.00..10.00 rows=1000 width=4) (3 rows) Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 27. Ein Beispiel: Nested Loops test=# explain analyze SELECT * FROM pg_stats; QUERY PLAN ---------------------------------------------------------- Nested Loop Left Join (cost=64.28..157.15 rows=6) (actual time=2.814..8.408 rows=434) -> Hash Join (cost=64.15..155.45 rows=6 width=475) (actual time=2.532..7.241 rows=434 loops=1) Hash Cond: ((a.attrelid = c.oid) AND ... Join Filter: has_column_privilege(c.oid, a.attnum, ’select’::text) -> Seq Scan on pg_attribute a (... rows=2519 ...) (actual time=0.006..4.101 rows=2519 loops=1) Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 28. Beispiel: Cross Column Correlation PostgreSQL h¨alt Statistiken f¨ur jede Spalte Fragestellung: 10% aller Patienten haben Hodenkrebs 50% aller Patienten sind M¨anner Wieviele m¨annliche Patienten haben Hodenkrebs? Normalerweise m¨usste man nur die Wahrscheinlichkeiten multiplizieren. Die Daten sind jedoch nicht statistisch unabh¨angig Das kann b¨ose Sch¨atzfehler geben Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 29. Pl¨ane und Loops (1): Eine einfache (ineffiziente) Abfrage: test=# explain analyze SELECT *, (SELECT min(id) FROM t_test WHERE t_test.id = a.id) FROM t_test AS a LIMIT 100; Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 30. Pl¨ane und Loops (2): Limit (actual time=0.298..2.052 rows=100 loops=1) -> Seq Scan on t_test a (... rows=100 loops=1) SubPlan 2 -> Result (... rows=1 loops=100) InitPlan 1 (returns $1) -> Limit (... rows=1 loops=100) -> Seq Scan on t_test (... rows=1 loops=100) Filter: ((id IS NOT NULL) AND (id = a.id)) Rows Removed by Filter: 50 Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 31. Finally . . . Hans-J¨urgen Sch¨onig www.postgresql-support.de
  • 32. Contact us . . . Cybertec Sch¨onig & Sch¨onig GmbH Gr¨ohrm¨uhlgasse 26 A-2700 Wiener Neustadt, Austria More than 15 years of PostgreSQL experience: Training Consulting 24x7 support Hans-J¨urgen Sch¨onig www.postgresql-support.de