Strukturieren von JSON zum Maximieren der AbfrageleistungShape JSON to maximize query performance

Dieser Artikel bietet Hilfestellung bei der JSON-Strukturierung, um die Effizienz Ihrer Azure Time Series Insights-Abfragen zu maximieren.This article provides guidance on how to shape JSON to maximize the efficiency of your Azure Time Series Insights queries.

VideoVideo

Bewährte Methoden für die Anpassung von JSON an Ihre SpeicheranforderungenLearn best practices for shaping JSON to meet your storage needs.

Bewährte MethodenBest practices

Sie berücksichtigen beim Senden von Ereignissen an Time Series Insights verschiedene Aspekte.Think about how you send events to Time Series Insights. Diese Aspekte sind immer wichtig:Namely, you always:

  1. Senden Sie Daten so effizient wie möglich über das Netzwerk.Send data over the network as efficiently as possible.
  2. Stellen Sie sicher, dass Ihre Daten in einer Weise gespeichert werden, die das Ausführen geeigneter Aggregationen für Ihr Szenario ermöglichen.Make sure your data is stored in a way so that you can perform aggregations suitable for your scenario.
  3. Stellen Sie sicher, dass die Grenzwerte für Time Series Insights-Eigenschaften nicht überschritten werden:Make sure that you don't reach the Time Series Insights maximum property limits of:
    • 600 Eigenschaften (Spalten) für S1-Umgebungen600 properties (columns) for S1 environments.
    • 800 Eigenschaften (Spalten) für S2-Umgebungen800 properties (columns) for S2 environments.

Tipp

Lesen Sie Limits und Planung in Azure Time Series Insights Preview.Review limits and planning in Azure Time Series Insights Preview.

Die folgenden Richtlinien unterstützen Sie dabei, die bestmögliche Abfrageleistung zu erzielen:The following guidance helps to ensure the best possible query performance:

  1. Verwenden Sie dynamische Eigenschaften (z.B. einer Transponder-ID) nicht als Eigenschaftenname.Don't use dynamic properties, such as a tag ID, as a property name. Diese Vorgehensweise trägt dazu bei, die maximale Eigenschaftsgrenze zu erreichen.This use contributes to reaching the maximum properties limit.
  2. Senden Sie keine unnötigen Eigenschaften.Don't send unnecessary properties. Wenn eine Abfrageeigenschaft nicht benötigt wird, sollte sie nicht gesendet werden.If a query property isn't required, it's best not to send it. Auf diese Weise vermeiden Sie Speicherengpässe.This way you avoid storage limitations.
  3. Verwenden Sie Verweisdaten, um das Senden von statischen Daten über das Netzwerk zu vermeiden.Use reference data to avoid sending static data over the network.
  4. Verwenden Sie Dimensionseigenschaften für mehrere Ereignisse gemeinsam, um Daten effizienter über das Netzwerk zu senden.Share dimension properties among multiple events to send data over the network more efficiently.
  5. Verwenden Sie keine tiefe Arrayschachtelung.Don't use deep array nesting. Time Series Insights unterstützt bis zu zwei Ebenen für geschachtelte Arrays, die Objekte enthalten.Time Series Insights supports up to two levels of nested arrays that contain objects. Time Series Insights sorgt für flache Arrays in Nachrichten, indem eine Aufteilung in mehrere Ereignisse mit Eigenschaft-Wert-Paaren durchgeführt wird.Time Series Insights flattens arrays in the messages into multiple events with property value pairs.
  6. Wenn nur wenige Messwerte für viele oder alle Ereignisse vorhanden sind, ist es besser, diese Messwerte als separate Eigenschaften innerhalb desselben Objekts zu senden.If only a few measures exist for all or most events, it's better to send these measures as separate properties within the same object. Durch das separate Senden wird die Anzahl von Ereignissen verringert und die Abfrageleistung möglicherweise gesteigert, weil weniger Ereignisse verarbeitet werden müssen.Sending them separately reduces the number of events and might improve query performance because fewer events need to be processed. Wenn mehrere Messwerte vorliegen, wird durch das Senden dieser als Werte in einer einzelnen Eigenschaft die Möglichkeit verringert, das Limit für die maximal zulässige Anzahl von Eigenschaften zu erreichen.When there are several measures, sending them as values in a single property minimizes the possibility of reaching the maximum property limit.

Übersicht über das BeispielExample overview

Die folgenden zwei Beispiele veranschaulichen das Senden von Ereignissen, um die zuvor genannten Empfehlungen zu verdeutlichen.The following two examples demonstrate how to send events to highlight the previous recommendations. Im Anschluss an jedes Beispiel können Sie sehen, wie die Empfehlungen umgesetzt wurden.Following each example, you can see how the recommendations were applied.

Die Beispiele basieren auf einem Szenario, in dem mehrere Geräte Messungen oder Signale senden.The examples are based on a scenario where multiple devices send measurements or signals. Bei diesen Messungen oder Signalen kann es sich um Werte wie Flussrate, Öldruck, Temperatur und Feuchtigkeit handeln.Measurements or signals can be Flow Rate, Engine Oil Pressure, Temperature, and Humidity. Im ersten Beispiel liegen einige wenige Messungen vor, die auf alle Geräte verteilt sind.In the first example, there are a few measurements across all devices. Im zweiten Beispiel sind zahlreiche Geräte vorhanden, von denen jedes zahlreiche eindeutige Messungen sendet.The second example has many devices, and each device sends many unique measurements.

Szenario 1: Es sind nur wenige Messungen vorhanden.Scenario one: Only a few measurements exist

Tipp

Es wird empfohlen, jede Messung und jedes Signal als separate Eigenschaft bzw. Spalte zu senden.We recommend that you send each measurement or signal as a separate property or column.

Im folgenden Beispiel wird eine einzelne Azure IoT Hub-Nachricht verwendet, bei der das äußere Array einen gemeinsam verwendeten Abschnitt für allgemeine Dimensionswerte enthält.In the following example, there's a single Azure IoT Hub message where the outer array contains a shared section of common dimension values. Das äußere Array verwendet Verweisdaten, um die Effizienz der Nachricht zu erhöhen.The outer array uses reference data to increase the efficiency of the message. Verweisdaten enthalten Gerätemetadaten, die sich nicht bei jedem Ereignis ändern, aber nützliche Eigenschaften für die Datenanalyse bereitstellen.Reference data contains device metadata that doesn't change with every event, but it provides useful properties for data analysis. Durch Batchverarbeitung allgemeiner Dimensionswerte und Verwendung von Verweisdaten werden beim Senden der Nachricht über das Netzwerk Bytes eingespart, und die Effizienz wird somit gesteigert.Batching common dimension values and employing reference data saves on bytes sent over the wire, which makes the message more efficient.

Beachten Sie die folgende JSON-Nutzlast, die mithilfe eines IoT-Gerätemeldungsobjekts, das beim Senden an die Azure-Cloud in JSON serialisiert wird, an Ihre Time Series Insights GA-Umgebung gesendet wird:Consider the following JSON payload sent to your Time Series Insights GA environment using an IoT Device Message object that is serialized into JSON when sent to Azure cloud:

[
    {
        "deviceId": "FXXX",
        "timestamp": "2018-01-17T01:17:00Z",
        "series": [
            {
                "Flow Rate ft3/s": 1.0172575712203979,
                "Engine Oil Pressure psi ": 34.7
            },
            {
                "Flow Rate ft3/s": 2.445906400680542,
                "Engine Oil Pressure psi ": 49.2
            }
        ]
    },
    {
        "deviceId": "FYYY",
        "timestamp": "2018-01-17T01:18:00Z",
        "series": [
            {
                "Flow Rate ft3/s": 0.58015072345733643,
                "Engine Oil Pressure psi ": 22.2
            }
        ]
    }
]
  • Verweisdatentabelle mit Schlüsseleigenschaft deviceID:Reference data table that has the key property deviceId:

    deviceIddeviceId messageIdmessageId deviceLocationdeviceLocation
    FXXXFXXX LINE_DATALINE_DATA EUEU
    FYYYFYYY LINE_DATALINE_DATA USUS
  • Time Series Insights-Ereignistabelle, flache Ansicht:Time Series Insights event table, after flattening:

    deviceIddeviceId messageIdmessageId deviceLocationdeviceLocation timestamptimestamp series.Flow Rate ft3/sseries.Flow Rate ft3/s series.Engine Oil Pressure psiseries.Engine Oil Pressure psi
    FXXXFXXX LINE_DATALINE_DATA EUEU 2018-01-17T01:17:00Z2018-01-17T01:17:00Z 1.01725757122039791.0172575712203979 34.734.7
    FXXXFXXX LINE_DATALINE_DATA EUEU 2018-01-17T01:17:00Z2018-01-17T01:17:00Z 2.4459064006805422.445906400680542 49.249.2
    FYYYFYYY LINE_DATALINE_DATA USUS 2018-01-17T01:18:00Z2018-01-17T01:18:00Z 0.580150723457336430.58015072345733643 22.222.2

Hinweis

  • Die Spalte deviceId dient als Spaltenüberschrift für die verschiedenen Geräte in einem Bestand.The deviceId column serves as the column header for the various devices in a fleet. Die Verwendung von deviceID als eigener Eigenschaftenname beschränkt die Gesamtzahl der Geräte mit den fünf weiteren Spalten auf 595 (S1-Umgebungen) oder 795 (S2-Umgebungen).Making the deviceId value its own property name limits the total devices to 595 (for S1 environments) or 795 (for S2 environments) with the other five columns.
  • Unnötige Eigenschaften werden vermieden (z. B. Fabrikat- und Modellinformationen).Unnecessary properties are avoided (for example, the make and model information). Da die Eigenschaften künftig nicht abgefragt werden, wird durch ihr Entfernen die Netzwerk- und Speichereffizienz verbessert.Because the properties won't be queried in the future, eliminating them enables better network and storage efficiency.
  • Verweisdaten werden verwendet, um die Anzahl von Bytes zu verringern, die über das Netzwerk übertragen werden.Reference data is used to reduce the number of bytes transferred over the network. Die beiden Attribute (messageId und deviceLocation) werden mithilfe der Schlüsseleigenschaft deviceId verknüpft.The two attributes messageId and deviceLocation are joined by using the key property deviceId. Diese Daten werden zum Zeitpunkt ihres Eingangs mit den Telemetriedaten verknüpft und anschließend zur Abfrage in Time Series Insights gespeichert.This data is joined with the telemetry data at ingress time and is then stored in Time Series Insights for querying.
  • Es werden zwei Schachtelungsebenen verwendet. Diese entsprechen der maximal zulässigen Schachtelung, die von Time Series Insights unterstützt wird.Two layers of nesting are used, which is the maximum amount of nesting supported by Time Series Insights. Tief verschachtelte Arrays müssen vermieden werden.It's critical to avoid deeply nested arrays.
  • Messwerte werden als separate Eigenschaften innerhalb desselben Objekts gesendet, da nur wenige Messwerte vorliegen.Measures are sent as separate properties within the same object because there are few measures. In diesem Fall sind series.Flow Rate psi und series.Engine Oil Pressure ft3/s eindeutige Spalten.Here, series.Flow Rate psi and series.Engine Oil Pressure ft3/s are unique columns.

Szenario 2: Es sind mehrere Messwerte vorhanden.Scenario two: Several measures exist

Tipp

Es wird empfohlen, Messungen als „type“-, „unit“- und „value“-Tupel zu senden.We recommend that you send measurements as "type," "unit," and "value" tuples.

Beispiel-JSON-Nutzlast:Example JSON payload:

[
    {
        "deviceId": "FXXX",
        "timestamp": "2018-01-17T01:17:00Z",
        "series": [
            {
                "tagId": "pumpRate",
                "value": 1.0172575712203979
            },
            {
                "tagId": "oilPressure",
                "value": 49.2
            },
            {
                "tagId": "pumpRate",
                "value": 2.445906400680542
            },
            {
                "tagId": "oilPressure",
                "value": 34.7
            }
        ]
    },
    {
        "deviceId": "FYYY",
        "timestamp": "2018-01-17T01:18:00Z",
        "series": [
            {
                "tagId": "pumpRate",
                "value": 0.58015072345733643
            },
            {
                "tagId": "oilPressure",
                "value": 22.2
            }
        ]
    }
]
  • Verweisdatentabelle mit den Schlüsseleigenschaften deviceId und series.tagId:Reference data table that has the key properties deviceId and series.tagId:

    deviceIddeviceId series.tagIdseries.tagId messageIdmessageId deviceLocationdeviceLocation typetype unitunit
    FXXXFXXX pumpRatepumpRate LINE_DATALINE_DATA EUEU Flow RateFlow Rate ft3/sft3/s
    FXXXFXXX oilPressureoilPressure LINE_DATALINE_DATA EUEU Engine Oil PressureEngine Oil Pressure psipsi
    FYYYFYYY pumpRatepumpRate LINE_DATALINE_DATA USUS Flow RateFlow Rate ft3/sft3/s
    FYYYFYYY oilPressureoilPressure LINE_DATALINE_DATA USUS Engine Oil PressureEngine Oil Pressure psipsi
  • Time Series Insights-Ereignistabelle, flache Ansicht:Time Series Insights event table, after flattening:

    deviceIddeviceId series.tagIdseries.tagId messageIdmessageId deviceLocationdeviceLocation typetype unitunit timestamptimestamp series.valueseries.value
    FXXXFXXX pumpRatepumpRate LINE_DATALINE_DATA EUEU Flow RateFlow Rate ft3/sft3/s 2018-01-17T01:17:00Z2018-01-17T01:17:00Z 1.01725757122039791.0172575712203979
    FXXXFXXX oilPressureoilPressure LINE_DATALINE_DATA EUEU Engine Oil PressureEngine Oil Pressure psipsi 2018-01-17T01:17:00Z2018-01-17T01:17:00Z 34.734.7
    FXXXFXXX pumpRatepumpRate LINE_DATALINE_DATA EUEU Flow RateFlow Rate ft3/sft3/s 2018-01-17T01:17:00Z2018-01-17T01:17:00Z 2.4459064006805422.445906400680542
    FXXXFXXX oilPressureoilPressure LINE_DATALINE_DATA EUEU Engine Oil PressureEngine Oil Pressure psipsi 2018-01-17T01:17:00Z2018-01-17T01:17:00Z 49.249.2
    FYYYFYYY pumpRatepumpRate LINE_DATALINE_DATA USUS Flow RateFlow Rate ft3/sft3/s 2018-01-17T01:18:00Z2018-01-17T01:18:00Z 0.580150723457336430.58015072345733643
    FYYYFYYY oilPressureoilPressure LINE_DATALINE_DATA USUS Engine Oil PressureEngine Oil Pressure psipsi 2018-01-17T01:18:00Z2018-01-17T01:18:00Z 22.222.2

Hinweis

  • Die Spalten deviceId und series.tagId dienen als Spaltenüberschriften für die verschiedenen Geräte und Tags in einem Bestand.The columns deviceId and series.tagId serve as the column headers for the various devices and tags in a fleet. Eine Verwendung als eigenes Attribut beschränkt die Abfrage mit den weiteren sechs Spalten auf insgesamt 594 (für S1-Umgebungen) oder 794 (für S2-Umgebungen).Using each as its own attribute limits the query to 594 (for S1 environments) or 794 (for S2 environments) total devices with the other six columns.
  • Unnötige Eigenschaften werden (aus dem gleichen Grund wie im ersten Beispiel) vermieden.Unnecessary properties were avoided, for the reason cited in the first example.
  • Verweisdaten werden verwendet, um die Anzahl von Bytes zu verringern, die über das Netzwerk übertragen werden. Dies wird durch die Einführung von deviceId für ein eindeutiges Paar aus messageId und deviceLocation erreicht.Reference data is used to reduce the number of bytes transferred over the network by introducing deviceId, which is used for the unique pair of messageId and deviceLocation. Der zusammengesetzte Schlüssel series.tagId wird für das eindeutige Paar aus type und unit verwendet.The composite key series.tagId is used for the unique pair of type and unit. Der zusammengesetzte Schlüssel ermöglicht die Verwendung des Paars aus deviceId und series.tagId, um auf vier Werte zu verweisen: messageId, deviceLocation, type und unit.The composite key allows the deviceId and series.tagId pair to be used to refer to four values: messageId, deviceLocation, type, and unit. Diese Daten werden zur Eingangszeit mit den Telemetriedaten verknüpft.This data is joined with the telemetry data at ingress time. Sie werden dann für Abfragen in Time Series Insights gespeichert.It's then stored in Time Series Insights for querying.
  • Es werden (aus dem gleichen Grund wie im ersten Beispiel) zwei Schachtelungsebenen verwendet.Two layers of nesting are used, for the reason cited in the first example.

Für beide SzenarienFor both scenarios

Für eine Eigenschaft mit einer großen Anzahl möglicher Werte werden diese am besten als eindeutige Werte innerhalb einer einzelnen Spalte gesendet, anstatt eine neue Spalte für jeden Wert zu erstellen.For a property with a large number of possible values, it's best to send as distinct values within a single column instead of creating a new column for each value. Aus den zwei vorangehenden Beispielen:From the previous two examples:

  • Im ersten Beispiel weisen einige wenige Eigenschaften verschiedene Werte auf, deshalb ist es angemessen, jeweils eine separate Eigenschaft zu verwenden.In the first example, a few properties have several values, so it's appropriate to make each a separate property.
  • Im zweiten Beispiel werden die Messwerte nicht als einzelne Eigenschaften angegeben.In the second example, the measures aren't specified as individual properties. Stattdessen bilden sie ein Array von Werten oder Messwerten unter einer gemeinsamen Reiheneigenschaft.Instead, they're an array of values or measures under a common series property. Der neue Schlüssel (tagId) wird gesendet, mit dem die neue Spalte (series.tagId) in der flachen Tabelle erstellt wird.The new key tagId is sent, which creates the new column series.tagId in the flattened table. Die neuen Eigenschaften type und unit werden mithilfe von Verweisdaten erstellt, sodass das Eigenschaftenlimit nicht erreicht wird.The new properties type and unit are created by using reference data so that the property limit isn't reached.

Nächste SchritteNext steps