Поиск платы за единицу запроса для операций в Azure Cosmos DB для NoSQL

ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL

Azure Cosmos DB поддерживает многие интерфейсы API, такие как SQL, MongoDB, Cassandra, Gremlin и Таблицы. У каждого API есть собственный набор операций базы данных, начиная от простого считывания и записи точек и заканчивая сложными запросами. Каждая операция базы данных потребляет системные ресурсы. Потребление зависит от сложности операции.

Стоимость всех операций базы данных нормализуется с помощью Azure Cosmos DB и выражается в единицах запроса (ЕЗ). Расходы на запросы выражаются в единицах запроса, потребленных всеми операциями базы данных. ЕЗ можно считать единицей производительности, которая абстрагирует системные ресурсы (например, ЦП, операции ввода-вывода в секунду и память), необходимые для выполнения операций базы данных, поддерживаемых Azure Cosmos DB. Независимо от того, какой API вы используете для взаимодействия с контейнером, затраты всегда измеряются в ЕЗ. Независимо от типа операции базы данных (запись, чтение или запрос), затраты всегда измеряются в ЕЗ. Дополнительные сведения приведены в статье Единицы запроса в Azure Cosmos DB.

В этой статье представлены различные способы поиска потребления единиц запроса для любой операции, выполняемой в контейнере в Azure Cosmos DB для NoSQL. Если вы используете другой API, ознакомьтесь с API для MongoDB, API для Cassandra, API для Gremlin и API для таблицы.

В настоящее время потребление можно оценить только с помощью портала Azure или сведений из ответа, который Azure Cosmos DB направляет через один из пакетов SDK. Если вы используете API для NoSQL, у вас есть несколько вариантов поиска платы за запрос для операции.

Использование портала Azure

  1. Войдите на портал Azure.

  2. Создайте новую учетную запись Azure Cosmos DB и введите ее с данными или выберите существующую учетную запись Azure Cosmos DB, которая уже содержит данные.

  3. Перейдите на панель обозревателя данных и выберите контейнер, с которым собираетесь работать.

  4. Выберите New SQL Query (Создать SQL-запрос).

  5. Введите допустимый запрос и щелкните Выполнить запрос.

  6. Выберите Статистика запросов, чтобы отобразилось количество ЕЗ, фактически затраченных на выполненный запрос.

    Screenshot of a SQL query request charge in the Azure portal.

Использование пакета SDK для .NET

Объекты, возвращаемые из пакета SDK для .NET версии 2 предоставляют свойство RequestCharge.

ResourceResponse<Document> fetchDocumentResponse = await client.ReadDocumentAsync(
    UriFactory.CreateDocumentUri("database", "container", "itemId"),
    new RequestOptions
    {
        PartitionKey = new PartitionKey("partitionKey")
    });
var requestCharge = fetchDocumentResponse.RequestCharge;

StoredProcedureResponse<string> storedProcedureCallResponse = await client.ExecuteStoredProcedureAsync<string>(
    UriFactory.CreateStoredProcedureUri("database", "container", "storedProcedureId"),
    new RequestOptions
    {
        PartitionKey = new PartitionKey("partitionKey")
    });
requestCharge = storedProcedureCallResponse.RequestCharge;

IDocumentQuery<dynamic> query = client.CreateDocumentQuery(
    UriFactory.CreateDocumentCollectionUri("database", "container"),
    "SELECT * FROM c",
    new FeedOptions
    {
        PartitionKey = new PartitionKey("partitionKey")
    }).AsDocumentQuery();
while (query.HasMoreResults)
{
    FeedResponse<dynamic> queryResponse = await query.ExecuteNextAsync<dynamic>();
    requestCharge = queryResponse.RequestCharge;
}

Использование пакета SDK для Java

Объекты, возвращаемые из пакета SDK для Java предоставляют метод getRequestCharge().

RequestOptions requestOptions = new RequestOptions();
requestOptions.setPartitionKey(new PartitionKey("partitionKey"));

Observable<ResourceResponse<Document>> readDocumentResponse = client.readDocument(String.format("/dbs/%s/colls/%s/docs/%s", "database", "container", "itemId"), requestOptions);
readDocumentResponse.subscribe(result -> {
    double requestCharge = result.getRequestCharge();
});

Observable<StoredProcedureResponse> storedProcedureResponse = client.executeStoredProcedure(String.format("/dbs/%s/colls/%s/sprocs/%s", "database", "container", "storedProcedureId"), requestOptions, null);
storedProcedureResponse.subscribe(result -> {
    double requestCharge = result.getRequestCharge();
});

FeedOptions feedOptions = new FeedOptions();
feedOptions.setPartitionKey(new PartitionKey("partitionKey"));

Observable<FeedResponse<Document>> feedResponse = client
    .queryDocuments(String.format("/dbs/%s/colls/%s", "database", "container"), "SELECT * FROM c", feedOptions);
feedResponse.forEach(result -> {
    double requestCharge = result.getRequestCharge();
});

Дополнительные сведения см . в кратком руководстве по созданию приложения Java с помощью учетной записи Azure Cosmos DB для NoSQL.

Использование пакета SDK для Node.js

Объекты, возвращаемые из пакета SDK для Node.js предоставляют вложенный объект headers, который позволяет сопоставить все заголовки, возвращаемые базовым интерфейсом API для HTTP. Сведения о расходах в ЕЗ доступны в ключе x-ms-request-charge.

const item = await client
    .database('database')
    .container('container')
    .item('itemId', 'partitionKey')
    .read();
var requestCharge = item.headers['x-ms-request-charge'];

const storedProcedureResult = await client
    .database('database')
    .container('container')
    .storedProcedure('storedProcedureId')
    .execute({
        partitionKey: 'partitionKey'
    });
requestCharge = storedProcedureResult.headers['x-ms-request-charge'];

const query = client.database('database')
    .container('container')
    .items
    .query('SELECT * FROM c', {
        partitionKey: 'partitionKey'
    });
while (query.hasMoreResults()) {
    var result = await query.executeNext();
    requestCharge = result.headers['x-ms-request-charge'];
}

Дополнительные сведения см . в кратком руководстве. Создание приложения Node.js с помощью учетной записи Azure Cosmos DB для NoSQL.

Использование Python SDK

Объект Container, возвращаемый из пакета SDK для Python предоставляет словарь last_response_headers, который позволяет сопоставить все заголовки для последней выполненной операции, возвращаемые базовым API HTTP. Сведения о расходах в ЕЗ доступны в ключе x-ms-request-charge.

new_item = {
    "id": "70b63682-b93a-4c77-aad2-65501347265f",
    "partition_key": "61dba35b-4f02-45c5-b648-c6badc0cbd79",
    "name": "Yamba Surfboard"
}
container.create_item(new_item)

request_charge = container.client_connection.last_response_headers["x-ms-request-charge"]
existing_item = container.read_item(
    item="70b63682-b93a-4c77-aad2-65501347265f"
    partition_key="61dba35b-4f02-45c5-b648-c6badc0cbd79"
)

request_charge = container.client_connection.last_response_headers["x-ms-request-charge"]

Дополнительные сведения см . в кратком руководстве по созданию приложения Python с помощью учетной записи Azure Cosmos DB для NoSQL.

Следующие шаги

Сведения об оптимизации потребления ЕЗ см. в следующих статьях: