查詢 Azure Cosmos DB 容器

適用於:NoSQL

本文說明如何查詢 Azure Cosmos DB 中的容器 (集合、圖表或資料表) 的輸送量。 尤其,其涵蓋了分割區內和跨分割區查詢在 Azure Cosmos DB 中的運作方式。

分割區內查詢

當您查詢容器中的資料時,如果查詢已指定分割區索引鍵篩選條件,則 Azure Cosmos DB 會自動最佳化查詢。 其會將查詢路由傳送到與篩選條件中指定的分割區索引鍵值對應的實體分割區

例如,請考慮對 DeviceId 具有等式篩選條件的下列查詢。 如果我們在 DeviceId 上分割的容器上執行此查詢,查詢會篩選至單一實體分割區。

SELECT * FROM c WHERE c.DeviceId = 'XMS-0001'

如同先前的範例,此查詢也會篩選至單一分割區。 在 Location 上新增篩選條件不會變更下列查詢:

SELECT * FROM c WHERE c.DeviceId = 'XMS-0001' AND c.Location = 'Seattle'

以下是在分割區索引鍵上具有範圍篩選條件,且範圍不會限定為單一實體分割區的查詢。 若要成為分割區內查詢,查詢必須具有等式篩選條件,其中包含分割區索引鍵:

SELECT * FROM c WHERE c.DeviceId > 'XMS-0001'

跨分割區查詢

下列查詢對分割區索引鍵 (DeviceId) 沒有篩選條件。 因此,針對要執行其各分割區索引鍵的實體分割區,查詢必須進行展開傳送:

SELECT * FROM c WHERE c.Location = 'Seattle`

每個實體分割區都有自己的索引。 因此,當您在容器上執行跨分割區查詢時,「每個」實體分割區都能有效地執行一個查詢。 Azure Cosmos DB 會自動跨實體分割區彙總結果。

不同實體分割區中的索引彼此獨立。 Azure Cosmos DB 中沒有全域索引。

跨分割區的平行查詢

Azure Cosmos DB SDK 1.9.0 和更新版本支援平行查詢執行選項。 跨分割區的平行查詢可讓您執行低延遲的跨分割區查詢。

若要管理平行執行查詢,您可以調整下列參數︰

  • MaxConcurrency:設定同時連往容器分割區的網路連線數上限。 如果您將此屬性設定為 -1,則 SDK 會管理平行處理的程度。 如果將 MaxConcurrency 設定為 0,則會有與容器分割區的單一網路連線。

  • MaxBufferedItemCount:權衡取捨查詢延遲性和用戶端記憶體使用量。 如果省略此選項或將其設定為 -1,則 SDK 會管理在平行查詢執行期間緩衝處理的項目數。

由於 Azure Cosmos DB 能夠平行處理跨分割區查詢,因此查詢延遲通常會隨著系統新增實體分割區 (機器翻譯) 而調整。 不過,當實體分割區總數增加時,RU 費用會大幅增加。

當執行跨分割區查詢時,您基本上是在個別的實體分割區分別執行查詢。 雖然跨分割區查詢會使用索引 (如果可用的話),但效率仍比不上資料分割區內查詢。

實用範例

以下比喻能協助您更清楚了解跨分割區查詢:

假設您是一名送貨司機,必須將包裹交付到不同的公寓大樓。 每棟公寓大樓都有一份清單,列出所有住戶的單位編號。 我們可以將每棟公寓大樓與實體分割區,以及將每個清單與實體分割區索引進行比較。

我們可以使用此範例來比較分割區內查詢與跨分割區查詢:

分割區內查詢 (範例)

如果送貨司機知道正確的公寓大樓 (實體分割區),則他們可以立即開車到正確的建築物。 司機只要查看公寓大樓的住戶單元號碼清單,就能快速交付正確包裹。 在此情況下,司機開車到公寓大樓時,不需浪費任何時間或精力確認包裹收件者是否住在那裡。

跨分割區查詢 (展開傳送)

如果送貨司機不知道正確的公寓大樓 (實體分割區),就必須開車到每一棟公寓大樓,才能查看列有所有住戶單元編號 (索引) 的清單。 一旦抵達各棟公寓大樓,他們仍然可以使用每個住戶的地址清單, 但他們必須查看每棟公寓大樓的清單,無論包裹收件者是否住在那裡。 這個範例正說明了跨分割區查詢的運作方式。 雖然司機可以使用索引 (而不需要敲每家大門),但他們必須分別查看每個實體分割區的索引。

跨分割區查詢 (範圍僅限於一些實體分割區)

如果送貨司機知道所有包裹收件者都住在特定的幾棟公寓大樓內,就不需要開車到每一棟公寓大樓。 雖然開車到幾棟公寓大樓的工作量,仍比前往單一建築物更多,但送貨司機還是可以節省大量時間和精力。 如果查詢的篩選條件中具有關鍵字為 IN 的分割區索引鍵,便只會在相關的實體分割區索引中尋找資料。

避免進行跨分割區查詢

大部分容器難免都需要進行一些跨分割區查詢,這完全沒有問題! 幾乎所有分割區都支援查詢作業,包括邏輯分割區索引鍵和實體分割區。 在查詢引擎和用戶端 SDK 中,Azure Cosmos DB 也有許多最佳化,可跨實體分割區平行處理查詢執行。

對於大多數大量讀取案例,建議您在查詢篩選條件中選取最常見的屬性。 您也應該確定分割區索引鍵符合其他分割區索引鍵選取最佳做法

避免跨分割區查詢通常只對大型容器很重要。 每次您查看實體分割區的索引是否有結果時,即使實體分割區中沒有任何項目符合查詢的篩選條件,您仍須支付大約最低 2.5 RU 的費用。 因此,如果您只有一個 (或幾個) 實體分割區,跨分割區查詢不會取用比分割區內查詢多出許多的 RU。

實體分割區的數目與佈建的 RU 數量相關。 每個實體分割區最多允許 10000 個佈建的 RU,且最多可儲存 50 GB 的資料。 Azure Cosmos DB 會自動為您管理實體分割區。 您容器中的實體分割區數目取決於您佈建的輸送量和已取用的儲存體。

如果您的工作負載符合下列條件,您應該嘗試避免進行跨分割區查詢:

  • 您打算佈建超過 30000 個 RU
  • 您打算儲存超過 100 GB 的資料

下一步

請參閱下列文章,以了解 Azure Cosmos DB 中的資料分割: