• Keine Ergebnisse gefunden

1 Indexstrukturen in PostgreSQL

N/A
N/A
Protected

Academic year: 2022

Aktie "1 Indexstrukturen in PostgreSQL"

Copied!
7
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Datenbanken II

Wintersemester 2019/20

Praktische Aufgabe 3

Der Inhalt dieser ¨ubung wird im2. Quizuberpr ¨¨ uft.

1 Indexstrukturen in PostgreSQL

1.1 Buffers

In den Beispielen der ¨Ubungsbl¨atter berechnen wir die Anzahl an Blocken, die zu die gelesen werden m¨ussen, um eine gegebene Anfrage zu beantworten. In einem realen System werden dabei die Bl¨ocke zuerst von der Festplatte und dann in den Arbeitsspei- cher geladen. Im n¨achsten Schritt betrachten wir, wie man die Anzahl an gelesenen Bl¨ocken inPostgreSQLauslesen kann.

Betrachten wir dazu die Anfrage an dieIMDBDatenbank in Beispiel 1.

Beispiel 1 Anfrage zum Auslesen aller Vornamen von Personen die nach 1940 geboren wurden und vor 1945 gestorben sind.

S E L E C T p r i m a r y n a m e FROM names

WHERE b i r t h y e a r > 1940 AND d e a t h y e a r < 1 945 ;

Die erste Ausf¨urung dieser Anfrage kann etwas Zeit in Anspruch nehmen. F¨uren wir die Anrage erneut aus, k¨onnen wir feststellen, dass sich die Ausf¨urungzeit wesentlich verk¨urzt. Der Grund daf¨ur ist, dass zuerst die Daten von der Festplatte in den Ar- beitsspeicher geladen werden m¨ussen. Bei der zweiten Ausf¨urung sind die Daten sehr wahrscheinlich noch im Speicher. Um dies zu ¨uberpr¨ufen, k¨onnen wir uns die Anzahl an Seiten, die von der Festplatte gelesen werden m¨ussen, auslesen.

(2)

Um dies korrekt durchf¨uhren zu k¨onnen, m¨ussen wir zuerst denPostgreSQL-Server ter- minieren, den Betriebssystem-Cache l¨oschen und denPostgreSQL-Server erneut star- ten. In Beispiel 2 finden Sie Kommandozeilenbefehle die dies in Debian-basierten Sys- temen durchf¨uhren.

Beispiel 2 Befehle zum Betriebssystem-Cache l¨oschen und PostgreSQL-Server neustarten.

sudo s e r v i c e p o s t g r e s q l stop free && sync && \ echo 3 > sudo / proc / sys / vm / d r o p _ c a c h e s && free && \ sudo s e r v i c e p o s t g r e s q l sta rt

F¨uhren Sie die folgende, leicht modifizierte Anfrage aus Beispiel 3 aus. MitEXPLAIN wird der Ausf¨uhrungsplan einer Anfrage ausgegeben, ANALYZE gibt Statistiken und die Ausf¨uhrungszeit einer Anfrage ausgegeben undBUFFERSerweitert diese Informa- tionen mit Statistiken ¨uber die Anzahl an Bl¨ocken, die von der Festplatte in den Ar- beitsspeicher gelesen wurden.

Beispiel 3 Informationen zur Ausf¨uhrung einer Anfrage mitEXPLAIN (ANALYZE, BUFFERS).

E X P L A I N ( ANALYZE , B U F F E R S ) S E L E C T p r i m a r y n a m e FROM names WHERE b i r t h y e a r > 1940 AND d e a t h y e a r < 1 945 ;

QU ERY PLAN

-- - - - G a t h e r ( cost = 1 0 0 0 . 0 0 . . 2 3 2 0 1 5 . 1 6 rows=341 w idt h =14)

( a c t u a l time= 5 1 . 6 1 1 . . 5 4 8 . 5 6 6 rows=2 loo ps =1) W o r k e r s P l a n n e d : 2

W o r k e r s L a u n c h e d : 2

B u f f e r s : s h a r e d read= 1 7 0 6 4 5 -> P a r a l l e l Seq Scan on names

( cost = 0 . 0 0 . . 2 3 0 9 8 1 . 0 6 rows=142 w idt h =14) ( a c t u a l time= 2 0 2 . 4 8 6 . . 5 3 6 . 8 4 6 rows=1 loo ps =3)

F i l t e r : (( birthyear > 1 9 4 0 ) AND ( deathyear < 1 9 4 5 ) ) Rows R e m o v e d by F i l t e r : 3 2 1 7 5 2 8

B u f f e r s : s h a r e d read= 1 7 0 6 4 5 P l a n n i n g Time: 3 .81 8 ms

E x e c u t i o n Time: 5 4 8 . 6 9 5 ms

In der Ausgabe von Beispiel 3 (Buffers: shared read=170645), sehen Sie das 170645 Bl¨ocke von der Festplatte gelesen wurden.

Nachdem die Anfrage erneut ausgef¨uhrt wurde, ¨andert sich die Ausgabe wie folgt:

Buffers: shared hit=96 read=170549. Dies bedeutet, dass 96 Bl¨ocke bereits im Buffer gefunden wurden.

DerEXPLAINBefehl zeigt uns zus¨atzlich denQuery Plan. F¨ur unsere Anfrage ist dies ein -> Parallel Seq Scan on names. Es gibt keine bessere Strategie als ein sequentielles Durchsuchen aller Daten, da kein Index auf birthyearoder deathyearder Tabelle namesexistiert. Dies kann mit dem Befehl \d namesverifiziert werden. In der Aus- gabe sehen wir im Bereich f¨ur Indizes lediglich"names pkey"PRIMARY KEY, btree (nconst). Dies bedeutet, dass einbtreeIndex auf dem Attributnconstexistiert, was jedoch nicht zur effizienten Beantwortung unserer Anfrage verwendet werden kann.

(3)

1.2 Indexerzeugung

Der Befehl in Beispiel 4 kann verwendet werden, um einenbtreeIndex auf dem Attri- butbirthyearzu erstellen. Neben dem B-tree existieren inPostgreSQLdie Indextypen Hash,GiST,SP-GiST,GINund BRIN. Details dazu finden Sie in derPostgreSQL Doku- mentation.

Beispiel 4 Anlegen einesbtreeIndex auf birthyearin der Tabellenames.

C R E A T E INDEX ON names USING bt ree ( b i r t h y e a r );

In der Ausgabe des Befehls \d names sehen wir nun zus¨atzlich den Indexeintrag

"names birthyear idx"btree (birthyear).

Stellen wir nun erneut die Anfrage aus Beispiel 1, kann der Index auf birthyearver- wendet werden und wir bekommen eine Ausgabe wie in Beispiel 5. Um zu vermeiden, dass sich Bl¨ocke bereits im Cache befinden, l¨oschen Sie den Cache wie in Beispiel 2 beschrieben.

Beispiel 5 Informationen zur Beantwortung der Anfrage aus Beispiel 1 unter Verwendung eines Indizes.

E X P L A I N ( ANALYZE , B U F F E R S ) S E L E C T p r i m a r y n a m e FROM names WHERE b i r t h y e a r > 1940 AND d e a t h y e a r < 1 945 ;

QU ERY PLAN

-- - - - G a t h e r ( cost = 6 6 9 0 . 3 9 . . 2 2 9 7 4 4 . 1 4 rows=341 w idt h =14)

( a c t u a l time= 1 2 5 . 9 4 9 . . 4 9 8 . 3 3 4 rows=2 loo ps =1) W o r k e r s P l a n n e d : 2

W o r k e r s L a u n c h e d : 2

B u f f e r s : s h a r e d read= 1 0 9 9 4 8 w r i t t e n =1 -> P a r a l l e l B i t m a p Heap Scan on names

( cost = 5 6 9 0 . 3 9 . . 2 2 8 7 1 0 . 0 4 rows=142 w idt h =14) ( a c t u a l time= 2 2 9 . 5 9 5 . . 4 7 9 . 9 0 4 rows=1 loo ps =3)

R e c h e c k Cond : ( b i r t h y e a r > 19 40)

Rows R e m o v e d by Index R e c h e c k : 1 1 1 1 6 2 4 F i l t e r : ( d e a t h y e a r < 194 5)

Rows R e m o v e d by F i l t e r : 1 0 7 7 2 9

Heap B l o c k s : e xac t = 1 2 2 7 7 l oss y = 1 9 7 7 9

-> B i t m a p Index Scan on n a m e s _ b i r t h y e a r _ i d x ( cost = 0 . 0 0 . . 5 6 9 0 . 3 0 rows= 3 0 7 9 8 2 wi dth =0) ( a c t u a l time= 7 8 . . 7 8 rows= 3 2 3 1 8 8 lo ops =1)

Index Cond : ( b i r t h y e a r > 1 940 ) B u f f e r s : s h a r e d read=886

P l a n n i n g Time: 0 .24 1 ms E x e c u t i o n Time: 4 9 8 . 3 8 8 ms

(4)

Nun verwenden wir unseren Indexnames birthyear idx und markieren alle Seiten mit Tupeln, die die Anfrage (birthyear > 1940) erf¨ullen. Anschließend werden alle diese markierten Seiten gelesen und Bedingung(deathyear < 1945)wird ¨uberpr¨uft.

Diese Analyse kann f¨ur beliebige Anfragen durchgef¨uhrt werden. Versuchen Sie die Ausf¨urungspl¨ane anderer Anfragen zu interpretieren, zum Beispiel: Geben Sie alle Per- sonen aus, die bei dem FilmThe Lion Kingmitgewirkt haben.

Beispiel 6 Befehl zum Auslesen aller Personen, die bei dem FilmThe Lion Kingmitgewirkt ha- ben.

S E L E C T p r i m a r y n a m e FROM names

N A T U R A L JOIN p r i n c i p a l s N A T U R A L JOIN t i t l e s WHERE p r i m a r y t i t l e = ’ The ␣ Lion ␣ King ’

AND s t a r t y e a r = 199 4 AND t i t l e t y p e = ’ m ovi e ’;

Weiters k¨onnen Sie sich ¨uberlegen, ob ein Index erzeugt werden kann, der die Ausf¨urung der Anfrage beschleunigen k¨onnte.

1.3 B-trees in PostgreSQL

Wir betrachten die IndexstrukturB-treeund ihre Implementierung in PostgreSQLba- sierend auf dem von uns erstellten Indexnames birthyear idx. Wir k¨onnen die Funk- tionbt metapverwenden um Details zu diesem Index auszugeben.

Beispiel 7 Informationen des erstelltenbtreeIndexnames birthyear idx.

S E L E C T * FROM b t _ m e t a p ( ’ n a m e s _ b i r t h y e a r _ i d x ’ );

ma gic | v e r s i o n | root | level | f a s t r o o t | f a s t l e v e l -- - - -+ - - - -+ - - - -+ - - - -+ - - - -+ - - - -

3 4 0 3 2 2 | 3 | 290 | 2 | 290 | 2

In Beispiel 7 sehen wir, neben weiteren Informationen, dass der Baum des Indizes names birthyear idx2 Levels hat und die ID der Wurzel 290 ist. Die Anzahl an Level ist unerwartet niedrig, wenn man bedenkt, dassnames4 Millionen Tupel hat.

Im n¨achsten Schritt sehen wir uns die Wurzel des B-Trees genauer an.

Beispiel 8 B-Tree details.

(5)

S E L E C T * FROM b t _ p a g e _ i t e m s ( ’ n a m e s _ b i r t h y e a r _ i d x ’ , 290 );

i t e m o f f | ctid | i t e m l e n | data

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

1 | (3 ,0) | 8 |

2 | (289 ,24) | 16 | 85 07 00 00 00 00 00 00

3 | (575 ,7) | 16 | 9 d 07 00 00 00 00 00 00

4 | (860 ,31) | 16 | b1 07 00 00 00 00 00 00

5 | (1145 ,49) | 16 | bf 07 00 00 00 00 00 00

6 | (1430 ,2) | 16 |

7 | (1715 ,28) | 16 |

8 | (2000 ,19) | 16 |

9 | (2285 ,21) | 16 |

10 | (2570 ,45) | 16 |

... | ... | ... |

Das Feld data gibt den kleinsten Wert an, der in dem Teilbaum der Seite ctidvor- kommt. Zum Beispiel k¨onnen wir aus der zweiten Zeile entnehmen, dass der kleinste Wert, im Teilbaum der Seite 289 vorkommt, 85 ist. Dies entspricht dem Geburtsjahr 1925.

Mit der Funktionbt page itemsk¨onnen wir den Baum schrittweise nach unten ver- folgen und die Indexseiten analysieren. Der Befehlbt page statszeigt das Attribut type, welches anzeigt, ob eine Seite eineroot pager,internal page ioderleaf pagel ist. Der Befehl kann wie folgt verwendet werden:

SELECT * FROM bt page stats(’names birthyear idx’, 3);.

Root und internal pages speichern in ctid Indexseiten und leaf pages speichern in ctidDatenseiten.

Als n¨achstes versuchen wir, das Tupel mit dem niedrigsten Geburtsjahr (birthyear) zu finden. Dies unterscheidet sich anh¨angig von der Datensatzversion.

Die root page vonnames birthyear idx ist 290. Um nun die erste internal page der Wurzel zu finden kann folgender Befehl verwendet werden:

SELECT ctid FROM bt page items(’names birthyear idx’, 290) LIMIT 1;. Das Ergebnis ist (3,0). Weiters k¨onnen wir nun die erste leaf page der Seite 3 mit folgendem Befehl finden:SELECT * FROM bt page items(’names birthyear idx’, 3);. Der erste Eintrag zeigt auf die erste Seite der Geschwisterseite.

In unserem Fall ist dies die Seite mitctid=(1,0). Der zweite Eintrag auf dieser leaf pa- ge bringt uns zu dem Tupel mit dem kleinsten Geburtsjahr (birthyear), Dies k¨onnen wir mit dem BefehlSELECT * FROM bt page items(’names birthyear idx’, 1);

auslesen. Das Tupel mit dem niedrigsten Geburtsjahr hat ctid=(3918,32). Das be- deutet, es ist der 32.Eintrag auf der Seite 3918 der Tabellenames. Dies k¨onnen wir mit SELECT ctid, * FROM names where ctid = ’(3918,32)’;abfragen.

(6)

1.4 Sortieren der Daten

InPostgreSQList es m¨oglich, die Daten mit demCLUSTERBefehl physisch zu sortieren.

Daf¨ur ist es n¨otig, einen Index auf das zu sortierende Attribut zu erstellen. In unserem Falle verwenden wir den Indexnames birthyear idx, um die Daten der Tabellenames nach dem Geburtsjahr (birthyear) zu sortieren. Der n¨otige Befehl ist in Beispiel 9 zu sehen.

Beispiel 9 Befehl zum Sortieren der Tabellenamesnach dem Attributbirthyear.names.

C L U S T E R names USING n a m e s _ b i r t h y e a r _ i d x ;

Um die Daten zu sortieren, ließtPostgreSQLall Tupel und schreibt sie geordnet auf die Festplatte zur¨uck. F¨ur große Tabellen kann dies einige Zeit in Anspruch nehmen. Nun sehen Sie in der Ausgabe des Befehls\d namesden ZusatzCLUSTERbei unserem Index names birthyear idx.

Nun k¨onnen wir vergleichen, wie sich die Sortierung auf die Auswertung unserer Bei- spielanfrage (siehe Beispiel 10) auswirkt. Um zu vermeiden, dass sich Bl¨ocke bereits im Cache befinden, l¨oschen Sie den Cache wie in Beispiel 2 beschrieben.

Beispiel 10 Informationen zur Ausf¨uhrung einer Anfrage mit sortierten Daten (birthyear).

E X P L A I N ( ANALYZE , B U F F E R S ) S E L E C T p r i m a r y n a m e FROM names WHERE b i r t h y e a r > 1940 AND d e a t h y e a r < 1 945 ;

QU ERY PLAN

-- - - - G a t h e r ( cost = 6 6 9 0 . 3 9 . . 2 3 0 2 1 2 . 6 6 rows=341 w idt h =14)

( a c t u a l time= 4 1 6 . 4 7 8 . . 4 1 9 . 2 9 6 rows=2 loo ps =1) W o r k e r s P l a n n e d : 2

W o r k e r s L a u n c h e d : 2

B u f f e r s : s h a r e d read=8 194

-> P a r a l l e l B i t m a p Heap Scan on names

( cost = 5 6 9 0 . 3 9 . . 2 2 9 1 7 8 . 5 6 rows=142 w idt h =14) ( a c t u a l time= 2 8 2 . 4 8 9 . . 4 1 3 . 3 6 7 rows=1 loo ps =3)

R e c h e c k Cond : ( b i r t h y e a r > 19 40) F i l t e r : ( d e a t h y e a r < 194 5)

Rows R e m o v e d by F i l t e r : 1 0 7 7 2 9 Heap B l o c k s : e xac t = 244 9

B u f f e r s : s h a r e d read=8 194

-> B i t m a p Index Scan on n a m e s _ b i r t h y e a r _ i d x ( cost = 0 . 0 0 . . 5 6 9 0 . 3 0 rows= 3 0 7 9 8 2 wi dth =0) ( a c t u a l time= 1 7 . . 1 7 rows= 3 2 3 1 8 8 lo ops =1)

Index Cond : ( b i r t h y e a r > 1 940 ) B u f f e r s : s h a r e d read=886

P l a n n i n g Time: 6 .41 2 ms E x e c u t i o n Time: 4 1 9 . 9 7 2 ms

(7)

Mit Sortierung werden lediglich 8194 Bl¨ocke gelesen, im Vergleich zu 109948 Bl¨ocken in Beispiel 5. Auch wenn die Strategie zur Bearbeitung unver¨andert bleibt, sind nun alle Tupel mit gleichen Geburtsjahr nacheinander abgespeichert. Ohne Sortierung waren die Tupel auf vielen unterscheidlichen Seiten abgespeichert.

2 Zus¨atzliche Informationen

Das Kapitel zur Dateiorganisation inPostgreSQLbasiert auf den Inhalt der folgenden Websites:

• PostgreSQL DokumentationEXPLAIN:

https://www.postgresql.org/docs/current/sql-explain.html

• PostgreSQL Dokumentation usingEXPLAIN:

https://www.postgresql.org/docs/current/using-explain.html

• PostgreSQL DokumentationCREATE INDEX:

https://www.postgresql.org/docs/current/sql-createindex.html

• PostgreSQL DokumentationBTREE:

https://www.postgresql.org/docs/current/pageinspect.html#id-1.11.7.31.6

• PostgreSQL DokumentationCLUSTER:

https://www.postgresql.org/docs/current/sql-cluster.html

Referenzen

ÄHNLICHE DOKUMENTE

Mit dieser Funktion kann die Basisstation Sie mit einem Piepston über den Eingang einer neuen Nachricht informieren, wenn neue Nachrichten aufgezeichnet werden. Aus der

En cas de dommage du câble électrique externe, celui-ci ne doit être échangé que par la société Ingo Maurer GmbH.. La garantie légale et contractuelle pour les défauts et

The buttons behind the volume knob are for the selection of the playback content category: 1 = music (green), 2 = playbook (white), 3 = microphone recordings (purple) and to

“Set REST Time” will post in the 13x94 Brickyard Display and the default time value of “0:05” will flash in the Time value display (unless the program has been

6.2.2.1 Installing Offline Bundles on an ESXi 5.x Host Using VMware vCenter Update Manager.. The offline bundle can also be installed from VMware vCenter Update Manager as

Ajuster la plaque de montage et ainsi la lampe dans les quatre fixations oblongues dans la position souhaitée.③ Serrer les vis fermement et veiller à une position centrale de

4-3: Montieren Sie die Rückenverstellung (8) am Rahmen für das Rückenpolster (14) mit einer M12x95 Sechskantschraube (98), zwei Unterlegscheiben (87) und einer

Ihre Zuverlässigkeit beruht auf einer elektrochemi- schen Reaktion, die den erforder- lichen Druck aufbaut, welcher für die vollautomatische und kontinuierliche Versorgung der