12. Quantifizierung des Problems
Meine Beobachtung:
~50% der SQL-Performance-Probleme
werden durch die Query/Index-
Diskrepanz verursacht
13. Problem: Index/Query Diskrepanz
“A very common cause of performance
problems is lack of proper indexes or the
use of queries that are not using
existing indexes.”
—Buda Consulting
http://www.budaconsulting.com/Portals/52677/docs/top_5_tech_brief.pdf
14. Quantifizierung des Problems
Percona White Paper:
Gründe für Performance-Probleme,
die einen Produktionsausfall verursachten:
38% bad SQL
15% schema and indexing
http://www.percona.com/files/white-papers/causes-of-downtime-in-mysql.pdf
15. Quantifizierung des Problems
Umfrage auf sqlskills.com:
Ursachen der letzten SQL
Server Performance-Probleme:
27% T-SQL
19% Poor indexing
http://www.sqlskills.com/blogs/paul/survey-what-are-the-most-common-causes-of-performance-problems/
16. Quantifizierung des Problems
Craig S. Mullins (DB Stratege und Forscher):
„As much as 75% of poor relational performance
is caused by "bad" SQL and application code.”
Noel Yuhanna (Forrester Research):
„The key difficulties surrounding performance
continue to be poorly written SQL statements,
improper DBMS configuration and a lack of clear
understanding of how to tune databases to solve
performance issues.”
18. Wurzel des Problems: Admins indizieren
Wie haben Datenbanken
vor SQL funktioniert?
19. Wurzel des Problems: Admins indizieren
Die Index-Nutzung war
untrennbar
mit den Abfragen verbunden.
20. Wurzel des Problems: Admins indizieren
Beispiel: dBase
Entwickler mussten...
...Indizes bei Suchen explizit nutzen:
!"#$%&'"($#)$*+!#,&+-"
!!!
$$$.%&'$/%&+&' Zwei
Anweisungen
...Index-Wartung berücksichtigen:
!"#$%&'"($#)$*+!#,&+-"0$%'(1
21. Wurzel des Problems: Admins indizieren
SQL ist eine Abstraktion:
Es definiert nur die logische Sicht
Die Implementierung muss sich
um alles andere Kümmern.
25. Wurzel des Problems: Admins indizieren
Heute wird Indizierung oft als
Tuning-Aufgabe betrachtet,
die in die Verantwortung der
Admins fällt.
26. Wurzel des Problems: Admins indizieren
Ein Missverständnis, das neue Probleme bringt:
Admins kennen die
Abfragen nicht
Müssen die Abfragen
erst eruieren.
Sehr zeitaufwendig und
meistens unvollständig.
by G-10gian82
deviantart.com
27. Wurzel des Problems: Admins indizieren
Ein Missverständnis, das neue Probleme bringt:
Admins kennen die
Abfragen nicht
Müssen die Abfragen
erst eruieren.
Sehr zeitaufwendig und
meistens unvollständig.
Admins können die
Abfragen nicht ändern
Sie können den Index an
die Abfrage anpassen.
Aber nicht die Abfrage
an den Index.
31. Neues Problem: es wird nicht gelehrt
Indizierung ist nicht Teil des SQL-Standards und wird in
Büchern über die Sprache SQL daher nicht abgedeckt.
11 SQL-Bücher analysiert: nur 1.0% der Seiten sind über
Indizierung (70 von 7330 Seiten).
Beispiele:
Oracle SQL by Example: 2.0% (19/960)
Beginning DBs with PostgreSQL: 0.8% (5/664)
Learning SQL: 3.3% (11/336—höchste Rate dieser Kategorie)
32. Neues Problem: es wird nicht gelehrt
Manche Tuning-Bücher vertiefen Indizierung,
verstecken es aber immer zwischen hunderten Seiten über
HW, OS and DB-Parametriesierung.
15 Datenbank-Admin-Bücher analysiert: 6% der Seiten
sind über Indizierung (395 von 6568 Seiten).
Beispiele:
Oracle Performance Survival Guide: 5.2% (38/730)
High Performance MySQL: 8% (55/684)
PostgreSQL 9 High Performance: 5.8% (27/468)
33. Neues Problem: es wird nicht gelehrt
Konsequenz:
Entwickler wissen nicht,
wie man Indizes richtig einsetzt.
Ergebnisse unsers 3-Minuten online Tests:
http://use-the-index-luke.com/de/3-minuten-test
5 Fragen: jede über einen bestimmten
Anwendungsfall von Indizes.
Nicht repräsentativ!
34. 3-Minuten Quiz: SQL-Indizierung
Q1: Gut oder schlecht? (Funktionen)
234564$7894:$#;*,%'($<8$#;*$=!"#$%&'(>?
@4A426$#"(#0$'+#",B)*
$$C3<D$#;*
$/E434$)*+,-!"#$%&'(.$F$1GHI?
35. 3-Minuten Quiz: SQL-Indizierung
Q1: Gut oder schlecht? (Funktionen)
234564$7894:$#;*,%'($<8$#;*$=!"#$%&'(>?
@4A426$#"(#0$'+#",B)*
$$C3<D$#;*
$/E434$)*+,-!"#$%&'(.$F$1GHI?
http://use-the-index-luke.com/de/sql/where/verstuemmelung/datumsfelder
40. 3-Minuten Quiz: SQL-Indizierung
Das ist bereits die optimale Lösung.
LMMMMMMLMMMMMMMMMMMMMMMLMMMMMMMMMLMMMMMMMMMMMMMMMMMMMMMMMMMML
N$#QO$N$O)!!%;*,PQ!$N$PQ$$$$$N$4(#R+$$$$$$$$$$$$$$$$$$$$N
LMMMMMMLMMMMMMMMMMMMMMMLMMMMMMMMMLMMMMMMMMMMMMMMMMMMMMMMMMMML
N$R.$$N$#;*,%'($$$$$$$N$#;*,%'($N$S!%T$UVR?$S!%T$%'($N$
LMMMMMMLMMMMMMMMMMMMMMMLMMMMMMMMMLMMMMMMMMMMMMMMMMMMMMMMMMMML
So schnell wie ein Primärschlüssel-Zugriff.
(Im Falle von MySQL und SQL Server wegen
des Clustered-Indexes ein Index-Only Scan)
42. Nebenbei: Finger weg von OFFSET
@4A426$%'0$'+#,B)*
$$C3D$#;*
$/E434$+$F$
$3943$]K$'+#,B)*$94@2
$A7D76$H
!#$%'
43. Nebenbei: Finger weg von OFFSET
!#$% ist verlockend, aber böse.
Sticker und
Bierdeckel holen!
http://use-the-index-luke.com/no-offset
44. 3-Minuten Quiz: SQL-Indizierung
Q3: Gut oder schlecht? (Reihenfolge)
CREATE INDEX tbl_idx ON tbl (a, b);
SELECT id, a, b FROM tbl
WHERE a = ? AND b = ?;
SELECT id, a, b FROM tbl
WHERE b = ?;
45. 3-Minuten Quiz: SQL-Indizierung
Q3: Gut oder schlecht? (Reihenfolge)
CREATE INDEX tbl_idx ON tbl (a, b);
SELECT id, a, b FROM tbl
WHERE a = ? AND b = ?;
SELECT id, a, b FROM tbl
WHERE b = ?;
http://use-the-index-luke.com/de/sql/where/gleichheit/zusammengesetzte-schluessel
46. 3-Minuten Quiz: SQL-Indizierung
Nur eine Abfrage kann den Index (a, b) gut nutzen:
...WHERE a = ? AND b = ?; ''''''''''''''''''''''''''''''''''''''''''''''''''''''
()*+,-)(),.//012-34-+/)()4-+)))))()5.6/)()$7*58))))))))))))(
''''''''''''''''''''''''''''''''''''''''''''''''''''''
()()*))()+,-./01)))))))()*123097)())))2)():;;)=/0?)09-7)(
''''''''''''''''''''''''''''''''''''''''''''''''''''''
...WHERE b = ?; ''''''''''''''''''''''''''''''''''''''''''''''''''''''''
()*+,-))(),.//012-34-+/)()4-+)))))())5.6/)()$7*58))))))))))))(
''''''''''''''''''''''''''''''''''''''''''''''''''''''''
()/30)1)()4566))))))))))()*123097)()27879)():;;)=/0?)09-7)(
''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Ganzer
Index wird
gelesen!
47. 3-Minuten Quiz: SQL-Indizierung
Spalten umdrehen (b, a): beide nutzen Index gut
...WHERE a = ? AND b = ?; ''''''''''''''''''''''''''''''''''''''''''''''''''''''
()*+,-)(),.//012-34-+/)()4-+)))))()5.6/)()$7*58))))))))))))(
''''''''''''''''''''''''''''''''''''''''''''''''''''''
()()*))()+,-./01)))))))()*123097)())))2)():;;)=/0?)09-7)(
''''''''''''''''''''''''''''''''''''''''''''''''''''''
...WHERE b = ?; ''''''''''''''''''''''''''''''''''''''''''''''''''''''
()*+,-)(),.//012-34-+/)()4-+)))))()5.6/)()$7*58))))))))))))(
''''''''''''''''''''''''''''''''''''''''''''''''''''''
()5-@))()*123097)))))))()*123097)())))A)():;;)=/0?)09-7)(
''''''''''''''''''''''''''''''''''''''''''''''''''''''
49. 3-Minuten Quiz: SQL-Indizierung
Q4: Gut oder schlecht? (LIKE indizieren)
CREATE INDEX tbl_idx
ON tbl (text);
SELECT id, text
FROM tbl
WHERE text LIKE '%BEGRIFF%';
50. 3-Minuten Quiz: SQL-Indizierung
Q4: Gut oder schlecht? (LIKE indizieren)
CREATE INDEX tbl_idx
ON tbl (text);
SELECT id, text
FROM tbl
WHERE text LIKE '%BEGRIFF%';
http://use-the-index-luke.com/de/sql/where/bereiche/like-filter
51. 3-Minuten Quiz: SQL-Indizierung
B-Tree-Indizes unterstützen keine führenden
Wildcard-Zeichen.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''
()*+,-))(),.//012-34-+/)()4-+)))))())5.6/)()$7*58))))))))))))(
''''''''''''''''''''''''''''''''''''''''''''''''''''''''
()/30)1)()4566))))))))))()*123097)()27:8;)():;;)=/0?)09-7)(
''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Brauchst du wirklich lexikalische Suche?
Ist Volltext-Suche eine Option?
Externe Such-Lösung?
65. Volkskrankheit: stiefmütterliche Indizierung
Index-Details sind kaum bekannt
!„Details“ wie die Spaltenreihenfolge oder Bereichs-suchen
müssen gelernt und verstanden werden.
Nur eine Funktion wird verwendet: schnell suchen.
!Indizes haben drei Funktionen (Mächte/Powers):
Daten finden, Daten gruppieren, Daten sortieren.
Abfragen werden einzeln Indiziert
!Man muss aus Applikationssicht indizieren (alle
Abfragen beachten). Das ist eine Design-Aufgabe!
67. Über Markus Winand
Ich tune Entwickler auf
SQL-Performance.
Training Tuning:
winand.at
Autor von:
SQL Performance Explained
Geeky blog:
use-the-index-luke.com