這很重要
Azure Cosmos DB for NoSQL global secondary indexes 目前處於預覽階段。 欲了解更多資訊,請參閱補充條款Microsoft Azure預覽條款。
全域次級索引(GSI)透過儲存與來源容器不同的分割鍵來提升查詢效率。 GSI 是只讀容器,會自動與來源容器同步。 每個 GSI 都有自己的分割鍵、索引策略、吞吐量(RU)限制及資料模型。
使用案例
應用程式通常需要使用除分割鍵以外的屬性來查詢資料。 這些查詢必須在所有分割區間執行,即使有些分割區的資料不符合過濾條件。 因此,不包含分割鍵的查詢會消耗更多 RU,延遲也較高。
有了全球次級指數,你可以:
- 將資料儲存為不同的分割鍵,將來源容器上的跨區查詢轉換為單一分割查詢。
- 在現有容器中加入 GSI,以保持查詢效率,以配合應用程式需求變化。
- 隔離工作負載的子集,例如在 GSI 中建立向量或全文搜尋索引,且不影響來源容器的交易操作。
全球次級指數的好處
Azure Cosmos DB 全球次級索引提供以下好處:
- 自動同步:索引容器會自動與來源容器同步,無需客戶端應用程式中自訂邏輯。
- 最終一致性:索引容器最終會與來源容器保持一致,且不影響來源的寫入延遲。
- 效能隔離:索引容器擁有自己的儲存空間與 RU 限制,提供效能隔離。
- 優化讀取效能:微調資料模型、分割鍵與索引策略,以優化讀取效能,並支援使用豐富 NoSQL 查詢語法的查詢。
- 提升寫入效能:用戶端只需寫入原始容器,相較於多容器寫入策略,能提升寫入效能。
- 唯讀容器:對索引容器的寫入是非同步且自動管理的。 用戶端應用程式不需要直接寫入索引容器。
- 多重索引:你可以為同一來源容器建立多個索引容器。
定義全球次級指數
建立全域次級索引類似於建立一個新的容器,但新增了指定來源容器的屬性,以及定義 GSI 資料模型的查詢。 許多容器的自訂功能也適用於 GSI,包括自訂索引、向量及全文搜尋政策。 GSI 容器必須使用自動擴展吞吐量,這有助於它們在流量激增時做出反應,而不會因來源容器的更新而被限速或落後。
定義 GSI 的查詢必須遵守以下限制條件。 建立 GSI 後,你可以用完整的 Azure Cosmos DB NoSQL 查詢語法來查詢。
- SELECT 陳述式可以從 JSON 樹的任何層級投影屬性,或使用 SELECT * 來包含所有屬性。 投射的屬性將被展開為 GSI 中的頂層。
- 定義查詢中不支援屬性別名 (AS)。
- 查詢不能包含 WHERE 子句或其他子句,如 JOIN、DISTINCT、GROUP BY、ORDER BY、TOP、OFFSET LIMIT 或 EXISTS。
- 不支援系統函式和使用者定義的函式 (UDF)。
GSI 中的每個項目都與來源容器中的項目一對一對應。 為了維持這種映射, GSI 項目中的欄位會自動填充,來源項目 的值則以 表示為 。 使用 時,來源 會自動包含在 GSI 項目中。 在投影特定屬性時,若有需要必須明確包含 。
例如,一個有效的查詢是: 。 在 GSI 中,、 和 都以頂層屬性出現,儘管 在原始碼中是巢狀的。 此查詢定義 GSI 的資料模型,決定每個項目包含哪些屬性。 原始容器和定義查詢一旦建立就無法更改。
學習如何建立全球次級索引。
小提示
如果投影屬性並非所有來源項目中都存在,GSI 會對缺少的屬性使用空值。 如果你選擇的分割鍵不存在於所有項目中,你可能會達到 20 GB 的邏輯分割區大小限制。 設定警示來 監控邏輯分割區金鑰的儲存空間是否接近 20 GB。
全球次級指數同步
全域次要索引會自動透過變更摘要與來源容器中的資料變更同步。 當 GSI 為來源容器定義時,會為您建立並管理變更摘要工作。 變更會非同步反映到索引容器中的資料,不會影響寫入來源容器。 索引容器最終會與來源容器保持一致,無論帳戶的 一致性等級 如何設定。
變更摘要讀取會消耗來源容器的 RU,而寫入到 GSI 則會消耗 GSI 容器的 RU。 在兩個容器上配置的 RU 決定了資料被填充和同步的速度。
多區域帳戶中的全球次級指數
對於只有單一區域的 Azure Cosmos DB 帳戶,變更回饋會從來源容器讀取,並在該區域寫入至全域次要索引 (GSI)。 在具有單一寫入區域的多區域帳戶中,時,變更摘要讀取和 GSI 寫入均會在寫入區域中進行。 在具有多個寫入區域的帳戶中,變更摘要讀取與 GSI 寫入會在其中一個寫入區域中進行。 如果您的帳戶發生故障移轉,變更摘要讀取和 GSI 寫入會在新的寫入區域中進行。
查詢全球次級索引
查詢全域次級索引與查詢任何其他容器類似。 你可以使用完整且豐富的 Azure Cosmos DB for NoSQL 查詢語法,對 GSI 進行查詢,包括向量、全文搜尋和混合式搜尋。 和其他容器類似,你應該根據查詢模式調整 GSI 的索引政策 。
由於 GSI 可能擁有與來源不同的分割鍵,源端的跨區查詢可能會變成 GSI 上的單一分割查詢。 單一分割查詢能改善延遲並降低 RU 消耗。
最佳做法
選擇你的分割鍵
- GSI 分割鍵遵循與任何容器相同的設計原則。 學習 選擇分割鍵的最佳實務。
- 透過選擇存在於所有或幾乎所有來源項目中的分割鍵,以避免因空值而產生的不均勻分布。
- 使用階層 式分割鍵 ,最終層級為高基數性質,如 。 GSI 對於以結尾的階層式分區鍵具有獨特的優勢,因為系統會自動維護寫入和產生。 這優化了分割區金鑰,使邏輯分割區接近 20 GB 儲存限制,且不犧牲任何寫入或讀取模式。
基於查詢設計投影
- 只會對您的資料存取模式投射所需的屬性。 避免投射鮮少進入的物業,以減少儲存空間和 RU 消耗。
- 建立 GSI 定義查詢前,請徹底測試它。 定義一旦建立,就無法更改。
- 只有在需要所有屬性時才使用 。 選擇性投射更有效率。
優化效能
- 根據你的查詢模式調整 GSI 的索引政策,就像調整任何容器一樣。
- 請記得 RU 是分開使用的:在變更摘要處理時,讀取式來自來源容器,而在同步期間,則寫入至 GSI。 適當地在兩個容器上配置吞吐量。
- 在 GSI 上使用自動縮放輸入量來處理同步處理尖峰,避免節流。
監測
透過Azure入口Metrics區塊的全球次級索引傳播延遲(秒指標監控GSI健康狀況與效能。 此指標追蹤原始裝置與 GSI 在初始建置及持續同步期間的延遲。 更多細節請參閱 Microsoft.DocumentDB/DatabaseAccounts 支援的指標。
疑難排解常見問題
我想了解我的來源容器和 GSI 之間的延遲
傳播延遲指標顯示來源資料與GSI資料之間的平均秒數差異。 要查看個別 GSI 的延遲,請從值清單中選擇 「套用分割 」,然後 選擇 GlobalSecondaryIndexName 。
我想知道我的 GSI 何時準備好查詢
有兩種狀態類型用來區分首次建置 GSI 時的傳播延遲與主動 GSI 的延遲。 使用 全域次級索引傳播延遲(秒數) 指標,選擇 「套用分割」。 選擇 GlobalSecondaryIndexStatus 值,以查看 Active 或 InitialBuildAfterCreate 狀態下的全域次級索引的延遲。 你可以利用這個指標和狀態來設定 警報 ,當延遲超過某個門檻時。
我想知道我的 GSI 吞吐量是否足夠
來源和 GSI 上配置的 RU 會影響變更的傳播速率。 檢查標準化 RU 消耗指標,如果數值過高,增加 RU 上限可能會對容器有益。
後續步驟
資料建模與分割學習如何配置全域次級索引