Моя цель
Я хотел бы подсчитать количество различных значений FileName
для документов Azure Cosmos DB, подобных приведенным ниже, в одном разделе, используя SQL API.
{
"id": "some uuid",
"FileName": "file-1.txt",
"PartitionKeyField": "some key",
... other fields ...
}
Мой тест
Я загрузил 533 956 документов с 500 000 различными значениями FileName
, т.е. 33 956 документов имеют дубликаты FileName
(другие поля отличаются). Все они загружены одним и тем же PartitionKeyField
.
(Я могу воспроизвести приведенное ниже поведение только для 100 000 документов).
Я хотел бы посчитать количество различных FileName
значений - так что надеюсь получить обратно 500 000.
Попытка 0 - проверка работоспособности
Если я выполню следующий запрос:
SELECT DISTINCT c.FileName
FROM c
WHERE c.PartitionKeyField = 'some key'
Это вернет 500 000 документов, как и ожидалось.
Попытка 1
Однако мне не нужны все документы, мне просто нужен счетчик, поэтому я пытаюсь выполнить следующий запрос
SELECT VALUE COUNT(1)
FROM (
SELECT DISTINCT c.FileName
FROM c
WHERE c.PartitionKeyField = 'some key'
) c2
Но это дает 533 956 - то есть как будто DISTINCT
не применялось.
Попытка 2
Затем я попробовал следующее, избыточное GROUP BY
, чтобы заставить счетчик работать:
SELECT c2.PartitionKeyField, COUNT(1)
FROM (
SELECT DISTINCT c.FileName
FROM c
WHERE c.PartitionKeyField = 'some key'
) c2
GROUP BY c2.PartitionKeyField
Результат, возвращаемый этим, зависит от того, сколько RU выделено коллекции, например
- Возвращает 500 007 при 9900 RU
- Возвращает 500 175 при 5000 RU
- Возвращает 500 441 при 3000 RU
- Возвращает 500 812 при 1000 RU
- Возвращает 501 406 при 400 RU
Кроме того, приведенные выше значения являются средними, например для 9900 РУ также были возвращены результаты 500 009 и 500 006.
Вопросы
- Можно ли записать требуемый счетный запрос детерминированным способом, не зависящим от количества RU? (кроме получения всех документов, как в Попытка 0?)
- Почему увеличение количества RU меняет результат запроса в Попытке 2?