Vyhodnocování dotazů Gremlin s využitím kroku profilu spuštění
PLATÍ pro:
rozhraní Gremlin API
Tento článek obsahuje přehled použití kroku profilu spuštění pro grafové databáze rozhraní Gremlin API služby Azure Cosmos DB. Tento krok poskytuje relevantní informace pro účely řešení potíží a optimalizace dotazů a je kompatibilní se všemi dotazy Gremlin, které je možné spustit pro účet rozhraní Gremlin API služby Cosmos DB.
Pokud chcete použít tento krok, jednoduše připojte volání funkce na executionProfile() konec dotazu Gremlin. Spustí se váš dotaz Gremlin a výsledek operace vrátí objekt odpovědi JSON s profilem spuštění dotazu.
Příklad:
// Basic traversal
g.V('mary').out()
// Basic traversal with execution profile call
g.V('mary').out().executionProfile()
Po volání kroku bude odpovědí objekt JSON, který obsahuje spuštěný krok Gremlin, celkovou dobu, kterou trvalo, a pole operátorů modulu runtime Cosmos DB, které příkaz executionProfile() vyvolal.
Poznámka
Tato implementace profilu spuštění není definovaná ve specifikaci Apache Tinkerpop. Je specifický pro implementaci rozhraní Gremlin API služby Azure Cosmos DB.
Příklad odpovědi
Následuje příklad s poznámkami pro výstup, který se vrátí:
Poznámka
Tento příklad je anotován komentáři, které vysvětlují obecnou strukturu odpovědi. Skutečná odpověď executionProfile nebude obsahovat žádné komentáře.
[
{
// The Gremlin statement that was executed.
"gremlin": "g.V('mary').out().executionProfile()",
// Amount of time in milliseconds that the entire operation took.
"totalTime": 28,
// An array containing metrics for each of the steps that were executed.
// Each Gremlin step will translate to one or more of these steps.
// This list is sorted in order of execution.
"metrics": [
{
// This operation obtains a set of Vertex objects.
// The metrics include: time, percentTime of total execution time, resultCount,
// fanoutFactor, count, size (in bytes) and time.
"name": "GetVertices",
"time": 24,
"annotations": {
"percentTime": 85.71
},
"counts": {
"resultCount": 2
},
"storeOps": [
{
"fanoutFactor": 1,
"count": 2,
"size": 696,
"time": 0.4
}
]
},
{
// This operation obtains a set of Edge objects.
// Depending on the query, these might be directly adjacent to a set of vertices,
// or separate, in the case of an E() query.
//
// The metrics include: time, percentTime of total execution time, resultCount,
// fanoutFactor, count, size (in bytes) and time.
"name": "GetEdges",
"time": 4,
"annotations": {
"percentTime": 14.29
},
"counts": {
"resultCount": 1
},
"storeOps": [
{
"fanoutFactor": 1,
"count": 1,
"size": 419,
"time": 0.67
}
]
},
{
// This operation obtains the vertices that a set of edges point at.
// The metrics include: time, percentTime of total execution time and resultCount.
"name": "GetNeighborVertices",
"time": 0,
"annotations": {
"percentTime": 0
},
"counts": {
"resultCount": 1
}
},
{
// This operation represents the serialization and preparation for a result from
// the preceding graph operations. The metrics include: time, percentTime of total
// execution time and resultCount.
"name": "ProjectOperator",
"time": 0,
"annotations": {
"percentTime": 0
},
"counts": {
"resultCount": 1
}
}
]
}
]
Poznámka
Krok executionProfile spustí dotaz Gremlin. To zahrnuje kroky nebo , které mají za následek vytvoření a potvrdí změny addV addE zadané v dotazu. V důsledku toho se budou účtovat také jednotky žádostí vygenerované dotazem Gremlin.
Objekty odpovědi profilu spuštění
Odpověď funkce executionProfile() vrátí hierarchii objektů JSON s následující strukturou:
Objekt operace Gremlin: Představuje celou spuštěnou operaci Gremlin. Obsahuje následující vlastnosti.
gremlin: Explicitní příkaz Gremlin, který byl proveden.totalTime: Čas v milisekundách, ve které ke spuštění kroku došla.metrics: Pole, které obsahuje všechny operátory modulu runtime Cosmos DB, které byly provedeny ke splnění dotazu. Tento seznam je seřazený v pořadí podle provedení.
Cosmos runtime db: Představuje všechny komponenty celé operace Gremlin. Tento seznam je seřazený v pořadí podle provedení. Každý objekt obsahuje následující vlastnosti:
name: Název operátoru. Jedná se o typ kroku, který byl vyhodnocen a proveden. Další informace najdete v následující tabulce.time: Doba v milisekundách, kterou daný operátor trval.annotations: Obsahuje další informace specifické pro operátor, který byl proveden.annotations.percentTime: Procento celkové doby, kterou trvalo spuštění konkrétního operátoru.counts: Počet objektů, které tento operátor vrátil z vrstvy úložiště. To je obsaženo vecounts.resultCountskalární hodnotě uvnitř .storeOps: Představuje operaci úložiště, která může zahrnovat jeden nebo více oddílů.storeOps.fanoutFactor: Představuje počet oddílů, ke kterým tato konkrétní operace úložiště přistupoval.storeOps.count: Představuje počet výsledků vrácených touto operací úložiště.storeOps.size: Představuje velikost výsledku dané operace úložiště v bajtech.
| Cosmos Db Gremlin Runtime – operátor | Description |
|---|---|
GetVertices |
Tento krok získá predikovanou sadu objektů z vrstvy trvalosti. |
GetEdges |
Tento krok získá hrany, které sousedí se sadu vrcholů. Tento krok může vést k jedné nebo více operacím úložiště. |
GetNeighborVertices |
Tento krok získá vrcholy, které jsou připojeny k sadě hran. Hrany obsahují klíče oddílů a ID jejich zdrojového i cílového vrcholu. |
Coalesce |
V tomto kroku se při každém spuštění kroku Gremlin zohodnotí coalesce() vyhodnocení dvou operací. |
CartesianProductOperator |
Tento krok vypočítá kartézský soupočítání mezi dvěma datovými sadami. Obvykle se provádí při každém použití to() from() predikátů nebo . |
ConstantSourceOperator |
Tento krok vypočítá výraz, aby v důsledku toho získal konstantní hodnotu. |
ProjectOperator |
Tento krok připraví a serializuje odpověď pomocí výsledku předchozích operací. |
ProjectAggregation |
Tento krok připraví a serializuje odpověď pro agregační operaci. |
Poznámka
Tento seznam bude i nadále aktualizován s přidáním nových operátorů.
Příklady analýzy odpovědi profilu spuštění
Tady jsou příklady běžných optimalizací, které je možné zachytát pomocí odpovědi profilu spuštění:
- Dotaz na nevidomé ventilátory.
- Nefiltrovaný dotaz.
Vzory dotazů pro nevidomé
Předpokládejme, že následující odpověď profilu spuštění z dělené grafu:
[
{
"gremlin": "g.V('tt0093640').executionProfile()",
"totalTime": 46,
"metrics": [
{
"name": "GetVertices",
"time": 46,
"annotations": {
"percentTime": 100
},
"counts": {
"resultCount": 1
},
"storeOps": [
{
"fanoutFactor": 5,
"count": 1,
"size": 589,
"time": 75.61
}
]
},
{
"name": "ProjectOperator",
"time": 0,
"annotations": {
"percentTime": 0
},
"counts": {
"resultCount": 1
}
}
]
}
]
Mohou z něj vyvozovat následující závěry:
- Dotaz je vyhledávání s jedním ID, protože příkaz Gremlin dodržuje vzor
g.V('id'). - Z metriky se zdá, že latence tohoto dotazu je vysoká, protože pro jednu operaci čtení bodů je to více než
time10ms. - Když se podíváme na objekt , uvidíme, že je , což znamená, že tato operace přistupovala k
storeOpsfanoutFactor55 oddílům.
Závěrem této analýzy můžeme určit, že první dotaz přistupuje k více oddílům, než je nezbytné. Tento problém je možné vyřešit zadáním klíče dělení v dotazu jako predikátu. To povede k nižší latenci a snížení nákladů na dotaz. Přečtěte si další informace o dělení grafů. Optimální dotaz by byl g.V('tt0093640').has('partitionKey', 't1001') .
Nefiltrované vzory dotazů
Porovnejte následující dvě odpovědi profilu spuštění. Pro zjednodušení tyto příklady používají jeden dělený graf.
Tento první dotaz načte všechny vrcholy s popiskem a pak získá jejich sousední tweet vrcholy:
[
{
"gremlin": "g.V().hasLabel('tweet').out().executionProfile()",
"totalTime": 42,
"metrics": [
{
"name": "GetVertices",
"time": 31,
"annotations": {
"percentTime": 73.81
},
"counts": {
"resultCount": 30
},
"storeOps": [
{
"fanoutFactor": 1,
"count": 13,
"size": 6819,
"time": 1.02
}
]
},
{
"name": "GetEdges",
"time": 6,
"annotations": {
"percentTime": 14.29
},
"counts": {
"resultCount": 18
},
"storeOps": [
{
"fanoutFactor": 1,
"count": 20,
"size": 7950,
"time": 1.98
}
]
},
{
"name": "GetNeighborVertices",
"time": 5,
"annotations": {
"percentTime": 11.9
},
"counts": {
"resultCount": 20
},
"storeOps": [
{
"fanoutFactor": 1,
"count": 4,
"size": 1070,
"time": 1.19
}
]
},
{
"name": "ProjectOperator",
"time": 0,
"annotations": {
"percentTime": 0
},
"counts": {
"resultCount": 20
}
}
]
}
]
Všimněte si profilu stejného dotazu, ale teď s dalším filtrem has('lang', 'en') před prozkoumáváním sousedních vrcholů:
[
{
"gremlin": "g.V().hasLabel('tweet').has('lang', 'en').out().executionProfile()",
"totalTime": 14,
"metrics": [
{
"name": "GetVertices",
"time": 14,
"annotations": {
"percentTime": 58.33
},
"counts": {
"resultCount": 11
},
"storeOps": [
{
"fanoutFactor": 1,
"count": 11,
"size": 4807,
"time": 1.27
}
]
},
{
"name": "GetEdges",
"time": 5,
"annotations": {
"percentTime": 20.83
},
"counts": {
"resultCount": 18
},
"storeOps": [
{
"fanoutFactor": 1,
"count": 18,
"size": 7159,
"time": 1.7
}
]
},
{
"name": "GetNeighborVertices",
"time": 5,
"annotations": {
"percentTime": 20.83
},
"counts": {
"resultCount": 18
},
"storeOps": [
{
"fanoutFactor": 1,
"count": 4,
"size": 1070,
"time": 1.01
}
]
},
{
"name": "ProjectOperator",
"time": 0,
"annotations": {
"percentTime": 0
},
"counts": {
"resultCount": 18
}
}
]
}
]
Tyto dva dotazy dosáhly stejného výsledku, ale první z nich bude vyžadovat více jednotek žádosti, protože potřeboval iterovat větší počáteční datovou sadu před dotazem na sousední položky. Indikátory tohoto chování můžeme vidět při porovnávání následujících parametrů z obou odpovědí:
- Hodnota
metrics[0].timeje v první odpovědi vyšší, což znamená, že vyřešení tohoto jednoho kroku trvalo déle. - Hodnota je také vyšší v první odpovědi, což znamená, že počáteční funkční datová sada
metrics[0].counts.resultsCountbyla větší.
Další kroky
- Seznamte se s podporovanými funkcemi Gremlin v Azure Cosmos DB.
- Další informace o rozhraní Gremlin API v Azure Cosmos DB.