![[5-RelQuery.pdf]]

Gleiche SQL-Anfragen können SEHR unterschiedlich schnell ausgewertet werden
Optimierung durch DBMS ist KRITISCH!

## Anfrageoptimierer
Logische Anfrage zu effizientem physischen Ausführungsplan übersetzen
1. Regelbasiert
2. Kostenbasiert
3. Physisch

### Regelbasierte Optimierung
Algebra Ausdruck in einen effizienteren Ausdruck umwandeln
1. Push Selection - früh filtern
2. Push Projection - nur benötigte Attribute
3. Combine Operations - Operationen zusammenfassen, Kreuzprodukte vermeiden
4. Split - $\sigma_{A \land B}(R) = \sigma_A(\sigma_B(R))$  Konjunktion zerlegen
5. Commute - $\sigma_A(\sigma_B(R)) = \sigma_B(\sigma_A(R))$ Reihenfolge flexibel
6. Push - $\sigma_B(R \times S) = \sigma_B(R) \times S$ Tupelanzahl reduzieren
7. Push Projection - Projizieren vor Joinen
8. Combine Operations - Select von Kreuzprodukt zu Join zusammenfassen
#### Heuristischer Algorithmus
![[Pasted image 20260723134219.png]]

Regelbasierte Optimierung weiß nicht welcher Plan tatsächlich der schnellste ist!


### Kostenbasierte Optimierung
Auswahl guter Join-Reihenfolge + beste konkrete Algorithmen
Kosten eines Operators hängen ab von:
1. Größe der Eingabedaten
2. Implementierungsalgorithmus
3. Physischen Parametern
**Selektivität** *sel* ist der Anteil der Eingabeobjekte der zum Ergebnis gehört.
KEIN Kostenmaß - trägt nur dazu bei

#### Join Reihenfolgen
Binäre Baumstruktur an Joins - Viel zu viele Ergebnisse
Left-Deep Baum - Besser aber immer noch zu viele
Dynamic Programming - rekursiv Teilpläne betrachten - deutlich besser 
Greedy - Plan muss nur gut, nicht optimal sein


### Physische Optimierung
#### Selektion:
Full Table Scan <-> Index Scan
#### Projektion:
Sortieren <-> Hashing

#### Join:
Nested Loop Join
- Kartesisches Produkt in Reihenfolge
- filter erst beim vergleich
- bR + |R| * bS I/Os
Block Nested Loop Join
- S wird nur pro Block von R erneut gescannt
- bR+bR * bS IOPS
Sort Merge Join
- Sortieren oder vorsortiert
- Einfach Mergen
- Sehr stark wenn schon sortiert!
Hash Join
- Nur für Equi-Joins
- Hashtabelle für kleinere Relation
- gute Hashfunktion notwendig
Index Nested Loop Join
- Index nutzen
- bR + |R| * Cost(Index Probe)
![[Pasted image 20260723142318.png]]



## Mehrweg-Suchbäume

![[Pasted image 20260723142602.png]]

Ein B-Baum ist ein selbstbalancierender, geordneter M+1-Wege-Suchbaum
- Ale Blätter auf selber Ebene
- Max M Schlüssel pro Knoten
- Min M/2 Schlüssel
- Wurzel Min 1 Schlüssel
- Jeder Knoten mit k Schlüsseln hat k+1 Kinder
![[Pasted image 20260723142759.png]]

### Einfügen in B-Baum

![[Pasted image 20260723142832.png]]


### Löschen in B-Baum
![[Pasted image 20260723142925.png]]
![[Pasted image 20260723142935.png]]
![[Pasted image 20260723143936.png]]



### B+ Baum
- Blätter enthalten Schlüssel mit Datensätzen
- Innere Knoten nur Trennschlüssel
- breiter und weniger hoch als B-Baum
- meist genutzter Baum in Praxis

### Mehrdimensionale Indexstrukturen
Mehrere Attribute gleichzeitig filtern

#### Invertierte Liste
Jedes Attribut eigen durchsuchen
Schnittmenge Bilden
![[Pasted image 20260723144321.png]]

#### Bitmap-Indizes
1 Bit pro Datensatz
1 = Wert ist vorhanden
0 = Wert ist nicht vorhanden
![[Pasted image 20260723145130.png]]
Sehr schnelles COUNT!

Nach deletes entstehen Lücken am Ende weil Einträge nachrücken!
Verundung mit Existenz Bitmap




