2011-01-28 82 views
5

每個人都會警告不要在Azure表存儲(ATS)中針對除RowKey或PartitionKey之外的任何其他查詢進行查詢,以免強制進行表掃描。有一段時間,這讓我陷入了癱瘓,我試圖提出正確的PK和RK,並在需要查詢其他表時創建其他表中的僞二級索引。Azure Table Storage - 我可以多快地掃描表格?

但是,我發現我會在SQL Server中進行普遍的表掃描,當我認爲合適的時候。

所以問題就來了,我可以多快地掃描一個Azure表。這是一個在實體/秒不變的常量,還是取決於記錄大小等等。如果您需要響應式應用程序,是否有一些經驗法則來確定有多少記錄太多而無法進行表掃描?

回答

7

表掃描的問題與跨越分區邊界有關。您保證的性能級別是在分區級別設置的。因此,當您運行全表掃描時,其a)效率不高,b)對性能沒有任何保證。這是因爲分區本身設置在單獨的存儲節點上,當您運行跨分區掃描時,您正在消耗潛在的大量資源(同時綁定多個節點)。

我相信跨越這些邊界的效果也會產生連續令牌,這需要額外的往返存儲來檢索結果。結果導致業績下降,交易量增加(以及後續成本)。

如果您穿越的分區/節點數量相當小,您可能不會注意到任何問題。

但請不要在此引用我。我不是Azure存儲專家。它實際上是我最不瞭解的Azure區域。 :P

+0

你說過「你保證的性能級別是在分區級設置的明確性。」這個集合/我在哪裏可以找到關於這個的信息? – 2011-01-28 21:02:53

0

我認爲布倫特是100%的錢,但如果你仍然覺得你想嘗試它,我只能建議運行一些測試來找出你自己。嘗試在查詢中包含partitionKey,以防止交叉分區,因爲在一天結束時就是性能殺手。

0

Azure表格未針對表格掃描進行優化。掃描表格對於長時間運行的後臺作業可能是可以接受的,但是當需要快速響應時我不會這樣做。對於任何合理大小的表,當查詢到達分區邊界或獲得1k結果時,您將不得不處理連續令牌。

Azure存儲團隊有great post which explains the scalability targets。單個表分區的吞吐量目標是500個實體/秒。存儲帳戶的總體目標是每秒5000次交易。

0

答案是分頁。結合next_partition_keynext_row_key連續令牌,使用top_size - 結果中的最大數量或結果記錄。這在性能上甚至產生了顯着的因果差異。首先,你的結果在統計上更可能來自單個分區。普通的結果顯示集合按分區連續鍵而不是行連續鍵分組。

換句話說,您還需要考慮您的UI或系統輸出。不要打擾返回超過10到20個結果最多50.用戶可能不會再使用或檢查。

聽起來很愚蠢。做一個谷歌搜索「狗」,並注意到搜索只返回10個項目。不再。如果你打擾'繼續'下一個記錄是有用的。研究已經證明,幾乎沒有用戶冒險超出第一頁。

select(返回鍵值的一個子集)可能會有所作爲;例如,使用select = "PartitionKey,RowKey"'Name'無論您需要什麼最低限度。

「我相信,跨越這些邊界的效應也導致了 在延續令牌,這需要額外的往返到 存儲檢索結果。這就導致減少 性能,以及一個交易次數增加(並且後續成本爲 )。「

...稍微不正確。連續令牌的使用不是因爲跨越邊界,而是因爲天藍色的表格允許不超過1000個結果;因此這兩個連續令牌用於下一組。默認top_size基本上是1000.

爲了您的欣賞愉悅,以下是來自azure python api的查詢實體的描述。其他人也大致相同。

''' 
    Get entities in a table; includes the $filter and $select options. 

    table_name: Table to query. 
    filter: 
    Optional. Filter as described at 
    http://msdn.microsoft.com/en-us/library/windowsazure/dd894031.aspx 
    select: Optional. Property names to select from the entities. 
    top: Optional. Maximum number of entities to return. 
    next_partition_key: 
    Optional. When top is used, the next partition key is stored in 
    result.x_ms_continuation['NextPartitionKey'] 
    next_row_key: 
    Optional. When top is used, the next partition key is stored in 
    result.x_ms_continuation['NextRowKey'] 
    '''