Azure DocumentDB - 可以通过自定义索引改进插入请求费用吗?

Azure DocumentDB - Can Request Charge for Insert be Improved with Custom Indexing?

我是inserting/upserting一个文档,在DocumentDB中有如下结构:

使用默认索引时,更新此格式文档的请求费用为 10.67 RU。这似乎比我预期的要高,所以我正在寻求优化。

阅读本文中的性能提示后:

https://azure.microsoft.com/en-us/blog/performance-tips-for-azure-documentdb-part-2/

我将集合索引策略的索引模式更改为惰性。我预计请求费用会少很多,但只下降到 9.9 RU。

然后我再次修改索引策略以将一堆属性添加到排除路径。这是自定义索引策略:

添加排除路径对更新插入的 RU 没有影响 - 它保持在 9.9。

我是不是做错了什么?是否可以使此文档结构的更新插入消耗更少的 RU?

编辑:

这是我用来设置和缓存与 DocumentDB 的连接的助手 class:

public class Documents
{
    public static Documents Instance = new Documents();

    public IReliableReadWriteDocumentClient Client { get; private set; }

    private Documents()
    {
        var endpointUrl = ConfigurationManager.AppSettings["Microsoft.Azure.DocumentDb.EndpointUrl"];
        var authKey = ConfigurationManager.AppSettings["Microsoft.Azure.DocumentDb.AuthorizationKey"];
        var min = TimeSpan.FromMilliseconds(1000);
        var max = TimeSpan.FromMilliseconds(5000);
        var delta = TimeSpan.FromMilliseconds(1000);
        var connectionPolicy = new ConnectionPolicy()
        {
            ConnectionMode = ConnectionMode.Direct,
            ConnectionProtocol = Protocol.Tcp
        };
        var client = new DocumentClient(new Uri(endpointUrl), authKey, connectionPolicy).AsReliable(new ExponentialBackoff(3, min, max, delta));
        Task result = client.OpenAsync();
        result.Wait();
        Client = client;
    }
}

这是我网站中 Put 处理程序的代码 API class:

public class InstallationController : ApiController
{
    private IReliableReadWriteDocumentClient docdb;
    private string docdbUri;

    public InstallationController()
    {
        docdb = Documents.Instance.Client;
        var databaseId = ConfigurationManager.AppSettings["Microsoft.Azure.DocumentDb.DatabaseId"];
        var collectionName = ConfigurationManager.AppSettings["Microsoft.Azure.DocumentDb.CollectionName"];
        docdbUri = "dbs/" + databaseId + "/colls/" + collectionName;
    }

    // PUT api/installation/<installationId>
    // This creates or updates an installation
    public async Task<IHttpActionResult> Put(string id, DeviceInstallation deviceUpdate)
    {
        string message;
        var telemetryClient = new TelemetryClient();

        if (id != deviceUpdate.Id)
        {
            return BadRequest();
        }

        // Code to check for existing record with same APNS Token omitted for clarity

        var upsertResponse = await docdb.UpsertDocumentAsync(docdbUri, deviceUpdate);
        requestCharge = upsertResponse.RequestCharge;
        message = string.Format("Request charge for installation upsert: {0}", requestCharge);
        telemetryClient.TrackTrace(message);

        // Code to save installation to notification hub omitted for clarity

        return Ok();
    }
}

由于 IO 和复制的成本,在没有任何索引的情况下替换 1kB 以下的文档会消耗约 10 个 RU。索引属性在 DocumentDB 中是轻量级的(每个 property/term 仅占 RU 的一小部分),因此在这种情况下从 Consistent 转移到 Lazy 不会产生很大差异。如果您有一个包含数千个属性的文档,那将会有所不同。

希望对您有所帮助。