Почему я вижу различное поведение индекса между 2 внешне идентичными коллекциями CosmosDb - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь отладить очень странную несоответствие между двумя отдельными коллекциями космических БД, которые по номинальной стоимости настроены одинаково.

Недавно мы изменили некоторый код, который выполнил следующий запрос.

OLD QUERY

SELECT * FROM c 
WHERE c.ProductId = "CODE" 
AND c.PartitionKey = "Manufacturer-GUID"

NEW QUERY

SELECT * FROM c
WHERE (c.ProductId = "CODE" OR ARRAY_CONTAINS(c.ProductIdentifiers, "CODE")) 
AND c.PartitionKey = "Manufacturer-GUID"

Введение этого вызова Array_Contains в производственной среде снизило производительность этого запроса с ~ 3 RU / s ==> ~ 6000 РУ / с.Но только в производственной среде.

И причина, по-видимому, в том, что в Производстве индекс не попадает в индекс.См. Выходные данные ниже для двух сред.

КОНФИГУРАЦИЯ DEV

Масштаб сбора: 2000 RU / s

Политика индекса: (Обратите внимание на путь исключения дляETags)

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*",
            "indexes": [
                {
                    "kind": "Range",
                    "dataType": "Number",
                    "precision": -1
                },
                {
                    "kind": "Range",
                    "dataType": "String",
                    "precision": -1
                },
                {
                    "kind": "Spatial",
                    "dataType": "Point"
                }
            ]
        }
    ],
    "excludedPaths": [
        {
            "path": "/\"_etag\"/?"
        }
    ]
}

КОНФИГУРАЦИЯ PROD

Масштаб сбора: 10 000 RU / s

Политика индекса: (Обратите внимание на отсутствие пути исключения дляETags по сравнению с DEV)

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*",
            "indexes": [
                {
                    "kind": "Range",
                    "dataType": "Number",
                    "precision": -1
                },
                {
                    "kind": "Range",
                    "dataType": "String",
                    "precision": -1
                },
                {
                    "kind": "Spatial",
                    "dataType": "Point"
                }
            ]
        }
    ],
    "excludedPaths": []
}

При сравнении результатов вывода в обеих средах DEV демонстрирует попадание в индекс, а PROD - отсутствие индекса, несмотря на отсутствие заметного различия между политиками индекса.

Результаты в DEV

Request Charge:           3.490 RUs
Showing Results:          1 - 1
Retrieved document count: 1
Retrieved document size:  3118 bytes
Output document count:    1
Output document size:     3167 bytes
Index hit document count: 1

Результаты в PROD

Request Charge:           6544.870 RUs
Showing Results:          1 - 1
Retrieved document count: 124199
Retrieved document size:  226072871 bytes
Output document count:    1
Output document size:     3167 bytes
Index hit document count: 0

Единственное, что мне удалось найти в Интернетев документах содержится ссылка на некоторые изменения, произошедшие в Cosmos Collection, в которых говорится, что «новый макет индекса» используется для более новых коллекций, но нет другого упоминания о макетах индекса как о концепции, которую я могу найти где-либо в документации.

https://docs.microsoft.com/en-us/azure/cosmos-db/index-types#index-kind

Кто-нибудь знает, куда я могу пойти с точки зрения отладки / решения этой проблемы.

1 Ответ

0 голосов
/ 28 февраля 2019

Ваш контейнер Dev является более новым и использует наш индекс v2, который имеет значительные улучшения, в том числе и для Array_Contains ().Чтобы узнать больше о том, как обновить контейнер PROD, напишите нам по адресу askcosmosdb на microsoft dot com.

Спасибо.

...