2011-05-03 113 views
5

我是Azure的新手!其目的是基於存儲在RowKey中的時間戳返回行。由於存在與每個查詢交易成本,我希望儘量減少交易/查詢的數量,同時保持性能Azure Table Storage - 查詢之間使用的PartitionKey和RowKey選擇

這些建議的分區和行鍵:

  • 分區鍵: TextCache_(帳戶)_(ParentMessageId)
  • 行鍵:(DateOfMessage)_(的MessageId)

傳奇

  • ACCOUNTID - 是一個整數
  • ParentMessageId - 父MESSAGEID如果有一個,空白,如果它是父
  • DateOfMessage - 日期消息的創建 - 格式將是DateTime.Ticks。的ToString(「D19」)
  • 的MessageId - 消息

我想獲得從單個查詢回行,這是任何childrows>或< DateOfMessage_MessageId的唯一ID

這可以通過我提出的PartitionKeys和RowKeys來完成嗎?

即..(在僞代碼)

var results = ctx.PartitionKey.StartsWith(TextCache_AccountId) 
    && ctx.RowKey > (TimeStamp)_MessageId 

其次,如果我有多少賬戶,並只想要回回第10位,可以將它通過一個單一的查詢進行

即..(在僞代碼)

var results = ( 
     ( 
     ctx.PartitionKey.StartsWith(TextCache_(AccountId1)) && 
      && ctx.RowKey > (TimeStamp1)_MessageId1) 
    ) 
     || 
     ( 
     ctx.PartitionKey.StartsWith(TextCache_(AccountId2)) && 
      && ctx.RowKey > (TimeStamp2)_MessageId2) 
    ) ... 
     ) 
     .Take(10) 

回答

5

簡短的回答你的問題是肯定的,但也有一些事情你需要留意。

Azure表存儲沒有直接等效的.StartsWith()。如果您將存儲庫與LINQ配合使用,則可以使用.CompareTo()(>和<不會正確轉換),這意味着如果您運行搜索帳戶1並且要求查詢返回1000個結果,但是那裏對於帳戶1只有600個結果,最後的400個結果將用於帳戶10(下一個帳戶詞彙)。所以你需要對你如何處理你的結果有點聰明。

如果與領先的0填充了帳戶ID,你可以做這樣的事情(僞代碼在這裏也一樣)

ctx.PartionKey > "TextCache_0000000001" 
&& ctx.PartitionKey < "TextCache_0000000002" 
&& ctx.RowKey > "123465798" 

別的東西要記住的是,查詢到Azure的表返回結果中PartitionKey然後RowKey的順序。所以在你的情況下,沒有ParentMessageId的消息將在消息前返回ParentMessageId。如果你永遠不會通過ParentMessageId查詢這個表,我會把它移到一個屬性。

如果TextCache_只是一個字符串常量,它不會被包含在PartitionKey中,除非這些實際上在您的代碼返回時對您的代碼有意義。

雖然你第二個查詢會運行,但我不認爲它會產生你以後的結果。如果你想要DateOfMessage訂單中的前十行,那麼它將不起作用(請參閱我的關於排序順序的點)。如果您按原樣運行此查詢,並且帳戶1有11條消息,則無論帳戶2是否有較早的消息,它都將僅返回與帳戶1相關的前10條消息。

儘量減少您使用的交易次數是一種很好的做法,不要太在意。運行您的員工/網絡角色的成本將會降低您的交易成本。 1,000,000次交易將花費您1美元,這比9小時運行一個小實例的花費少。

+0

謝謝knightpfhor,我更關心的是在表格存儲中打500個轉/秒,這會導致節流。我沒有想到AccountId的填充,這肯定是需要的。將做一些測試 – 2011-05-03 04:03:03

+0

值得注意的是,油門限制是每個分區,而不是全局(儘管全侷限制是幾千trans/sec – knightpfhor 2011-05-03 04:13:18

+0

關於'TextCache_'我補充說,作爲表標識符。如果我有多個實體如何我區分它們嗎? – 2011-05-03 04:16:40