我插入/ upserting具有以下結構的文檔加載到DocumentDB:Azure DocumentDB - 可以通過自定義索引改進插入請求費用嗎?
爲upserting這種格式的一個文件的請求電荷是10.67個RU使用默認索引時。這似乎比我預期的要高,所以我期望優化。
這篇文章中讀取性能提示後:
https://azure.microsoft.com/en-us/blog/performance-tips-for-azure-documentdb-part-2/
我改變了收集索引策略的索引模式懶惰。我預計請求費用要少得多,但它只下降到9.9 RU。
然後,我再次修改了索引策略,將一堆屬性添加到排除的路徑中。這裏是自定義索引策略:
添加排除的路徑有一個UPSERT上的資源單元沒有影響 - 它保持在9.9。
我做錯了什麼?是否有可能爲這個文檔結構構建插件消耗更少的RU?
編輯:
這裏是一個輔助類我使用的設置和緩存的連接DocumentDB:
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;
}
}
這裏是在我的Web API類認沽處理程序的代碼:
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();
}
}
請問您可以添加您的c#代碼,因爲很難知道給定您當前發佈的內容。一般來說,我發現緩存集合_selfLink_給了我一個顯着的性能提升。 – 2016-04-03 04:50:34
@IngeHenriksen使用基於id的路由(這只是一個字符串),不再需要自連接(或者數據庫的相關查詢來獲取諸如集合自連接的這樣的id)。這與查詢的RU成本無關。 –
@IngeHenriksen - 我添加了您請求的代碼。 –