EQL — Hilfe zur Event Query Language
Inhaltsverzeichnis
- Überblick
- Wo wird EQL verwendet
- Grundlegende Syntax
- Event-Streams (14 Typen + 3 interne Typen)
- Windows
- WHERE-Bedingungen
- Aggregationsfunktionen
- Gruppierung und Sortierung
- JOIN — Stream-Kombination
- Pattern Matching
- Zeit- und Statusfunktionen
- Variablen und Kontexte
- 12 Praxisbeispiele
- Leitfaden zur Performance
- Häufig gestellte Fragen
- Verwandte Ansichten
Überblick
Hauptverwendungsort: Direkte Ausführung im linken Menü unter Automatisierung > EQL-Abfrage(
/query/index). Die gleiche Syntax wird in Bedingungsformeln für Erweiterte Alarme · Trigger/Statements · Flows verwendet.
EQL (Event Query Language) ist eine proprietäre Abfragesprache der Platform, mit der Echtzeit-Streamingdaten ähnlich wie mit SQL abgefragt, aggregiert und mittels Pattern Matching analysiert werden können. Während Standard-SQL auf statischen Tabellen operiert, arbeitet EQL auf kontinuierlich eingehenden Event-Streams und gibt (emittet) in jedem Moment Ergebnisse aus.
Betreiber können mit einer einzigen EQL-Zeile Folgendes implementieren:
- Echtzeit-Überwachung — Sofortige Ergebnisausgabe, sobald ein Tag-Wert einen Schwellenwert überschreitet.
- Aggregation auf Anlagenebene — Automatische Berechnung von Durchschnitt/Maximum/Minimum alle 5 Minuten.
- Pattern Matching — "Alarm, wenn nach Event A innerhalb von 30 Sekunden kein Event B eintritt".
- Zeitreihen-Join — Zeitlich ausgerichteter Vergleich zweier Tags.
EQL verwendet eine nahezu identische Syntax wie SQL, ergänzt jedoch das Konzept der Windows, um Zeit- oder Längenbereiche wie "die letzten N Sekunden / N Datensätze" zu definieren.
Diese Seite behandelt alle in der Konsole ausführbaren EQL-Funktionen. Beachten Sie jedoch, dass CEP beim Booten ein Backend auswählt und die verfügbaren Funktionen je nach Backend variieren können — Funktionen wie Joins, Variablen oder Kontexte sind möglicherweise nur in einem Backend vorhanden.
Welche Funktion wo läuft, ist in der Tabelle unter CEP — Backend aufgeführt. Die Sprache selbst wird in CEP — EQL-Sprache beschrieben, die Ablehnungstoken in Grenzen und Ablehnungstoken.
Ablehnungen erfolgen zum Zeitpunkt der Registrierung namentlich, sodass keine stillschweigenden Fehler auftreten.
Wo wird EQL verwendet
Innerhalb der Platform wird EQL an folgenden Stellen eingesetzt:
EQL-Abfragen und Statements befinden sich nebeneinander in der Gruppe 자동화 des linken Menüs. Es gibt kein Menü mit dem Namen «CEP».
| Menü · Ansicht | Interne URL | Verwendungszweck |
|---|---|---|
| Automatisierung > EQL-Abfrage — Dokumentation | /query/index | Sofortige EQL-Ausführung durch den Betreiber zur Überprüfung von Ergebnissen (Exploration/Debugging) |
| Trigger (kein Link im linken Menü) — Dokumentation | /trigger/index | Automatische Veröffentlichung von EQL-Matching-Ergebnissen an MQ-Topics oder in den Storage |
| Automatisierung > Statements — Dokumentation | /statement/index | Auf Anlagenebene registrierte Regeln (Status/Aggregation/Event/Befehl). Speicherung erfolgt nur bei Angabe der erforderlichen Ausgabefelder |
| Alarm → EQL-Alarm | — | Alarmierung bei beliebigen Bedingungen mittels EQL-Regeln |
| Flow → Script | — | EQL-Ausdrucksmodus für flow_script_filter / flow_script_transform / flow_switch |
| Tag-Formular — KI-Tab | — | Eingangsbedingungen für Vorhersage- und Anomalieerkennungsregeln |
EQL ist nur lesend — Daten werden nicht geändert. Um Alarme aus Matching-Ergebnissen zu erzeugen oder Flow-Aktionsknoten aufzurufen, verbinden Sie die Ergebnisse bitte über CEP → Trigger oder EQL-Alarm.
Grundlegende Syntax
Die Grundstruktur von EQL ist nahezu identisch mit SQL.
SELECT <column-or-function>
FROM <stream>.<window>
WHERE <condition>
GROUP BY <field>
HAVING <aggregation-condition>
ORDER BY <field> [ASC|DESC]
Einfachste EQL:
SELECT * FROM Point.win:time(1 sec)
Gibt alle Tag-Datenpunkte aus, die in den letzten 1 Sekunde eingegangen sind, jede Sekunde aus.
Wildcards und Spaltenauswahl
| Syntax | Bedeutung |
|---|---|
SELECT * | Alle Spalten einbeziehen |
SELECT tag_id, value | Nur spezifische Spalten |
SELECT value AS v, tag_id AS id | Alias zuweisen |
SELECT value * 9 / 5 + 32 AS fahrenheit | Ergebnis eines arithmetischen Ausdrucks |
SELECT CASE WHEN value > 80 THEN 'HIGH' ELSE 'OK' END AS level | Bedingungsformel |
Kommentare
-- 한 줄 주석
/* 여러 줄
주석 */
SELECT * FROM Point.win:time(1 sec)
Event-Streams (14 Typen + 3 interne Typen)
Die im Abschnitt FROM verwendbaren Streams (Event-Quellen) sind wie folgt. Alle Streams werden automatisch von der Platform generiert und können ohne separate Registrierung sofort verwendet werden.
Wenn Sie einen Namen verwenden, der hier nicht aufgeführt ist (
FROM), wird die Regel nicht bereitgestellt. Nur registrierte Event-Typen können als Streams dienen (plantpulse.core.engine.eql.EventTypes).
Tag-Domäne (3 Typen)
| Stream | Zeitpunkt des Auftretens | Hauptfelder |
|---|---|---|
| Point | Bei jedem Empfang eines Tag-Werts | tag_id, value, quality, ts, site_id, asset_id, unit, java_type |
| PointMap | Identisch, wird jedoch mit der Funktion tag('<id>') verwendet, um mehrere Tags als Key-Value abzufragen | (PointMap-spezifische Helfer) |
| Alarm | Bei Auslösung eines Tag-Alarms | tag_id, alarm_band, value, threshold, priority, band_message |
Anlagen-Domäne (6 Typen)
| Stream | Zeitpunkt des Auftretens | Hauptfelder |
|---|---|---|
| AssetData | Zeitreihendaten auf Anlagenebene (Aggregationsergebnis) | asset_id, values(key-value), ts |
| AssetEvent | Auftreten eines Anlagen-Events (Start, Stop, Wartung etc.) | asset_id, event_type, details, ts |
| AssetAlarm | Auslösung eines Anlagen-Alarms | asset_id, alarm_band, priority, message |
| AssetCommand | Wenn ein Befehl an eine Anlage gesendet wird | asset_id, command, args |
| AssetAggregation | Anlagen-Aggregationsergebnisse für 1 Min / 5 Min / 1 Std | asset_id, window, agg_type, values |
| AssetContext | Änderung des Anlagenkontexts (Metadaten) | asset_id, context_key, before, after |
In älteren Dokumentationen wurden diese beiden als Anlagen-Domänen-Streams aufgeführt, sie sind jedoch keine registrierten Event-Typen.
Wenn Sie FROM AssetHealthStatus... schreiben, wird die Regel nicht bereitgestellt.
Die Bewertung von Health- und Verbindungsstatus erfolgt nicht über Streams, sondern als periodisch ausgeführte Jobs
(AssetHealthStatusDeployer / AssetConnectionStatusDeployer). Diese Ergebnisse werden über die Ansicht und API gemeldet. Wenn Sie Statusänderungen in EQL erfassen möchten, detektieren Sie das Ausbleiben von Daten von AssetEvent · AssetAlarm oder
Point mittels eines not-Patterns.
Produktions-Domäne (3 Typen)
| Stream | Zeitpunkt des Auftretens | Hauptfelder |
|---|---|---|
| Calendar | Schichtstart / -ende / -änderung | shift_id, calendar_id, event, start_time, end_time |
| WorkOrder | Übergang im Lebenszyklus einer WorkOrder | order_id, status, prev_status, asset_id, product_id |
| OEE | Aktualisierung des OEE-Bewertungsergebnisses | order_id, asset_id, oee, availability, performance, quality |
System-Domäne (2 Typen)
| Stream | Zeitpunkt des Auftretens | Hauptfelder |
|---|---|---|
| Log | Systemdiagnosemeldungen | module, level, code, summary, ts |
| OSPerformance | Server-OS-Ressourcenindikatoren (periodisch) | CPU, Speicher, Festplatte etc. |
Ein Event-Typ namens Status ist nicht registriert. Wenn Sie Verbindungsstatusänderungen von OPC oder Edge mit EQL erfassen wollten, funktioniert dies nicht über diesen Stream — nutzen Sie stattdessen die Detektion des Ausbleibens von Point über ein not-Pattern.
Interne Streams (3 Typen)
Diese sind registriert, dienen jedoch nicht der Regelerstellung, sondern der Diagnose und Health-Checks.
| Stream | Verwendungszweck |
|---|---|
| DateTime | Periodisch auftretende Zeit-Events (Trigger für zeitbasierte Regeln) |
| Ping | Überprüfung der Engine-Verfügbarkeit |
| Test | Zur Regelvalidierung |
Alle Streams müssen vor der Verwendung zwingend mit einem Window kombiniert werden (
Point.win:time(1 sec)). Wenn Sie nurFROM Pointohne Window verwenden, verschwinden die Ergebnisse sofort und sind nicht sichtbar.
Windows
Ein Window ist ein «aus dem Stream herausgeschnittener Abschnitt in Zeit oder Länge». EQL unterstützt zwei Arten von Windows.
Zeit-Windows (Time Window)
| Syntax | Bedeutung |
|---|---|
Point.win:time(1 sec) | Alle Events der letzten 1 Sekunde (sliding) |
Point.win:time(10 sec) | Die letzten 10 Sekunden |
Point.win:time(5 min) | Die letzten 5 Minuten |
Point.win:time(1 hour) | Die letzte 1 Stunde |
Unterstützte Zeiteinheiten: sec(Sekunden) · min(Minuten) · hour(Stunden) · day(Tage).
Längen-Windows (Length Window)
| Syntax | Bedeutung |
|---|---|
Point.win:length(100) | Die letzten 100 Events |
Point.win:length(1000) | Die letzten 1.000 Events |
Batch-Windows (Batch Window)
win:time_batch / win:length_batch — Gibt ein Ergebnis nur in dem Moment aus, in dem das Window voll ist oder die Zeit abgelaufen ist. Reduziert den Ressourcenverbrauch.
-- 매 1분마다 한 번씩 그 1분간 평균을 emit
SELECT avg(value) FROM Point.win:time_batch(1 min) WHERE tag_id = 'MOTOR-001.TEMP'
Leitfaden zur Window-Auswahl
| Situation | Empfohlenes Window |
|---|---|
| Echtzeit-Überwachung (Werte an sich) | win:time(1 sec) |
| Kurzzeit-Durchschnitt/Maximum (z.B. 5-Min-Schnitt) | win:time(5 min) |
| Stündliche Aggregation | win:time_batch(1 hour) |
| Vergleich der letzten N Datensätze | win:length(N) |
| Verfolgung von Änderungsraten | win:length(2) + Funktion prev() |
WHERE-Bedingungen
Es werden die gleichen Vergleichsoperatoren wie in SQL verwendet.
| Operator | Beispiel | Bedeutung |
|---|---|---|
= != <> | tag_id = 'MOTOR-001' | Gleich / Ungleich |
< <= > >= | value > 80 | Vergleich |
BETWEEN | value BETWEEN 70 AND 90 | Bereich |
IN | tag_id IN ('A','B','C') | In Liste enthalten |
LIKE | tag_id LIKE 'MOTOR-%' | Pattern Matching (Wildcard %) |
IS NULL / IS NOT NULL | quality IS NOT NULL | null-Prüfung |
AND OR NOT | value > 80 AND quality = 'GOOD' | Logische Verknüpfung |
Reguläre Ausdrücke
SELECT * FROM Point.win:time(1 sec)
WHERE tag_id REGEXP '.*\\.TEMP$'
Matcht nur Tags, die mit
.TEMPenden. Backslashes müssen doppelt (\\.) eingegeben werden.
Dynamischer Standort/Anlagen-Filter
SELECT * FROM Point.win:time(1 sec)
WHERE site_id = 'SITE-A'
AND asset_id LIKE 'LINE-1.%'
AND value > 75
Aggregationsfunktionen
Aggregiert Events innerhalb eines Windows.
Basis-Aggregationen
| Funktion | Bedeutung | Beispiel |
|---|---|---|
count(*) | Anzahl der Events | SELECT count(*) FROM Point.win:time(10 sec) |
sum(field) | Summe | sum(value) |
avg(field) | Durchschnitt | avg(value) |
min(field) | Minimum | min(value) |
max(field) | Maximum | max(value) |
median(field) | Median | median(value) |
stddev(field) | Standardabweichung | stddev(value) |
variance(field) | Varianz | variance(value) |
first(field) | Erster Wert im Window | first(value) |
last(field) | Letzter Wert im Window | last(value) |
DISTINCT-Aggregation
SELECT count(distinct tag_id) AS unique_tags
FROM Point.win:time(1 min)
Kombination mit CASE
SELECT
count(CASE WHEN value > 80 THEN 1 END) AS high_count,
count(CASE WHEN value <= 80 THEN 1 END) AS ok_count
FROM Point.win:time(1 min)
WHERE tag_id = 'MOTOR-001.TEMP'
Zeitreihenfunktionen
| Funktion | Bedeutung | Beispiel |
|---|---|---|
prev(N, field) | Wert N Schritte zuvor | value - prev(1, value) (Differenz zum vorherigen Wert) |
prevwindow(field) | Array aller vorherigen Werte im Window | prevwindow(value) |
rate(field) | Änderungsrate pro Zeiteinheit | rate(value) |
Gruppierung und Sortierung
GROUP BY
-- 자산별 최근 1분 평균 온도
SELECT asset_id, avg(value) AS avg_temp
FROM Point.win:time(1 min)
WHERE tag_id LIKE '%.TEMP'
GROUP BY asset_id
HAVING — Filter nach Aggregation
-- 평균 > 80 인 자산만
SELECT asset_id, avg(value) AS avg_temp
FROM Point.win:time(1 min)
WHERE tag_id LIKE '%.TEMP'
GROUP BY asset_id
HAVING avg(value) > 80
ORDER BY · LIMIT
-- 가장 뜨거운 5개 자산
SELECT asset_id, max(value) AS peak
FROM Point.win:time(5 min)
WHERE tag_id LIKE '%.TEMP'
GROUP BY asset_id
ORDER BY peak DESC
LIMIT 5
LIMITschließt nur die obersten N Datensätze zum Zeitpunkt der Ergebnisausgabe ein.
JOIN — Stream-Kombination
Zwei oder mehr Streams können zeitlich ausgerichtet zusammengeführt werden.
-- 같은 자산에서 같은 시간대의 온도와 압력을 한 행으로
SELECT p1.value AS temp, p2.value AS pressure, p1.asset_id
FROM Point.win:time(1 sec) AS p1,
Point.win:time(1 sec) AS p2
WHERE p1.tag_id LIKE '%.TEMP'
AND p2.tag_id LIKE '%.PRESSURE'
AND p1.asset_id = p2.asset_id
Join von Anlagen-Events + WorkOrders
SELECT e.asset_id, e.event_type, w.order_id, w.status
FROM AssetEvent.win:time(5 min) AS e,
WorkOrder.win:time(5 min) AS w
WHERE e.asset_id = w.asset_id
AND e.event_type = 'STARTUP'
AND w.status = 'START'
Ein Join-Ergebnis tritt nur auf, während sich die Zeit-Windows der beiden Streams überschneiden. Bei Daten mit unterschiedlichen Zeiteinheiten passen Sie diese mit
win:time_batchauf einen ähnlichen Zyklus an.
Pattern Matching
Eine leistungsstarke EQL-Funktion zur Definition von Sequenzen, wie «Event A tritt ein und innerhalb von N Sekunden tritt B (nicht) ein».
every — Jedes Mal matchen
SELECT * FROM pattern [
every a = AssetEvent(event_type = 'STARTUP')
-> b = AssetEvent(event_type = 'SHUTDOWN', asset_id = a.asset_id)
where timer:within(60 sec)
]
Matcht jedes Paar von Start-Event → Stop-Event innerhalb von 60 Sekunden. Detektiert abnormale Muster wie sofortigen Stop nach kurzem Betrieb.
not — Tritt während N Zeit nicht ein
SELECT * FROM pattern [
every a = AssetEvent(event_type = 'STARTUP')
-> ( timer:interval(30 min)
and not AssetData(asset_id = a.asset_id) )
]
Matcht, wenn nach dem Start 30 Minuten lang keine Daten eingehen (Detektion nicht reagierender Anlagen).
and / or — Gleichzeitig oder eines von beiden
SELECT * FROM pattern [
( every AssetAlarm(priority = 'ERROR') )
and
( every WorkOrder(status = 'START') )
]
Kernbegriffe des Pattern Matching
| Schlüsselwort | Bedeutung |
|---|---|
every <e> | Matcht jedes Mal, wenn e auftritt |
e1 -> e2 | e2 folgt auf e1 (Sequenz-Match) |
e1 and e2 | Beide Events treten auf (Reihenfolge egal) |
e1 or e2 | Eines der beiden Events tritt auf |
not e | e tritt nicht auf |
timer:within(<duration>) | Matcht nur innerhalb der angegebenen Zeit |
timer:interval(<duration>) | Wartet die angegebene Zeit ab |
Zeit- und Statusfunktionen
Zeitfunktionen
| Funktion | Bedeutung |
|---|---|
current_timestamp | Aktuelle Zeit (ms) |
current_date() | Heutiges Datum (yyyy-MM-dd) |
timestamp(field) | Extrahiert Timestamp des Events |
hour_of_day(ts) | Stunde 0–23 |
day_of_week(ts) | Wochentag 1(So)–7(Sa) |
minute_of_hour(ts) | Minute 0–59 |
dayofmonth(ts) | Tag 1–31 |
-- 야간 (22시~6시) 발생 알람만
SELECT * FROM Alarm.win:time(1 hour)
WHERE hour_of_day(ts) >= 22 OR hour_of_day(ts) < 6
Statusfunktionen
| Funktion | Bedeutung |
|---|---|
tag('<tag_id>') | Letzter Wert dieses Tags (PointMap-Kontext) |
prev_status(asset_id) | Vorheriger Zustand der Anlage |
health(asset_id) | Health-Status der Anlage (OK/WARN/ERROR/UNKNOWN) |
is_in_shift(asset_id) | Ob sich die Anlage innerhalb einer Schicht befindet |
Arithmetische und String-Funktionen
| Funktion | Bedeutung |
|---|---|
abs(x) / round(x, n) / floor(x) / ceil(x) | Mathematik |
pow(x, y) | y-te Potenz von x |
sqrt(x) | Quadratwurzel |
length(s) | String-Länge |
upper(s) / lower(s) | Groß-/Kleinschreibung |
substring(s, start, len) | Teilstring |
concat(a, b, ...) | Verkettung |
Variablen und Kontexte
Variablen — Dynamische Schwellenwerte
-- 변수 정의 (운영자가 화면에서 조정 가능)
create variable double max_temp = 80;
-- 변수 사용
SELECT * FROM Point.win:time(1 sec)
WHERE tag_id LIKE '%.TEMP' AND value > max_temp
Variablenwerte können während des Betriebs geändert werden; alle EQL-Regeln verwenden sofort den neuen Wert.
Kontexte — Aktivierung basierend auf Zeit/Bedingung
In der Platform sind häufig verwendete Kontexte vordefiniert, die direkt übernommen werden können.
| Kontext | Aktivierungsbedingung |
|---|---|
EVERY_1_MINUTES | Jede 1 Minute |
EVERY_5_MINUTES | Alle 5 Minuten |
EVERY_10_MINUTES | Alle 10 Minuten |
EVERY_30_MINUTES | Alle 30 Minuten |
EVERY_1_HOURS | Jede 1 Stunde |
EVERY_3_HOURS | Alle 3 Stunden |
EVERY_6_HOURS | Alle 6 Stunden |
EVERY_12_HOURS | Alle 12 Stunden |
DAY_WORK_TIME | Werktage 09:00–18:00 |
-- 5분마다 한 번씩 평균 온도 emit (그 사이에는 결과가 안 옴)
context EVERY_5_MINUTES
SELECT avg(value) AS avg_temp
FROM Point.win:time(5 min)
WHERE tag_id = 'MOTOR-001.TEMP'
-- 주간 근무시간에만 평가
context DAY_WORK_TIME
SELECT * FROM AssetAlarm.win:time(1 sec)
WHERE priority = 'ERROR'
12 Praxisbeispiele
Beispiel 1 — Echtzeit-Überwachung eines einzelnen Tags
SELECT value, ts, quality
FROM Point.win:time(1 sec)
WHERE tag_id = 'MOTOR-001.SPEED'
Beispiel 2 — Sofortige Detektion von Schwellenwertüberschreitung
SELECT tag_id, value, ts
FROM Point.win:time(1 sec)
WHERE tag_id LIKE '%.TEMP' AND value > 90
Beispiel 3 — 5-Minuten-Schnitt pro Anlage (Ausgabe alle 5 Min)
context EVERY_5_MINUTES
SELECT asset_id, avg(value) AS avg_temp, max(value) AS peak
FROM Point.win:time(5 min)
WHERE tag_id LIKE '%.TEMP'
GROUP BY asset_id
Beispiel 4 — Änderungsrate (gegenüber vorherigem Wert)
SELECT tag_id, value, value - prev(1, value) AS delta
FROM Point.win:length(2)
WHERE tag_id = 'TANK-001.LEVEL'
Beispiel 5 — Nur ERROR-Alarme in der Nachtschicht
SELECT tag_id, priority, band_message, ts
FROM Alarm.win:time(1 sec)
WHERE priority = 'ERROR'
AND hour_of_day(ts) >= 22 OR hour_of_day(ts) < 6
Beispiel 6 — Anlagen-Health-Übergang (OK → WARN)
SELECT asset_id, status, prev_status, ts
FROM AssetHealthStatus.win:time(1 sec)
WHERE prev_status = 'OK' AND status = 'WARN'
Beispiel 7 — Niedrige OEE in WorkOrder
SELECT order_id, asset_id, oee, availability, performance, quality
FROM OEE.win:time(1 sec)
WHERE oee < 0.6
Beispiel 8 — Detektion nicht reagierender Anlagen (30 Min)
SELECT * FROM pattern [
every a = AssetData()
-> ( timer:interval(30 min)
and not AssetData(asset_id = a.asset_id) )
]
Beispiel 9 — Sofortiger Stop nach Start (instabiler Betrieb)
SELECT * FROM pattern [
every a = AssetEvent(event_type = 'STARTUP')
-> b = AssetEvent(event_type = 'SHUTDOWN', asset_id = a.asset_id)
where timer:within(60 sec)
]
Beispiel 10 — Gleichzeitiger Vergleich mehrerer Tags (PointMap)
SELECT
tag('MOTOR-001.TEMP') AS temp,
tag('MOTOR-001.PRESSURE') AS pressure,
tag('MOTOR-001.VIBRATION') AS vibration
FROM PointMap.win:time(1 sec)
Beispiel 11 — Stündliche kumulierte Produktion pro Linie
context EVERY_1_HOURS
SELECT asset_id, sum(value) AS hourly_count
FROM AssetAggregation.win:time(1 hour)
WHERE agg_type = 'PRODUCED' AND asset_id LIKE 'LINE-%'
GROUP BY asset_id
Beispiel 12 — TOP 10 Anlagen mit den meisten Alarmen
context EVERY_10_MINUTES
SELECT asset_id, count(*) AS alarm_count
FROM AssetAlarm.win:time(10 min)
GROUP BY asset_id
ORDER BY alarm_count DESC
LIMIT 10
Leitfaden zur Performance
1. Window-Größe bewusst klein halten
-- ❌ 나쁜 예 — 24시간을 메모리에 유지
SELECT avg(value) FROM Point.win:time(24 hour)
-- ✅ 좋은 예 — 1시간만 메모리에 유지 + context 로 emit 주기 분리
context EVERY_1_HOURS
SELECT avg(value) FROM Point.win:time(1 hour)
2. WHERE-Klausel nah an den Trigger setzen
Statische Filter wie Tag-ID, Anlagen-ID oder Standort-ID sollten am Anfang der WHERE-Klausel stehen. Sie werden vor GROUP BY/HAVING bewertet.
3. Beidseitige Wildcards in LIKE '%...%' sind kostenintensiv
-- ❌ 나쁜 예
WHERE tag_id LIKE '%TEMP%'
-- ✅ 좋은 예
WHERE tag_id LIKE '%.TEMP' -- 접미사 매칭만
4. Pattern Matching mit kurzen Windows verwenden
Vergessen Sie nicht die Zeitbeschränker in pattern [ ... timer:within(<n-minutes>) ]. Unendliche Patterns belegen kontinuierlich Speicher.
5. Anpassung der Ergebnisausgabe-Frequenz
Trennen Sie die EQL-Evaluierung (sekundlich) von der Ausgabe, indem Sie den Kontext context EVERY_N_MINUTES nutzen, um die Ausgabe nur alle N Minuten zu tätigen. Dies reduziert die Last auf nachfolgenden Systemen.
Häufig gestellte Fragen
F. Ich habe eine EQL-Abfrage eingegeben, aber in der Ergebnisansicht erscheint nichts.
A. Bitte prüfen Sie Folgendes: ① Haben Sie nur FROM Point verwendet? — Ein Window ist erforderlich (Point.win:time(1 sec)). ② Ist die WHERE-Bedingung zu eng gefasst, sodass kein Match erfolgt? ③ Haben Sie oben rechts auf die Schaltfläche ▶ Start gedrückt? ④ Befindet sich das Ergebnispanel im Zustand ⏸ Pause?
F. Was ist der Unterschied zu SQL?
A. Der größte Unterschied ist das Konzept der Windows. Da EQL auf unendlichen Streams operiert, muss ein «Bereich» definiert werden. Darüber hinaus sind die Sequenzanalyse in pattern [ ... ] und Zeitkontexte in context Funktionen, die in SQL nicht existieren.
F. Was ist der Unterschied zwischen win:time(1 sec) und win:time_batch(1 sec)?
A. win:time(1 sec) ist sliding — das Ergebnis wird bei jedem eingehenden Event aktualisiert. win:time_batch(1 sec) ist tumbling — Events werden in 1-Sekunden-Blöcken gebündelt und genau in dem Moment ausgegeben, in dem die Sekunde abläuft. Verwenden Sie Batch, wenn Sie exakt sekundliche Ergebnisse benötigen.
F. Was ist der Unterschied zwischen pattern [ ... ] und einem normalen SELECT ... WHERE ...?
A. SELECT bewertet ein einzelnes Event (oder Window), während pattern eine Event-Sequenz bewertet (z.B. B folgt auf A, B ohne A). Verwenden Sie Pattern, wenn zeitliche Abläufe oder Kausalitäten wichtig sind.
F. Werden registrierte Variablen sofort übernommen?
A. Ja. Wenn Sie den Wert einer mit create variable definierten Variable in der Ansicht ändern, verwenden alle bereits bereitgestellten EQL-Regeln ab der nächsten Auswertung den neuen Wert.
F. Wie sende ich EQL-Matching-Ergebnisse als Alarm? A. Registrieren Sie die EQL in CEP → Trigger und aktivieren Sie die Optionen «MQ Streaming» oder «Storage-Speicherung», oder registrieren Sie die EQL unter Alarm → EQL-Alarm.
F. Kann ich anlagenbezogene Regeln pauschal auf alle Anlagen anwenden? A. Definieren Sie die anlagenbezogene EQL-Regel in CEP → Statements und mappen Sie diese Regel im Modell/Ontologie auf eine Anlagenkategorie. Die Regel wird dann automatisch auf alle Anlagen derselben Kategorie angewendet und auch für neu hinzugefügte Anlagen übernommen.
F. Kann ich zwei Streams in einer EQL-Zeile gleichzeitig verarbeiten?
A. Ja. Wie im Beispiel im Abschnitt JOIN gezeigt, listen Sie die beiden Streams in der FROM-Klausel mit Kommas auf und definieren die Join-Bedingung mittels WHERE.
F. Es werden zu viele Ergebnisse ausgegeben.
A. Verwenden Sie LIMIT N, um nur die obersten N Ergebnisse zu erhalten, erhöhen Sie das Ausgabeintervall über context EVERY_N_MINUTES oder bündeln Sie die Daten mittels Batch-Windows über win:time_batch. Eine striktere WHERE-Klausel ist ebenfalls effektiv.
F. Wo kann ich das Schreiben von EQL üben? A. Die Ansicht CEP → Abfrage dient als EQL-Praxiswerkzeug. Geben Sie eine Zeile ein und drücken Sie ▶ Ausführen, um sofort Ergebnisse zu sehen. Kopieren Sie zum Starten die oben genannten 12 Praxisbeispiele.
Verwandte Ansichten
- CEP — Ansicht zur Erstellung von EQL-Abfragen/Triggern/Statements
- Alarm → EQL-Alarm — Alarmierung bei beliebigen Bedingungen mittels EQL
- Flow — EQL-Modus für
flow_script_filter/flow_script_transform/flow_switch - Tag-Formular — KI-Tab — EQL-Bedingungen für Vorhersage- und Anomalieerkennungsregeln
- Integrierte Domänen-ID-Suche — Schnelle Suche nach Tag-/Anlagen-IDs für EQL (Strg+K)