2016-04-02 60 views
1

我插入/ upserting具有以下結構的文檔加載到DocumentDB:Azure DocumentDB - 可以通過自定義索引改進插入請求費用嗎?

enter image description here

爲upserting這種格式的一個文件的請求電荷是10.67個RU使用默認索引時。這似乎比我預期的要高,所以我期望優化。

這篇文章中讀取性能提示後:

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

我改變了收集索引策略的索引模式懶惰。我預計請求費用要少得多,但它只下降到9.9 RU。

然後,我再次修改了索引策略,將一堆屬性添加到排除的路徑中。這裏是自定義索引策略:

enter image description here

添加排除的路徑有一個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(); 
    } 
} 
+0

請問您可以添加您的c#代碼,因爲很難知道給定您當前發佈的內容。一般來說,我發現緩存集合_selfLink_給了我一個顯着的性能提升。 – 2016-04-03 04:50:34

+0

@IngeHenriksen使用基於id的路由(這只是一個字符串),不再需要自連接(或者數據庫的相關查詢來獲取諸如集合自連接的這樣的id)。這與查詢的RU成本無關。 –

+0

@IngeHenriksen - 我添加了您請求的代碼。 –

回答

1

1kB的下更換文件消耗〜10個RU,沒有任何分度由於IO和複製的費用。 DocumentDB中的索引屬性是輕量級的(每個屬性/術語只有一小部分RU),因此從Consistent移動到Lazy不會在這種情況下產生重大影響。如果您擁有一個包含數千個屬性的文檔,它將會有所幫助。

希望這會有所幫助。

+0

感謝您的回答。似乎我無法進一步提高RU費用。 –

+0

@Aravind Ramachandran:目前我的documendDB保留的RU是24X100 RU,我想減少到3X100 RU,所以我可以做到這一點的選擇在哪裏? –

相關問題