Dies ist die alte 4D Dokumentations-Website. Die neue und aktualisierte Dokumentation finden Sie unter developer.4d.com |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v20 R7
Get database measures
|
Get database measures {( Optionen )} -> Funktionsergebnis | ||||||||
Parameter | Typ | Beschreibung | ||||||
Optionen | Objekt |
![]() |
Optionen für zurückgegebene Information | |||||
Funktionsergebnis | Objekt |
![]() |
Objekt mit Datenbankinformation | |||||
Die Funktion Get database measures gibt detaillierte Informationen über Ereignisse der 4D Datenbank Engine zurück. Dies umfasst Lese- und Schreibzugriffe auf die Festplatte oder den Memory Cache, sowie die Verwendung von Indizes, Suchen und Sortieren in der Datenbank.
Get database measures gibt ein einzelnes Objekt mit allen relevanten Messwerten zurück. Im Parameter Optionen können Sie die gewünschten Informationen genauer definieren.
Das zurückgegebene Objekt enthält eine einzelne Eigenschaft mit Namen "DB" mit folgender Grundstruktur:
{
"DB": {
"diskReadBytes": {…},
"cacheReadBytes": {…},
"cacheMissBytes": {…},
"diskWriteBytes": {…},
"diskReadCount": {…},
"cacheReadCount": {…},
"cacheMissCount": {…},
"diskWriteCount": {…},
"dataSegment1": {…},
"indexSegment": {…},
"tables": {…},
"indexes": {…}
}
}
Dieses Objekt enthält bis zu acht elementare Eigenschaften mit Messwerten ("diskReadBytes", "cacheReadBytes", "cacheMissBytes", "diskWriteBytes", "diskReadCount", "cacheReadCount", "cacheMissCount", "diskWriteCount") gültig für die gesamte Datenbank, sowie zusätzlich eine weitere Unterteilung in "dataSegment1", "indexSegment", "tables", "indexes". Diese Eigenschaften haben wiederum selbst die elementaren Eigenschaften, jeweils gültig für die entsprechende Untergruppe. Diese fein abgestimmte Unterteilung erlaubt die Analyse der Datenzugriffe je nach Bedarf vom Gesamtsystem bis hin zu Zugriffen auf einzelne Tabellen oder Indizes.
Hinweis: Eine Eigenschaft erscheint nur im Objekt, wenn sie Inhalt enthält. Eine Eigenschaft ohne Inhalt wird nicht in das Objekt aufgenommen. Wurde die Anwendung z.B. im Nur-Lesen Modus geöffnet und keine Indizes verwendet, enthält das zurückgegebene Objekt nicht die Messwerte "diskWriteBytes", "diskWriteCount", "indexSegment" und "indexes".
Elementare Eigenschaften gibt es auf verschiedenen Ebenen im Objekt DB. Sie enthalten dieselbe Informationsart, aber für unterschiedliche Datenbankobjekte. Hier die Beschreibung der einzelnen Eigenschaften:
Name | zurückgegebene Information |
diskReadBytes | von der Festplatte gelesene Bytes |
cacheReadBytes | vom Cache gelesene Bytes |
cacheMissBytes | im Cache nicht enthaltene Daten in Bytes |
diskWriteBytes | auf die Festplatte geschriebene Bytes |
diskReadCount | Anzahl der Lesezugriffe von der Festplatte |
cacheReadCount | Anzahl der Lesezugriffe vom Cache |
cacheMissCount | im Cache nicht enthaltene Daten; Anzahl Zugriffe |
diskWriteCount | Schreibzugriffe auf die Festplatte |
Alle acht elementaren Eigenschaften enthalten dieselbe Objektunterstruktur. Hier ein Beispiel:
"diskReadBytes": { "value": 33486473620, "history": [ // optional {"value": 52564,"time": -1665}, {"value": 54202,"time": -1649}, … ] }
Die Eigenschaften "dataSegment1" und "indexSegment" enthalten bis zu vier der elementaren Eigenschaften (sofern verfügbar):
"dataSegment1": {
"diskReadBytes": {…},
"diskWriteBytes": {…},
"diskReadCount": {…},
"diskWriteCount": {…}
},
"indexSegment": {
"diskReadBytes": {…},
"diskWriteBytes": {…},
"diskReadCount": {…},
"diskWriteCount": {…}
}
Diese Eigenschaften enthalten dieselbe Information wie die elementaren Eigenschaften, jedoch aufgeschlüsselt nach Datei der Datenbank:
Ihr Objekt könnte z.B. folgendermaßen aussehen:
{ "DB": { "diskReadBytes": { "value": 718260 }, "diskReadCount": { "value": 229 }, "dataSegment1": { "diskReadBytes": { "value": 679092 }, "diskReadCount": { "value": 212 } }, "indexSegment": { "diskReadBytes": { "value": 39168 }, "diskReadCount": { "value": 17 } }
Die Werte werden so berechnet:
diskReadBytes.value = dataSegment1.diskReadBytes.value + indexSegment.diskReadBytes.value
diskWriteBytes.value = dataSegment1.diskWriteBytes.value + indexSegment.diskWriteBytes.value
diskReadCount.value = dataSegment1.diskReadCount.value + indexSegment.diskReadCount.value
diskWriteCount.value = dataSegment1.diskWriteCount.value + indexSegment.diskWriteCount.value
Die Eigenschaft "tables" enthält alle Tabellen, auf die seit Öffnen der Datenbank im Lese- oder Schreibmodus zugegriffen wurde. Der Name der Eigenschaft leitet sich vom jeweiligen Tabellennamen ab, zum Beispiel:
"tables": { "Employees": {…) "Companies": {…) }
Jedes Objekt "table" enthält 10 Eigenschaften:
Je nach Such- oder Sortierläufen in der Tabelle können zusätzliche Eigenschaften "fields" und "queries" vorhanden sein:
{ "DB": { "tables": { "Employees": { "fields": { "CompID": { "queryCount": { "value": 3 } }, "Name": { "queryCount": { "value": 1 }, "sortCount": { "value": 3 } }, "FirstName": { "sortCount": { "value": 2 } } (...)
"queries" ist ein Array mit Objekten, das jede in der Tabelle durchgeführte Suche beschreibt. Jedes Element des Array enthält drei Attribute:
Beispiel: Seit dem Start der Datenbank wurde in der Tabelle Employees eine Suche durchgeführt (Optionen sind mit Pfad und ohne Chronik):
{ "DB": { "tables": { "Employees": { "queries": [ { "queryStatement": "(Employees.Name == ?)", "queryCount": { "value": 1, "history": [ { "value": 1, "time": -2022 } ] }, "duration": { "value": 2, "history": [ { "value": 2, "time": -2022 } ] } }, (...)
Dies ist das umfangreichste Objekt. Alle Tabellen, auf die über einen oder mehrere Indizes zugegriffen wurde, werden als Eigenschaften gespeichert, die verwendeten Indizes darin wieder als Eigenschaften aufgeführt. Volltextindexes erscheinen separat und an ihren Namen wird "(Keyword)" angehängt. Schließlich erscheint jede Eigenschaft Indexname jeweils wieder mit den acht elementaren Eigenschaften und, je nach Index-Verwendung seit Starten der Datenbank, mit bis zu vier Unterobjekten. Jedes dieser Unterobjekte existiert nur, wenn die dazugehörige Operation seit Starten der Datenbank an irgendeinem Punkt ausgeführt wurde.
Beispiel: Seit dem Starten der Datenbank wurden mehrere Indizes des Feldes [Employees]EmpLastName angefordert. Außerdem wurden in der Tabelle [Companies] 2 Datensätze erstellt und 16 gelöscht. Diese Tabelle hat das indizierte Feld "name". Sie wurde über dieses Feld auch durchsucht und sortiert. Als Ergebnis ergibt sich folgendes:
"indexes": { "Employees": { "EmpLastName": { "diskReadBytes": {…}, "cacheReadBytes": {…}, "cacheMissBytes": {…}, "diskWriteBytes": {…}, "diskReadCount": {…}, "cacheReadCount": {…}, "cacheMissCount": {…}, "diskWriteCount": {…} } "EmpLastName (Keyword)": {...}, "index3Name": {…}, "index4Name": {…}, … } "Companies": { "Name": (...) "queryCount": { "value": 41 }, "sortCount": { "value": 3 }, "insertKeyCount": { "value": 2 }, "deleteKeyCount": { "value": 16 } table3Name: {…} }
Mit dem Parameter Optionen können Sie die zurückgegebene aktuelle Information anpassen. In Optionen übergeben Sie ein Objekt mit bis zu drei Eigenschaften: "withHistory", "historyLength" und "path".
Eigenschaft | Typ | Beschreibung |
"withHistory" | Boolean | bei "true" erscheint die Chronik über die Funktion im zurückgegebenen Objekt; bei "false" enthält das zurückgegebene Objekt keine Chronik |
"historyLength" | Zahl | Definiert die Größe des zurückgegebenen Array "history" in Sekunden (*). |
"path" | string | string array | Kompletter Pfad einer bestimmten Eigenschaft oder Array mit kompletten Pfaden für alle spezifischen Eigenschaften, die Sie erhalten wollen. Übergeben Sie einen String, wird nur der entsprechende Wert im Objekt "DB" zurückgegeben (wenn der Pfad gültig ist). Beispiel "DB.tables.Employee.records.diskWriteBytes" (bei gültigen Pfaden). Übergeben Sie ein Array mit Strings, werden im Objekt "DB" alle entsprechenden Werte zurückgegeben. Beispiel: ["DB.tables.Employee.records.diskWriteBytes", "DB.tables.Employee.records.diskReadCount","DB.dataSegment1.diskReadBytes"] |
(*) Wie oben beschrieben, wird der Verlauf nicht sekundenweise gespeichert, sondern nur nach relevanten Werten. Passiert ein paar Sekunden lang nichts, wird nichts gespeichert und im internen Verlauf des Array entsteht eine zeitliche Lücke. "time" kann z.B. -2, -4, -5, -10, -15, -30 mit den Werten 200, 300, 250, 400, 500,150 enthalten. Hat die Eigenschaft "historyLength" den Wert 600 (10 Minuten), enthält das zurückgegebene Array 0, -1, -2, -3 … -599 für Zeit, aber nur die Werte von -2, -4, -5, -10, -15, -30 werden gefüllt. Alle anderen Werte erhalten den Wert 0 (Null). Wie bereits beschrieben, ist die Begrenzung des internen Array die Größe (200) und nicht die Zeit. Folglich kann bei geringer Aktivität einer bestimmten Eigenschaft die älteste Zeit länger zurückliegen, z.B. -3600 für eine ganze Stunde. Das Array kann auch weniger als 200 Werte enthalten, wenn die Datenbank gerade gestartet wurde. Liegt dann die interne Zeitspanne der Chronik unter der angeforderten ODER erscheinen alle relevanten Werte bereits im zurückgegebenen Array, lautet der zurückgegebene Wert -1.
Beispiel: Die Datenbank wurde vor 20 Sekunden gestartet, die Chronik der Anfrage ist 60 Sekunden. Die zurückgegebenen Werte zwischen 0 und -20 werden mit Werten oder Nullen gefüllt, die anderen werden auf -1 gesetzt. Wird ein Wert "-1" zurückgegeben, bedeutet dies entweder, dass die Anfragezeit zu alt ist oder der Wert nicht mehr in der Chronik liegt, z.B. weil der 200. Eintrag erreicht ist bzw. ältere Werte entfernt wurden.
Hinweis: Das Filtern über "historyLength" verlangsamt deutlich die Abarbeitung des Befehls. Zur statistischen Auswertung belasteter Server ist es sinnvoller, das gesamte Objekt ohne Angabe von "historyLength" abzufragen und das Ergebnis offline auszuwerten.
Get database measures gibt ein gültiges Objekt mit relevanten Werten nur in folgendem Kontext zurück:
Bei Aufruf über ein remote 4D bleibt das Objekt leer.
Benötigen Sie in remote 4D Information über die Datenbank auf dem Server, legen Sie einfach eine Methode an und aktivieren dafür die Option "auf Server ausführen".
Dieses Prinzip funktioniert auch für eine Komponente: Im lokalen Kontext von 4D gibt sie Information über die Host Datenbank zurück; im remote Kontext von 4D gibt sie Information über die Server Datenbank zurück.
Im zurückgegebenen Objekt die Chronik anzeigen:
C_OBJECT($param)
C_OBJECT($measures)
OB SET($param;"withHistory";True)
$measures:=Get database measures($param)
Nur die globale Anzahl der im Cache gelesenen Bytes anfordern ("cacheReadBytes"):
C_OBJECT($oStats)
C_OBJECT($oParams)
OB SET($oParams;"path";"DB.cacheReadBytes")
$oStats:=Get database measures($oParams)
Das zurückgegebene Objekt könnte folgendermaßen aussehen:
{ "DB": { "cacheReadBytes": { "value": 9516637 } } }
Die Meßwerte für im Cache gelesene Bytes der letzten zwei Minuten anfordern:
C_OBJECT($oParams)
C_OBJECT($measures)
OB SET($oParams;"path";"DB.cacheReadBytes")
OB SET($oParams;"withHistory";True)
OB SET($oParams;"historyLength";2*60)
$measures:=Get database measures($oParams)
Produkt: 4D
Thema: 4D Umgebung
Nummer:
1314
Erstellt: 4D v14 R3
Geändert: 4D v14 R5
4D Programmiersprache ( 4D v20 R7)