Analizowanie wykonywania zapytań za pomocą funkcji Query Explain

Dotyczy tylko wersji Cloud Firestore Enterprise.

Na tej stronie opisujemy, jak pobierać informacje o wykonywaniu zapytania.

Korzystanie z funkcji Wyjaśnij zapytanie

Za pomocą funkcji Wyjaśnienie zapytania możesz sprawdzić, jak są wykonywane Twoje zapytania. Zawiera ona szczegółowe informacje, które możesz wykorzystać do optymalizacji zapytań.

Funkcji Query Explain możesz używać w konsoli Google Cloud lub za pomocą polecenia explain.

Konsola

Uruchom zapytanie w edytorze zapytań i otwórz kartę Wyjaśnienie:

  1. W konsoli Google Cloud otwórz stronę Bazy danych.

    Otwórz Bazy danych

  2. Z listy baz danych wybierz bazę danych Cloud Firestore w trybie zgodności z MongoDB. W konsoli Google Cloud otworzy się Eksplorator Firestore dla tej bazy danych.
  3. Wpisz zapytanie w edytorze zapytań i kliknij Uruchom.
  4. Kliknij kartę Wyjaśnienie, aby wyświetlić dane wyjściowe analizy zapytania.

    Karta Wyjaśnienie zapytania w konsoli
MongoDB API

Zapytanie Explain w interfejsie MongoDB API jest obsługiwane przez polecenie explain, którego możesz używać w narzędziach takich jak Mongo Shell i Compass.

Polecenie explain jest obsługiwane w przypadku poleceń aggregate,find, distinctcount, na przykład:

db.collection.explain.find(...)

Możesz też użyć metody explain(), na przykład:

db.collection.find({QUERY}).explain()
Ograniczenia
Pamiętaj o tych ograniczeniach i różnicach:
  • Funkcja Wyjaśnij zapytanie nie obsługuje poleceń, które zwracają kursor. Na przykład wywoływanie wyjaśnienia przez bezpośrednie wywołanie tego polecenia nie jest obsługiwane:

    db.collection.aggregate(..., explain: true)
  • Funkcja wyjaśniania zapytań jest obsługiwana tylko w przypadku poleceń find, aggregate, countdistinct.

  • Opcje VerbosityComment funkcji Query Explain nie są obsługiwane przez interfejs MongoDB API. Działanie jest zgodne z opcją executionStats. Opcje allPlansExecutionqueryPlanner są ignorowane, jeśli zostaną podane.

Analiza

Dane wyjściowe polecenia Query Explain zawierają 2 główne komponenty: statystyki podsumowujące i drzewo wykonania. Weźmy na przykład to zapytanie:

db.order.aggregate(
 [
   { "$match": { "user_id": 1234 } },
   { "$sort": { "date_placed": 1 } }
 ]
)

Statystyki podsumowujące

U góry wyjaśnionych danych wyjściowych znajduje się podsumowanie statystyk wykonania. Korzystaj z tych statystyk, aby określić, czy zapytanie ma duże opóźnienie lub wysoki koszt. Zawiera też statystyki pamięci, które informują, jak blisko zapytanie jest limitów pamięci.

Billing Metrics:
read units: 1

Execution Metrics:
request peak memory usage: 4.00 KiB (4,096 B)
results returned: 1

Drzewo wykonania

Drzewo wykonania opisuje wykonanie zapytania jako serię węzłów. Węzły dolne (węzły liści) pobierają dane z warstwy pamięci, które są przekazywane w górę drzewa, aby wygenerować odpowiedź na zapytanie.

Szczegółowe informacje o poszczególnych węzłach wykonawczych znajdziesz w informacjach o wykonaniu.

Szczegółowe informacje o tym, jak używać tych informacji do optymalizacji zapytań, znajdziesz w artykule Optymalizowanie wykonywania zapytań.

Oto przykład drzewa wykonania:

• Compute
|  $out_1: map_set($record_1, "__id__", $__id___1, "__key__", $__key___1, "__row_id__", $__row_id___1, "__$0__", $__$0___2)
|  is query result: true
|
|  Execution:
|   records returned: 1
|
└── • Compute
    |  $__$0___2: UNSET
    |
    |  Execution:
    |   records returned: 1
    |
    └── • Compute
        |  $__key___1: UNSET
        |  $__row_id___1: UNSET
        |
        |  Execution:
        |   records returned: 1
        |
        └── • Compute
            |  $__id___1: _id($record_1.__key__)
            |
            |  Execution:
            |   records returned: 1
            |
            └── • MajorSort
                |  fields: [$v_5 ASC]
                |  output: [$record_1]
                |
                |  Execution:
                |   records returned: 1
                |   peak memory usage: 4.00 KiB (4,096 B)
                |
                └── • Compute
                    |  $v_5: array_get($v_4, 0L)
                    |
                    |  Execution:
                    |   records returned: 1
                    |
                    └── • Compute
                        |  $v_4: sortPaths(array($record_1.date_placed), [date_placed ASC])
                        |
                        |  Execution:
                        |   records returned: 1
                        |
                        └── • Filter
                            |  expression: $eq($user_id_1, 1,234)
                            |
                            |  Execution:
                            |   records returned: 1
                            |
                            └── • TableScan
                                   source: **/my_collection
                                   order: STABLE
                                   properties: * - { __create_time__, __update_time__ }
                                   output record: $record_1
                                   output bindings: {$user_id_1=user_id}
                                   variables: [$record_1, $user_id_1]

                                   Execution:
                                    records returned: 1
                                    records scanned: 1

Co dalej?