Высокая плата за очень простой запрос в Azure Cosmos DB (SQL API)
В Azure Cosmos DB (SQL API) следующий запрос требует 9356,66 RU:
SELECT * FROM Core c WHERE c.id = @id -- @id is a GUID
В отличие от следующих более сложных запросов взимается только 6,84 RU:
SELECT TOP 10 * FROM Core c WHERE c.type = "Agent"
Документы в обоих примерах довольно маленькие и имеют несколько атрибутов. Также собрание документов не использует какую-либо пользовательскую политику индексации. Сборник содержит 105685 документов.
Для меня это звучит так, как будто на месте поля "id" нет работающего индекса.
Как это возможно и как это можно исправить?
Обновления:
- Без ключевого слова TOP второй запрос требует 3516,35 RU и возвращает 100000 записей.
- Ключ раздела - "/partition", а его значения - 0 или 1 (равномерно распределены).
2 ответа
Если у вас есть коллекция разделов, вам нужно указать ключ раздела, если вы хотите сделать запрос наиболее эффективно. Перекрестные запросы действительно дороги (и медленнее) в космосе, потому что данные секций могут храниться в разных местах.
Попробуйте следующее:
SELECT * FROM Core c WHERE c.id = @id AND c.partition = @partition
Или укажите ключ раздела в параметрах канала, если вы используете CosmosDB SDK.
Позвольте мне знать, если это помогает.
Я предполагаю, что решение такое же, как и здесь: Azure DocumentDB Query by Id очень медленный
Я закрою свой собственный вопрос, как только смогу это проверить с помощью службы поддержки Microsoft.