Как написать SQL-API Azure Cosmos DB для подсчета отдельных запросов без недетерминированных результатов

Моя цель

Я хотел бы подсчитать количество различных значений 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?

person user1857450    schedule 10.11.2020    source источник


Ответы (1)


Пожалуйста, попробуйте этот SQL:

SELECT VALUE COUNT(c2)
FROM (
    SELECT DISTINCT c.FileName 
    FROM c 
    WHERE c.PartitionKeyField = 'some key'
) c2
person Steve Zhao    schedule 11.11.2020
comment
Спасибо за предложение. К сожалению, это по-прежнему дает неверный результат, например. 500523 - person user1857450; 11.11.2020
comment
Как насчет этого SQL? SELECT VALUE COUNT(c2) FROM ( SELECT c.FileName FROM c WHERE c.PartitionKeyField = 'some key' GROUP BY c.FileName ) c2 - person Steve Zhao; 12.11.2020
comment
Я нашел блог об этом . Это ошибка. - person Steve Zhao; 12.11.2020
comment
Это не ошибка, хотя я не могу найти ответа на этот же вопрос. Согласно информации, представленной здесь: docs.microsoft.com / en-us / azure / cosmos-db / sql-query-keywords, вы обнаружите, что запросы с агрегированной системной функцией и подзапрос с DISTINCT не поддерживаются. Например, следующий запрос не поддерживается: SQL Копировать SELECT COUNT (1) FROM (SELECT DISTINCT f.lastName FROM f) В документации не говорится, как получить счетчик различных. - person DDRider62; 04.07.2021