Optimierung von transaktionsorientierten Abfragen
Optimieren Sie transaktionsorientierte AQL-Abfragen, indem Sie den Ausdruck EXPLICIT mit den Ausdrücken BEGIN und END verwenden. Verwenden Sie außerdem die Ausdrücke TIMEOUT und TIMEWINDOW, um Zeitintervalle anzugeben.
Verwenden Sie den Ausdruck EXPLICIT mit den Ausdrücken BEGIN und END, um eine präzisere Filterung auf Ihre transaktionsorientierten Abfragen anzuwenden.
Sie können beispielsweise den Ausdruck BEGIN mit dem Ausdruck EXPLICIT END verwenden, um mehrere (BEGIN) nicht erfolgreiche Anmeldeversuche zu erfassen, auf die eine (EXPLICIT END) erfolgreiche Anmeldung folgt.
Verwenden Sie die Ausdrücke TIMEOUT und TIMEWINDOW, um Zeitfilter für die Sitzungen in Ihren transaktionsorientierten Abfragen anzuwenden.
Ausdrücke
Verwenden Sie die im Folgenden beschriebenen Ausdrücke, um Ihre transaktionsorientierte AQL-Abfrage zu optimieren:
| Abfrageausdrücke | Beschreibung |
|---|---|
| BEGIN | Eine Sitzung wird gestartet, wenn Sie ein Ereignis empfangen, bei dem der BEGIN-Ausdruck erfüllt ist oder das vorherige Ereignis die Sitzung beendet. |
| EXPLIZITER ANFANG | Startet eine neue Sitzung nur, wenn der Ausdruck EXPLICIT BEGIN wahr ist. |
| ENDE | Eine Sitzung wird beendet, wenn Sie ein Ereignis erhalten, bei dem der END-Ausdruck wahr ist oder das nächste Ereignis eine neue Sitzung startet. |
| EXPLIZITES ENDE | Schließt die aktuelle Sitzung nur, wenn der Ausdruck EXPLICIT END wahr ist. |
| TIMEOUT | Schließt die Sitzung, wenn der angegebene Zeitraum für TIMEOUT von dem Zeitpunkt, zu dem das vorherige Ereignis aufgetreten ist, bis zu dem Zeitpunkt, zu dem das aktuelle Ereignis eingetreten ist, abläuft. |
| ZEITFENSTER | Verfolgt die Sitzungszeit. Schließt die Sitzung, wenn der angegebene TIMEWINDOW-Zeitraum von dem Zeitpunkt, zu dem das erste Ereignis aufgetreten ist, bis zu dem Zeitpunkt, zu dem das aktuelle Ereignis eingetreten ist, abläuft. |
- Syntax
SESSION BY <TimeExpression> <ExpressionList> [EXPLICIT] BEGIN <booleanExpression> [EXPLICIT] END <booleanExpression> TIMEOUT <IntegerLiteral millieseconds> TIMEWINDOW <IntegerLiteral SECONDS|MINUTES|HOURS|DAYS>
Die folgenden Beispiele zeigen die Ergebnisse, die Sie mit verschiedenen Kombinationen der verfügbaren Abfrageausdrücke erhalten:
BEGIN-und END-Ausdrücke
Ein BEGIN-Ausdruck startet eine Sitzung, wenn ein Ereignis mit dem BEGIN-Ausdruck übereinstimmt oder das vorherige Ereignis die Sitzung beendet.
Ein Ausdruck END beendet eine Sitzung, wenn der Ausdruck END für ein Ereignis wahr ist oder wenn das nächste Ereignis eine neue Sitzung startet.
Wenn Sie den Ausdruck EXPLICIT mit den Ausdrücken BEGIN und END verwenden, wenden Sie einen präziseren Filter an, der die Ergebnismenge eingrenzt.
Sehen Sie sich die folgenden Beispiele für Abfragen und Ergebnisse an.
Im folgenden Abfragebeispiel werden BEGIN-und END-Ausdrücke verwendet.
Select sessionId,
DATEFORMAT(starttime,'YYYY-MM-dd HH:mm:ss')
start_time, username, sourceip,
category from events into TR1
where username = 'user_x'
SESSION BY starttime username, sourceip
BEGIN category=16001
END category=16003
start '2016-12-10 16:00' stop '2016-12-10 23:30'
Die folgende Tabelle zeigt die Ergebnisse für die Abfrage, die BEGIN und END verwendet.
| sessionID | start_time | Benutzername | sourceip | Kategorie |
|---|---|---|---|---|
| 1 | 10.12.2016, 16:00:06 Uhr | Benutzer_x | 10.2.2.10 | 16001 |
| 1 | 10.12.2016, 16:00:06 Uhr | Benutzer_x | 10.2.2.10 | 16003 |
| 2 | 10.12.2016, 16:00:06 Uhr | Benutzer_x | 10.2.2.10 | 16003 |
| 3 | 10.12.2016, 16:00:10 Uhr | Benutzer_x | 10.2.2.10 | 16001 |
| 3 | 10.12.2016, 16:00:10 Uhr | Benutzer_x | 10.2.2.10 | 16003 |
| 4 | 10.12.2016, 16:00:11 Uhr | Benutzer_x | 10.2.2.10 | 16003 |
| 3 | 10.12.2016, 16:00:11 Uhr | Benutzer_x | 10.2.2.10 | 16001 |
| 3 | 10.12.2016, 16:00:11 Uhr | Benutzer_x | 10.2.2.10 | 16003 |
EXPLICIT BEGIN-und END-Ausdrücke
Ereignisse werden übersprungen, wenn eine Sitzung nicht gestartet wird und ein Ereignis kein EXPLICIT
BEGIN -Ereignis ist.
Select sessionId,
DATEFORMAT(starttime,'YYYY-MM-dd HH:mm:ss')
start_time, username, sourceip,
category from events into TR2
where username='user_x'
SESSION BY starttime username, sourceip
EXPLICIT BEGIN category=16001
END category=16003 start '2016-12-10 16:00'
stop '2016-12-10 23:30'
Die folgende Tabelle zeigt die Ergebnisse für die Abfrage, die EXPLICIT BEGIN und END verwendet.
| sessionID | start_time | Benutzername | sourceip | Kategorie |
|---|---|---|---|---|
| 1 | 10.12.2016, 16:00:06 Uhr | Benutzer_x | 10.2.2.10 | 16001 |
| 1 | 10.12.2016, 16:00:06 Uhr | Benutzer_x | 10.2.2.10 | 16003 |
| 2 | 10.12.2016, 16:00:07 Uhr | Benutzer_x | 10.2.2.10 | 16001 |
| 2 | 10.12.2016, 16:00:07 Uhr | Benutzer_x | 10.2.2.10 | 16003 |
| 3 | 10.12.2016, 16:00:11 Uhr | Benutzer_x | 10.2.2.10 | 16001 |
| 3 | 10.12.2016, 16:00:11 Uhr | Benutzer_x | 10.2.2.10 | 16003 |
| 3 | 10.12.2016, 16:00:11 Uhr | Benutzer_x | 10.2.2.10 | 16003 |
| 4 | 10.12.2016, 16:00:14 Uhr | Benutzer_x | 10.2.2.10 | 16001 |
| 5 | 10.12.2016, 16:00:15 Uhr | Benutzer_x | 10.2.2.10 | 16001 |
| 5 | 10.12.2016, 16:00:15 Uhr | Benutzer_x | 10.2.2.10 | 16003 |
Es werden nur Ereignisse zurückgegeben, die den Ausdruck EXPLICIT BEGIN erfüllen.
Sessionid 2 und Sessionid 4 in EXPLICIT BEGIN und END erfüllen den Ausdruck EXPLICIT BEGIN nicht.
BEGIN und EXPLICIT END
Aktuelle Sitzung nur schließen, wenn der Ausdruck EXPLICIT END wahr ist. Es gibt keine weiteren Prüfungen auf BEGIN-Ereignisse in der Sitzung, wenn der Ausdruck EXPLICIT END wahr ist.
Einem EXPLICIT
END -Ausdruck können mehrere BEGIN-Ereignisse in einer Sitzung zugeordnet werden. Sie können beispielsweise den Ausdruck EXPLICIT END verwenden, um mehrere fehlgeschlagene Anmeldeversuche zu zählen, gefolgt von einer erfolgreichen Anmeldung während eines bestimmten Zeitintervalls (Sitzungszeitlimit).
Im folgenden Abfragebeispiel werden die Ausdrücke BEGIN und EXPLICIT END verwendet.
Select sessionId,
DATEFORMAT(starttime,'YYYY-MM-dd HH:mm:ss')
start_time, username, sourceip,
category from events into TR3
where username = 'user_x'
SESSION BY starttime username, sourceip
BEGIN category=16001
EXPLICIT END category=16003
start '2016-12-10 16:00'
stop '2016-12-10 23:30'
Die folgende Tabelle zeigt die Ergebnisse für die Abfrage, die BEGIN-und EXPLICIT END-Ausdrücke verwendet.
| sessionID | start_time | Benutzername | sourceip | Kategorie |
|---|---|---|---|---|
| 1 | 10.12.2016, 16:00:06 Uhr | Benutzer_x | 10.2.2.10 | 16001 |
| 1 | 10.12.2016, 16:00:06 Uhr | Benutzer_x | 10.2.2.10 | 16003 |
| 2 | 10.12.2016, 16:00:07 Uhr | Benutzer_x | 10.2.2.10 | 16003 |
| 2 | 10.12.2016, 16:00:10 Uhr | Benutzer_x | 10.2.2.10 | 16001 |
| 2 | 10.12.2016, 16:00:10 Uhr | Benutzer_x | 10.2.2.10 | 16003 |
| 3 | 10.12.2016, 16:00:11 Uhr | Benutzer_x | 10.2.2.10 | 16001 |
| 3 | 10.12.2016, 16:00:11 Uhr | Benutzer_x | 10.2.2.10 | 16003 |
| 4 | 10.12.2016, 16:00:12 Uhr | Benutzer_x | 10.2.2.10 | 16003 |
| 4 | 10.12.2016, 16:00:12 Uhr | Benutzer_x | 10.2.2.10 | 16001 |
| 4 | 10.12.2016, 16:00:12 Uhr | Benutzer_x | 10.2.2.10 | 16003 |
| 5 | 10.12.2016, 16:00:13 Uhr | Benutzer_x | 10.2.2.10 | 16001 |
| 4 | 10.12.2016, 16:00:11 Uhr | Benutzer_x | 10.2.2.10 | 16003 |
EXPLICIT BEGIN und EXPLICIT END
Ereignisse werden ignoriert, wenn eine Sitzung nicht gestartet wird und ein Ereignis kein EXPLICIT BEGIN-Ereignis ist.
Aktuelle Sitzung nur schließen, wenn der Ausdruck EXPLICIT END wahr ist. Es gibt keine weiteren Prüfungen auf BEGIN-Ereignisse in der Sitzung, wenn der Ausdruck EXPLICIT END wahr ist.
Im folgenden Abfragebeispiel werden sowohl EXPLICIT BEGIN-als auch EXPLICIT END-Ausdrücke verwendet.
Select sessionId,
DATEFORMAT(starttime,'YYYY-MM-dd HH:mm:ss')
start_time, username, sourceip,
category from events into TR4
where username = 'user_x'
SESSION BY starttime username, sourceip
EXPLICIT BEGIN category=16001
EXPLICIT END category=16003
start '2016-12-10 16:00'
stop '2016-12-10 23:30'
Die folgende Tabelle zeigt die Ergebnisse für die Abfrage, die sowohl EXPLICIT BEGIN-als auch EXPLICIT END-Ausdrücke verwendet.
| sessionID | start_time | Benutzername | sourceip | Kategorie |
|---|---|---|---|---|
| 1 | 10.12.2016, 16:00:06 Uhr | Benutzer_x | 10.2.2.10 | 16001 |
| 1 | 10.12.2016, 16:00:06 Uhr | Benutzer_x | 10.2.2.10 | 16003 |
| 2 | 10.12.2016, 16:00:10 Uhr | Benutzer_x | 10.2.2.10 | 16001 |
| 2 | 10.12.2016, 16:00:10 Uhr | Benutzer_x | 10.2.2.10 | 16003 |
| 3 | 10.12.2016, 16:00:11 Uhr | Benutzer_x | 10.2.2.10 | 16001 |
| 3 | 10.12.2016, 16:00:12 Uhr | Benutzer_x | 10.2.2.10 | 16001 |
| 3 | 10.12.2016, 16:00:12 Uhr | Benutzer_x | 10.2.2.10 | 16003 |
| 4 | 10.12.2016, 16:00:13 Uhr | Benutzer_x | 10.2.2.10 | 16001 |
| 4 | 10.12.2016, 16:00:14 Uhr | Benutzer_x | 10.2.2.10 | 16001 |
| 4 | 10.12.2016, 16:00:14 Uhr | Benutzer_x | 10.2.2.10 | 16003 |
| 5 | 10.12.2016, 16:00:15 Uhr | Benutzer_x | 10.2.2.10 | 16001 |
| 5 | 10.12.2016, 16:00:15 Uhr | Benutzer_x | 10.2.2.10 | 16003 |
TIMEOUT
Schließt die Sitzung, wenn der angegebene Zeitraum für TIMEOUT von dem Zeitpunkt, zu dem das vorherige Ereignis aufgetreten ist, bis zu dem Zeitpunkt, zu dem das aktuelle Ereignis eingetreten ist, abläuft. Das aktuelle Ereignis wird Teil einer neuen Sitzung. Der Wert für TIMEOUT wird in Millisekunden angegeben.
Im folgenden Abfragebeispiel wird der Ausdruck TIMEOUT verwendet.
Select sessionId,
DATEFORMAT(starttime,'YYYY-MM-dd HH:mm:ss.SSS')
start_time, username, sourceip,
category from events into TR5
where username='user_x'
SESSION BY starttime username, sourceip
BEGIN category=16001
EXPLICIT END category=16003
TIMEOUT 3600
start '2016-12-10 16:00'
stop '2016-12-10 23:30'
Die folgende Tabelle zeigt die Ergebnisse für die Abfrage, die den Ausdruck TIMEOUT verwendet.
| sessionID | start_time | Benutzername | sourceip | Kategorie |
|---|---|---|---|---|
| 1 | 10.12.2016 16:00:06.716 | Benutzer_x | 10.2.2.10 | 16003 |
| 2 | 10.12.2016 16:00:10.328 | Benutzer_x | 10.2.2.10 | 16001 |
Sessionid 1 wird beendet und sessionid 2 wird gestartet, da das TIMEOUT von 3600 überschritten wird.
ZEITFENSTER
Verfolgt die Sitzungszeit. Schließt die Sitzung, wenn der angegebene TIMEWINDOW-Zeitraum von dem Zeitpunkt, zu dem das erste Ereignis aufgetreten ist, bis zu dem Zeitpunkt, zu dem das aktuelle Ereignis eingetreten ist, abläuft. Das aktuelle Ereignis wird Teil einer neuen Sitzung. Der Wert für TIMEWINDOW kann in Sekunden, Minuten, Stunden oder Tagen angegeben werden.
Im folgenden Abfragebeispiel wird der Ausdruck TIMEWINDOW verwendet.
Select sessionId,
DATEFORMAT(starttime,'YYYY-MM-dd HH:mm:ss.SSS')
start_time, username, sourceip,
category from events into TR6
where username='user_x'
SESSION BY starttime username, sourceip
BEGIN category=16001
EXPLICIT END category=16003
TIMEWINDOW 3000
start '2016-12-10 16:00'
stop '2016-12-10 23:30'
Die folgende Tabelle enthält die Ergebnisse für die Abfrage, die den Ausdruck TIMEWINDOW verwendet.
| sessionID | start_time | Benutzername | sourceip | Kategorie |
|---|---|---|---|---|
| 1 | 10.12.2016 16:00:06.415 | Benutzer_x | 10.2.2.10 | 16001 |
| 1 | 10.12.2016 16:00:06.433 | Benutzer_x | 10.2.2.10 | 16003 |
| 2 | 10.12.2016 16:00:06.716 | Benutzer_x | 10.2.2.10 | 16003 |
| 3 | 10.12.2016 16:00:10.328 | Benutzer_x | 10.2.2.10 | 16001 |
| 3 | 10.12.2016 16:00:06.328 | Benutzer_x | 10.2.2.10 | 16003 |
Sessionid 1 liegt innerhalb der Zeit des Ausdrucks TIMEWINDOW, aber sessionid 2 wird beendet, da der Wert 3600 für TIMEWINDOW überschritten wird.