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 不会产生很大差异。如果您有一个包含数千个属性的文档,那将会有所不同。
希望对您有所帮助。
我是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 不会产生很大差异。如果您有一个包含数千个属性的文档,那将会有所不同。
希望对您有所帮助。