Eine Reise durch den PostgreSQL Optimizer



Ähnliche Dokumente
Explain verstehen. Hans-Jürgen Schönig.

Indexing und Performance Tuning

ANFRAGEOPTIMIERUNG IN POSTGRESQL

Performance Probleme aufspüren

Urs Meier Art der Info Technical Info (Februar 2002) Aus unserer Projekterfahrung und Forschung

SQL für Trolle. mag.e. Dienstag, Qt-Seminar

SQL. strukturierte Datenbankabfragesprache eine Datenbanksprache zur. Structured Query Language:

MIN oder MAX Bildung per B*Tree Index Hint

Informatik 12 Datenbanken SQL-Einführung

Mengenvergleiche: Alle Konten außer das, mit dem größten Saldo.

IV. Datenbankmanagement

SQL Optimizer und SQL Performance

Die bisher bereits bekannten Aggregatsfunktionen MIN, MAX, SUM, AVG, COUNT, VARIANCE und STDDEV wurden um FIRST und LAST erweitert.

Vielen Dank an Dennis Riehle für die Bereitstellung dieser Folien

Prozedurale Datenbank- Anwendungsprogrammierung

DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER

PostgreSQL Ein Überblick

Referenzielle Integrität SQL

Aufbau des SELECT-Befehls. Im Folgenden werden zunächst Abfragen aus einer Tabelle vorgenommen.

7. Übung - Datenbanken

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

SQL. Fortgeschrittene Konzepte Auszug

Nachtrag: Farben. Farbblindheit. (Light und Bartlein 2004)

SQL-Optimizer und Optimierung bei DB2

OPERATIONEN AUF EINER DATENBANK

PostgreSQL in großen Installationen

Einführung in SQL. 1. Grundlagen SQL. Structured Query Language. Viele Dialekte. Unterteilung: i. DDL (Data Definition Language)

SQL SQL. SQL = Structured Query Language (SEQUEL) IBM San Jose Research Laboratory SYSTEM R. Grundlagen der Datenbanksysteme I

mit Musterlösungen Prof. Dr. Gerd Stumme, Dipl.-Inform. Christoph Schmitz 11. Juni 2007

Datenbanktechnologie mit praktischen Übungen in MySQL und PHP

Universität Augsburg, Institut für Informatik WS 2006/2007 Dr. W.-T. Balke 27. Nov M. Endres, A. Huhn, T. Preisinger Lösungsblatt 5

Access [basics] Gruppierungen in Abfragen. Beispieldatenbank. Abfragen gruppieren. Artikel pro Kategorie zählen

Oracle: Abstrakte Datentypen:

Dynamisches SQL. Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München

Das SQL-Schlüsselwort ALL entspricht dem Allquantor der Prädikatenlogik

SQL structured query language

Datenbanksysteme 2 Frühjahr-/Sommersemester Mai 2014

SQL Performance - Tips Do's & Don'ts

DBS ::: SERIE 5. Join Right Semi- Join Left Semi-Join Projektion Selektion Fremdschlüssel. Kreuzprodukt

Programmieren für mobile Endgeräte SS 2013/2014. Dozenten: Patrick Förster, Michael Hasseler

Kurzanleitung für Umsteiger von DataEase.

Einführung in SQL. Sprachumfang: Indizes. Datensätzen. Zugriffsrechten

PostgreSQL auf vielen CPUs. Hans-Jürgen Schönig Hans-Jürgen Schönig

Whitepaper. Produkt: combit Relationship Manager 7. combit Relationship Manager -rückläufer Script. combit GmbH Untere Laube Konstanz

PostgreSQL Wartungsstrategien

Eine völlig andere Form Abfragen zu erstellen ist, sie mit Hilfe der Datenbankabfragesprache SQL zu gestalten.

Whitepaper. Produkt: combit Relationship Manager. Einbindung externer FiBu-/Warenwirtschaftsdaten. combit GmbH Untere Laube Konstanz

Tuning von PostGIS mit Read- Only-Daten von OpenStreetMap

Art der Info: Technische Background Info Teil 2 (April 2002)

Performance in der Oracle Datenbank von Anfang an

Oracle 9i Einführung Performance Tuning

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Algorithmen und Datenstrukturen

Ein Ausflug zu ACCESS

Leitfaden #1a. "zanox Publisher-Statistik" (next generation)

SQL-Injection. Seite 1 / 16

Kapitel 33. Der xml-datentyp. In diesem Kapitel: Der xml-datentyp 996 Abfragen aus xml-datentypen 1001 XML-Indizierung 1017 Zusammenfassung 1023

SQL Teil 2. SELECT Projektion Selektion Vereinigung, Schnitt, Differenz Verbund Komplexer SELECT-Ausdruck

SQL und MySQL. Kristian Köhntopp

Grundlagen der Künstlichen Intelligenz

Data Cube. Aggregation in SQL. Beispiel: Autoverkäufe. On-line Analytical Processing (OLAP) 1. Einführung. 2. Aggregation in SQL, GROUP BY

3 Richtlinienbasierte Verwaltung und Multi-Server- Administration

MySQL: Einfaches Rechnen.

Abfragen: Grundbausteine

ALP I. Funktionale Programmierung

SQL. SQL = Structured Query Language, ist eine standardisierte Sprache zum Gebrauch im Zusammenhang mit Datenbanken.

Bibliografische Informationen digitalisiert durch

Carl-Engler-Schule Karlsruhe Datenbank 1 (5)

Sichten II. Definition einer Sicht. Sichten. Drei-Ebenen-Schema-Architektur. Vorteile Vereinfachung von Anfragen Strukturierung der Datenbank

Fakultät für Informatik & Wirtschaftsinformatik DB & IS II - SS Metadaten

Beispiel 1: Filmdatenbank

Details zu den Ausdrücken nach FROM, WHERE, GROUP BY und HAVING finden Sie in den Abschnitten über JOIN, WHERE und GROUP BY.

Listener: Bei Oracle erfolgt die Steuerung (konventionell) via listener.ora (Listener Konfiguration), tnsnames.ora (Client Konfiguration)

Datenbanken mit OpenOffice-Base Tabellen und einfache Abfragen

Fachhochschule Deggendorf Platzziffer:...

Felder. November 5, 2014

SQL: statische Integrität

Universität Duisburg-Essen Informationssysteme Prof. Dr.-Ing. N. Fuhr. Praktikum Datenbanken / DB2 Woche 8: Trigger, SQL-PL

Die PostgreSQL Performance Schnelldiagnose

Leseprobe: SQL mit MySQL - Band 4 Kompendium mit Online-Übungs-DB. Kompendium zur schnellen Kurzinformation der Datenbanksprache SQL/MySQL 5.

Aufgabensammlung SQL SW4 1. Einfache Anfragen

Vorlesung Dokumentation und Datenbanken Klausur

JooLIMS. Manueller Import

Beheben von verlorenen Verknüpfungen

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

SQL Tutorial. SQL - Tutorial SS 06. Hubert Baumgartner. INSO - Industrial Software

SQL - Übungen Bearbeitung der Datenbank Personal (1)

Datumsangaben, enthält mindestens Jahr, Monat, Tag

Simplex-Umformung für Dummies

Performanceanalyse der Artikeldarstellung

Datenbanken SQL Einführung Datenbank in MySQL einrichten mit PhpMyAdmin

Unterabfragen (Subqueries)

Indizierungs- und Suchlogs. Version 2015

11 Funktionen Vorteile von Funktionen. Leseprobe aus Access und SQL Server

Professionelle Seminare im Bereich MS-Office

Views in SQL. 2 Anlegen und Verwenden von Views 2

Übungsblatt 8- Lösungsvorschlag

PostgreSQL und memcached

Transkript:

11. November 2011

Am Anfang steht SQL SQL = Structured Query Language Eigentlich ein Eigenname Standardisiert, stetige Weiterentwicklung (SQL99, SQL 2003, SQL 2008, SQL/MED) Deklarativ, Beschreibend KEIN(!) Programmcode

Optimizer? Planer? Finde einen möglichst effizienten Weg um das gewünschte Resultat korrekt zu liefern Optimizer ein wenig missverständlich Planen und optimieren Liefert Arbeitsanweisungen für den Executor Fasst diese in einen möglichst effizienten Plan zusammen Kritischer Faktor: Aufwand um mögliche Arbeitsschritte zu einem guten Plan zu kombinieren

Was passiert im Datenbankserver?

Der Planer (1) Planer erhält Query aus dem Rewriter Drei Phasen: 1 Preprocessing Phase (Subqueries, Aggregates, WHERE-clauses) 2 Ermitteln der JOIN-Zugriffspfade (Pfad) 3 Zusammenfassen der Planknoten, Ausgabe als Plan Ein Plan ist das Ergebnis der möglichst günstigsten Kombination der einzelnen Zugriffspfade (Nodes) Ggf. rekursive Aufrufe des Planers (Subqueries, SubPlan) Unterschiedliche Methoden für Phase zwei.

Der Planer (3) Exhaustive Search SELECT * FROM a, b, c, d WHERE a.col = b.col AND a.col = c.col AND a.col = d.col; {a,b} {a,c} {a,d}... -> {a,b,c} {d} -> {d} {a,b,c} -> {a,b} {c,d}... Annährend Erschöpfend from collapse limit: Umschreiben von Subqueries in JOIN-Liste (Flattening) join collapse limit: Umsortieren von expliziten JOINs

Der Planer (4) GEQO (Genetic Query Optimizer) Semi-Randomisierte Suche Non-deterministische Auswahl (Änderungen in 9.0) Gute Gene (Planknoten) werden rekombiniert... die fittesten Gene gewinnen

Wie macht der Planer das? Heranziehen vermuteter Ergebniszeilen (pg class.reltuples) Ggf. interpolieren auf Anzahl aktueller phyiskalischer Blöcke (pg class.relpages) Kosten für Planknoten (bspw. Selektivität für Indexscan usw.)... und nimmt den billigsten.

Wie weiß der Planer das? Statistiken, von ANALYZE gesammelt Tabellenspezifische Kosten (pg class.reltuples, pg class.relpages Spaltenstatistiken (pg statistic, pg stats) Verstellbare Kostenparameter

Kostenparameter 1 seq page cost: I/O-Kosten für einen sequentiellen Block-Lesevorgang 2 random page cost: I/O-Kosten für einen zufälligen Block-Lesevorgang 3 effective cache size: Beeinflusst angenomme Cachegröße und damit Auswahl von Indexscans 4 cpu tuple cost: CPU-Kosten für das Verarbeiten einer Zeile einer Tabelle 5 cpu index tuple cost: CPU-Kosten für das Verarbeiten einer Zeile eines Indexes. 6 cpu operator cost: Operator- und/oder Prozedurkosten einer CPU. 7 cpu tuple fraction: Anteil des ersten Tupel aus einem Cursor

Kostenberechnung (1) Die Kostenfaktoren beeinflussen die Kostenberechnung. Für einen Sequential Scan erfolgt diese beispielhaft wie folgt: Endkosten = (Anzahl Blöcke * seq_page_cost) + (Anzahl Tupel * cpu_tuple_cost) Startkosten sind 0.00, da keine Maßnahmen für das Erzeugen des Planknotens nötig sind.

Kostenberechnung (2) Neben diesem (einfachen) I/O-Kostenmodell verfügt der Planer über weitere, tiefgreifende Statistiken pg stats enthält mittels ANALYZE ermittelte Statistiken pro Tabelle und zugehörender Spalte null fraq: Anteil NULL-Werte avg width: Durchschnittliche Größe in Bytes n distinct: Unterschiedliche Werte einer Spalte most common vals: Häufigste Werte most common freqs: Selektivität der häufigsten Werte histogram bounds: Gruppierung der Spaltenwerte in ungefähr gleich große Gruppen correlation: Verteilung der Daten auf der Platte

Kostenberechnung (3) SELECT * FROM pg_stats WHERE tablename = tenk1 AND attname = hundred ; -[ RECORD 1 ]-----+------------------------------------------ schemaname public tablename tenk1 attname hundred null_frac 0 avg_width 4 n_distinct 100 most_common_vals {41,26,64,97} most_common_freqs {0.0136667,0.0133333,0.0133333,0.0126667} histogram_bounds {0,10,19,30,39,50,60,70,79,89,99} correlation 0.0156366

Pläne lesen (1) Plan besteht aus Planknoten: jeweils eine in sich abgeschlossene Arbeitseinheit Die Schachtelung gibt die jeweilige Abhängigkeit wieder Plan erfolgt Top-Down : Der oberste Planknoten ist der Einstiegspunkt Jeder Plan definiert Start-, Endkosten, geschätzte Anzahl Zeilen und die Größe einer Ergebniszeile

Pläne lesen (2) Jeder Planknoten enthält: cost = Startkosten...Endkosten rows = Geschätzte Anzahl Zeilen width = Durschn. Größe einer Zeile EXPLAIN ANALYZE fügt hinzu: actual time = Startzeit...Endzeit rows = Tatsächliche Anzahl Zeilen loops = Wie oft wurde dieser Planknoten ausgeführt Daneben gibt es weitere Angaben wie z.b. Trigger, Hauptspeicher usw.

Algorithmen im Detail - SeqScan Seq Scan (Sequential Table Scan): EXPLAIN SELECT t1.* FROM tenk1 t1 WHERE t1.unique2 > 100; Seq Scan on tenk1 t1 (cost=0.00..483.00 rows=9899 width=244) Filter: (unique2 > 100)

Algorithmen im Detail - Nested Loop (1) EXPLAIN ANALYZE SELECT t1.* FROM tenk1 t1 JOIN tenk2 t2 ON (t1.unique1 = t2.unique1) WHERE t2.unique2 > 100; Nested Loop (cost=0.00..4795.00 rows=9899 width=244) (actual time=60.151..182.590 rows=9899 loops=1) -> Seq Scan on tenk1 t1 (cost=0.00..458.00 rows=10000 width=244) (actual time=0.010..8.628 rows=10000 loops= -> Index Scan using tenk2_unique1 on tenk2 t2 (cost=0.00..0.42 rows=1 width=4) (actual time=0.015..0.015 rows=1 loops=10000) Index Cond: (t2.unique1 = t1.unique1) Filter: (t2.unique2 > 100)

Algorithmen im Detail - Nested Loop (2) 1 Outer = Äußere Tabelle, Inner = Innere Tabelle 2 Günstigste Anordnung wird durch den Optimizer bestimmt 3 Äußere Schleife einmal, für jede Zeile wird die Innere Schleife jeweils durchsucht (Aufwand n * m) 4 Durchsuchen der Tabellen anhand verschiedener Strategien (Indexscan, Seqscan usw.)

Algorithmen im Detail - Merge Join (1) EXPLAIN ANALYZE SELECT t1.* FROM tenk1 t1 JOIN tenk2 t2 ON (t1.unique1 = t2.unique1) WHERE t2.unique2 > 100; Merge Join (cost=1126.95..3002.60 rows=9899 width=244) (actual time=48.168..124.313 rows=9899 loops=1) Merge Cond: (t1.unique1 = t2.unique1) -> Index Scan using tenk1_unique1 on tenk1 t1 (cost=0.00..1702.17rows=10000 width=244) (actual time=20.425..67.893 rows=10000 loops=1) -> Sort (cost=1126.95..1151.70 rows=9899 width=4) (actual time=27.716..30.851 rows=9899 loops=1) Sort Key: t2.unique1 Sort Method: quicksort Memory: 926kB -> Seq Scan on tenk2 t2 (cost=0.00..470.00 rows=9899 width=4) (actual time=0.126..12.743 rows=9899 loops=1) Filter: (unique2 > 100)

Algorithmen im Detail - Merge Join (2) 1 Sortiere Tabelle tenk1, tenk2 anhand JoinKey 2 Lese sortierte Keys tenk1, verknüpfe mit Keys tenk2 3 Ideal kombinierbar mit Indexscan 4 Tabellen müssen jeweils nur einmal gelesen werden, Reißverschluß

Algorithmen im Detail - Hash Join (1) EXPLAIN ANALYZE SELECT t1.* FROM tenk1 t1 JOIN tenk2 t2 ON (t1.unique1 = t2.unique1) WHERE t2.unique2 > 100; Hash Join (cost=593.74..1300.73 rows=9899 width=244) (actual time=28.119..60.306 rows=9899 loops=1) Hash Cond: (t1.unique1 = t2.unique1) -> Seq Scan on tenk1 t1 (cost=0.00..458.00 rows=10000 width=244) (actual time=0.039..8.973 rows=10000 loops=1) -> Hash (cost=470.00..470.00 rows=9899 width=4) (actual time=27.641..27.641 rows=9899 loops=1) -> Seq Scan on tenk2 t2 (cost=0.00..470.00 rows=9899 width=4) (actual time=0.113..16.754 rows=9899 loops=1) Filter: (unique2 > 100)

Algorithmen im Detail - Hash Join (2) 1 Aufbauen einer Hashtabelle (aus tenk1 oder tenk2) 2 Durchsuchen des Joinpartners und Vergleich auf Hashkey 3 Komplett im RAM, für größere Datenmengen 4 Teure Startup-Costs

Algorithmen im Detail - Bitmap Index Scan (1) EXPLAIN ANALYZE SELECT * FROM tenk1 WHERE unique2 IN (2, 200, 234, -100, -203); Bitmap Heap Scan on tenk1 (cost=21.29..39.60 rows=5 width=244) (actual time=0.070..0.074 rows=3 loops=1) Recheck Cond: (unique2 = ANY ( {2,200,234,-100,-203} ::integer[])) -> Bitmap Index Scan on tenk1_unique2 (cost=0.00..21.29 rows=5 width=0) (actual time=0.062..0.062 rows=3 loops=1) Index Cond: (unique2 = ANY ( {2,200,234,-100,-203} ::integer[]))

Algorithmen im Detail - Bitmap Index Scan (2) 1 Scanne Index, erzeuge Bitmap mit Treffern (Blocknummern) 2 Sortiere Bitmap (Blocknummern aufsteigend) 3 Scanne Tabelle anhand der Blocknummern der Bitmap aufsteigend 4 Lossy Bitmap (Pages statt Tuple)

Algorithmen im Detail - Index Scan (1) EXPLAIN ANALYZE SELECT * FROM tenk1 t2 WHERE unique2 = 100; Index Scan using tenk1_unique2 on tenk1 t2 (actual time=0.022..0.023 rows=1 loops=1) Index Cond: (unique2 = 100) (cost=0.00..8.27 rows=1 width=244)

Algorithmen im Detail - Index Scan (2) 1 Indexscan erfordert Sichtbarkeitsprüfung auf Tabelle pro Indexfetch 2 Dadurch relativ teuer 3 Für kleine Treffermengen geeignet

Join Removal Optimierungsstrategie um nutzlose Tabelle in einem LEFT JOIN zu eliminieren Nur rechte Seite eines LEFT JOINS Keine Tupel der Tabelle in der Ergebnismenge Rechte Seite eindeutig (erfordert UNIQUE Constraint) SELECT a.name FROM a LEFT JOIN b ON (a.id = b.id) WHERE a.name LIKE %foo% ; Seq Scan on a Filter: (name ~~ %foo% ::text) Siehe auch http://blog.credativ.com/de/2010/03/ postgresql-optimizer-bits-join-removal.html

Semi-/Anti Joins Optimierungsstrategie für EXISTS()/NOT EXISTS() Berücksichtigt Schlüssel nur, sobald diese in der verknüpften Tabelle auftreten (semi) oder nicht (anti) Erlaubt das Abarbeiten als impliziter JOIN Siehe auch http://blog.credativ.com/de/2010/02/ postgresql-optimizer-bits-semi-und-anti-joins.html

Semi-/Anti Joins - Beispiel SELECT id FROM a WHERE a.id = 200 AND EXISTS(SELECT id FROM b WHERE a.id2 = b.id); 8.4: Nested Loop Semi Join (cost=0.00..50.18 rows=6 width=4) -> Seq Scan on a (cost=0.00..24.50 rows=6 width=8) Filter: (id = 200) -> Index Scan using b_id_idx on b (cost=0.00..4.27 rows=1 width=4) Index Cond: (id = a.id2) 8.3: Seq Scan on a (cost=0.00..9614.85 rows=3 width=4) Filter: ((id = 200) AND (subplan)) SubPlan -> Index Scan using b_id_idx on b (cost=0.00..8.27 rows=1 width=4 Index Cond: ($0 = id)

SQL Inlining (1) Unter bestimmten Umständen ist der Optimizer in der Lage, SQL-Funktionen zu inlinen Geht nur mit reinen SQL-Funktionen Einfacher SQL-Ausdruck Keine Seiteneffekte (VOLATILE) Darf nicht als STRICT deklariert sein SQL-Ausdruck darf Resultmenge nicht verändern SECURITY DEFINER nicht erlaubt Beispiel...

SQL Inlining (2) CREATE TABLE test AS SELECT a FROM generate_series(1, 10000) AS t(a); CREATE INDEX test_id_idx ON test(a); CREATE FUNCTION test_f() RETURNS SETOF test VOLATILE LANGUAGE SQL AS $$ SELECT * FROM test; $$; EXPLAIN SELECT * FROM test_f() WHERE a = 100; Function Scan on test_f Filter: (a = 100) (cost=0.25..12.75 rows=5 width=4) ALTER FUNCTION test_f() STABLE; EXPLAIN SELECT * FROM test_f() WHERE a = 100; Index Scan using test_id_idx on test Index Cond: (a = 100) (cost=0.00..8.29 rows=2 width=4)

pg stat statements (1) Sammelt Statistiken über ausgeführte Abfragen # cd <SOURCE>/contrib/auto_explain; # make install # psql dbname shared_preload_libraries = pg_stat_statements custom_variable_classes = pg_stat_statements pg_stat_statements.max = 10000 pg_stat_statements.track = all =# CREATE EXTENSION pg_stat_statements;

pg stat statements (2) #= SELECT * FROM pg_stat_statements WHERE calls > 1 ORDER BY calls DESC; -[ RECORD 4 ]-------+--------------------------------------------------- userid 10 dbid 25446 query SELECT abalance FROM pgbench_accounts WHERE aid = calls 4 total_time 7e-05 rows 4 shared_blks_hit 16 shared_blks_read 0 shared_blks_written 0 local_blks_hit 0 local_blks_read 0 local_blks_written 0 temp_blks_read 0 temp_blks_written 0

Auto-Explain (1) Ab PostgreSQL 8.4 Schreibt Ausführungspläne in das PostgreSQL-Log Umfangreich konfigurierbar Erlaubt das Protokollieren von Plänen innerhalb von Prozeduren

Auto-Explain (2) # cd <SOURCE>/contrib/auto_explain; # make install # psql dbname #= LOAD auto_explain ; #= SET auto_explain.log_min_duration = 1ms ; #= SET auto_explain.log_nested_statements TO on;

Dankeschön PQfinish(lecture); Feedback: http://www.postgresql.eu/events/feedback/pgconfde2011