diff --git a/SQL.md b/SQL.md index 7bb7983..2d48feb 100644 --- a/SQL.md +++ b/SQL.md @@ -704,3 +704,128 @@ INSERT INTO isys_catg_sid_stid_list(custom_fields__data__id,isys_catg_sid_stid_l )ref1 offset 247 rows fetch next 100 rows only; + +######################################################################################################################## + +# Kurze SQL-Queries in MariaDB erfassen + +`SHOW PROCESSLIST` eignet sich **nicht**, um sehr kurze SQL-Statements zu erfassen. Diese sind häufig bereits beendet, bevor sie in der Prozessliste erscheinen. + +## Aktuelle Konfiguration prüfen + +### General Log + +Prüfen, ob das General Log aktiviert ist: + +```sql +SHOW VARIABLES LIKE 'general_log'; +SHOW VARIABLES LIKE 'log_output'; +``` + +Oder beide Werte gemeinsam anzeigen: + +```sql +SHOW VARIABLES +WHERE Variable_name IN ('general_log', 'log_output'); +``` + +Beispiel: + +| Variable_name | Value | +|----------------|-------| +| general_log | ON | +| log_output | TABLE | + +--- + +### Performance Schema + +Prüfen, ob das Performance Schema aktiviert ist: + +```sql +SHOW VARIABLES LIKE 'performance_schema'; +``` + +Zusätzlich prüfen, ob die Statement-Historie verfügbar ist: + +```sql +SHOW TABLES FROM performance_schema LIKE 'events_statements%'; +``` + +oder: + +```sql +SELECT COUNT(*) +FROM performance_schema.events_statements_history; +``` + +--- + +## General Log aktivieren + +> **Hinweis:** Das General Log erzeugt zusätzlichen Overhead und sollte nur für eine kurzfristige Analyse aktiviert werden. + +```sql +SET GLOBAL general_log = ON; +SET GLOBAL log_output = 'TABLE'; +``` + +Abfragen anzeigen: + +```sql +SELECT + event_time, + user_host, + argument +FROM mysql.general_log +WHERE command_type = 'Query' +ORDER BY event_time DESC +LIMIT 100; +``` + +General Log wieder deaktivieren: + +```sql +SET GLOBAL general_log = OFF; +``` + +--- + +## Performance Schema verwenden (empfohlen) + +Falls das Performance Schema aktiviert ist, können ausgeführte Statements ohne das General Log analysiert werden: + +```sql +SELECT + SQL_TEXT, + TIMER_WAIT / 1000000000 AS duration_ms +FROM performance_schema.events_statements_history +ORDER BY EVENT_ID DESC; +``` + +Je nach Konfiguration kann auch die Tabelle `events_statements_history_long` verwendet werden. + +--- + +## Slow Query Log + +Das Slow Query Log ist für sehr kurze Queries normalerweise ungeeignet. Es kann zwar so konfiguriert werden, dass alle Abfragen protokolliert werden: + +```sql +SET GLOBAL long_query_time = 0; +``` + +Für eine kurzfristige Analyse ist jedoch das **General Log** meist die bessere Wahl. + +--- + +## Empfehlung + +| Ziel | Empfehlung | +|------|------------| +| Alle SQL-Statements für kurze Zeit mitschneiden | General Log | +| Regelmäßige Analyse mit geringem Overhead | Performance Schema | +| Aktive, aktuell laufende Queries anzeigen | `SHOW FULL PROCESSLIST` | + +> **Fazit:** Für sehr kurze Queries ist `SHOW PROCESSLIST` ungeeignet. Verwende stattdessen das **General Log** oder – falls verfügbar – das **Performance Schema**. +