2016-04-02 12 views
1

/DocumentDB aşağıdaki yapıya sahip bir belge upserting: Varsayılan dizini kullanılırkenAzure DocumentDB - Ek Dizin Oluşturma ile Ekleme İçin Ücretlendirme Talebi Geliştirilebilir mi? Ben ekleme am

enter image description here

bu biçimin bir belge upserting talebi ücret 10.67 RU'de olduğunu. Bu beklediğimden daha yüksek görünüyor, bu yüzden optimize etmeye çalışıyorum.

bu makalede performans ipuçları okuduktan sonra:

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

Ben Lazy için Toplama İndeksleme Policy dergisinden Dizin Modu değiştirdi. Talep ücretinin önemli ölçüde daha az olmasını bekledim, ancak yalnızca 9.9 RU'ya düştü.

Dışlanmış Yollara bir grup özellik eklemek için İndeksleme Politikasını tekrar değiştirdim. Burada, özel İndeksleme Koşulu: Dışlanan Yollar bir Upsert için RUs üzerinde hiçbir etkiye sahip ekleme

enter image description here

- bu 9.9 kalmıştır.

Yanlış bir şey yapıyorum? Ve bu belge yapısı için daha az RU tükettikleri için zorluk çıkarmak mümkün mü?

Düzenleme: İşte

Ben kurma ve DocumentDB bağlantıyı önbelleğe için kullandığımız bir yardımcı sınıftır: Burada

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; 
    } 
} 

Ve Web API sınıfında koyun işleyicisi kodudur :

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

Geçerli mesajınızın içeriği göz önüne alındığında, lütfen C# kodunuzu ekleyebilir misiniz? Genel olarak, önbellekleme koleksiyonunun _selfLink_'ın bana önemli bir performans artışı verdiğini buldum. –

+0

@IngeHenriksen Artık kimliğe (veya bir dize olan) kimlik doğrulamasıyla (veya bu tür kimliklerin toplama selflink'i gibi alınabilmesi için veritabanıyla ilgili sorgular) artık kendiliğinden bağlantılara gerek yoktur. Ve bunun bir sorgunun RU maliyeti ile ilgisi yoktur. –

+0

@IngeHenriksen - İstediğiniz kodu ekledim. –

cevap

1

1kb altında bir doküman değiştirilmesi ~ 10 RU bağlı IO ve çoğaltma maliyeti herhangi bir indeksleme olmaksızın tüketir. İndeksleme özellikleri DocumentDB'de hafiftir (özellik/dönem başına bir RU'nun yalnızca bir kısmı), bu nedenle Tutarlı'dan Lazy'ye geçiş bu durumda büyük bir fark yaratmayacaktır. Binlerce özellik içeren bir dokümanınız varsa, fark yaratacak.

Bu yardımcı olur umarım.

+0

Cevabınız için teşekkür ederiz. RU ücretlerini iyileştirmek için daha fazla bir şey yapamayacağı anlaşılıyor. –

+0

@Aravind Ramachandran: Şu anda benim belgelemem için RU'larDB 24X100 RU'lar, 3X100 RU'lara düşürmek istiyorum, bu yüzden bunu yapabileceğim seçenek var mı? –