Высокая плата за очень простой запрос в 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.

Другие вопросы по тегам