Azure Cosmos DB 提供索引計量來顯示已使用索引路徑和建議的索引路徑。 你可以利用索引指標來優化查詢效能,特別是在你不確定如何修改 索引政策的情況下。
支援的 SDK 版本
以下 SDK 版本支援索引指標:|SDK |支援版本 | |--- |--- | |.NET SDK v3 | >= 3.21.0 | |Java SDK v4 | >= 4.19.0 | |Python SDK | >= 4.6.0 |
啟用索引指標
你可以透過將屬性設定 PopulateIndexMetrics 為 true來啟用查詢的索引指標。 如果未指定, PopulateIndexMetrics 則預設為 false。 我們只建議啟用索引指標來排解查詢效能問題。 只要查詢和索引政策不變,索引指標不太可能改變。 相反地,我們建議使用診斷日誌來監控查詢的 RU 收費和延遲,以識別耗費資源的查詢。
string sqlQueryText = "SELECT TOP 10 c.id FROM c WHERE c.Item = 'value1234' AND c.Price > 2";
QueryDefinition query = new QueryDefinition(sqlQueryText);
FeedIterator<Item> resultSetIterator = container.GetItemQueryIterator<Item>(
query, requestOptions: new QueryRequestOptions
{
PopulateIndexMetrics = true
});
FeedResponse<Item> response = null;
while (resultSetIterator.HasMoreResults)
{
response = await resultSetIterator.ReadNextAsync();
Console.WriteLine(response.IndexMetrics);
}
範例輸出
在這個範例查詢中,我們觀察到所使用的路徑 /Item/? 和 /Price/? 潛在的複合索引 (/Item ASC, /Price ASC)。
Index Utilization Information
Utilized Single Indexes
Index Spec: /Item/?
Index Impact Score: High
---
Index Spec: /Price/?
Index Impact Score: High
---
Potential Single Indexes
Utilized Composite Indexes
Potential Composite Indexes
Index Spec: /Item ASC, /Price ASC
Index Impact Score: High
---
所使用的索引路徑
所使用的單一索引與所使用的複合索引分別顯示查詢所包含的路徑與複合索引。 查詢可以使用多個索引路徑,並混合使用包含路徑和複合索引。 如果索引路徑未被列為已使用,移除索引路徑不會影響查詢的效能。
將所使用的索引路徑清單視為查詢使用這些路徑的證據。 如果你不確定新的索引路徑是否能提升查詢效能,建議你嘗試新增索引路徑,並檢查查詢是否使用它們。
潛在索引路徑
潛在的單一索引與潛在的複合索引分別顯示了若新增查詢可能使用的路徑與複合索引。 如果你看到潛在的索引路徑,應該考慮將它們加入索引政策,觀察它們是否能提升查詢效能。
將潛在索引路徑清單視為推薦,而非查詢會使用特定索引路徑的確鑿證據。 潛在的索引路徑並非查詢可使用的全部索引路徑清單。 此外,有些潛在的索引路徑可能不會影響查詢效能。 新增推薦的索引路徑 ,並確認它們是否能提升查詢效能。
備註
你對索引指標有什麼回饋嗎? 我們想要知道您的看法! 歡迎您將意見直接告訴 Azure Cosmos DB 工程小組:cosmosdbindexing@microsoft.com
指數影響分數
索引影響分數是指根據查詢形狀,索引路徑對查詢效能產生顯著影響的機率。 換句話說,指數影響分數是指若沒有該特定索引路徑,查詢 RU 費用會大幅增加的機率。
指數影響分數有兩種可能: 高 與 低。 如果你有多條潛在的索引路徑,我們建議專注於影響分數 較高 的索引路徑。
索引影響分數唯一使用的標準是查詢形狀。 例如,在下方查詢中,索引路徑 /name/? 會被分配 一個高 指數影響分數:
SELECT *
FROM c
WHERE c.name = "Samer"
實際影響取決於資料的性質。 如果只有少數項目符合篩選條件 /name ,索引路徑將大幅提升查詢 RU 費用。 然而,如果大多數項目最終還是匹配到 /name 篩選器,索引路徑可能無法提升查詢效能。 在這些情況下,索引路徑 /name/? 會被分配 較高 的索引影響分數,因為根據查詢形狀,索引路徑有較高可能提升查詢效能。
其他範例
範例查詢
SELECT c.id
FROM c
WHERE c.name = 'Tim' AND c.age > 15 AND c.town = 'Redmond' AND c.timestamp > 2349230183
索引計量
Index Utilization Information
Utilized Single Indexes
Index Spec: /name/?
Index Impact Score: High
---
Index Spec: /age/?
Index Impact Score: High
---
Index Spec: /town/?
Index Impact Score: High
---
Index Spec: /timestamp/?
Index Impact Score: High
---
Potential Single Indexes
Utilized Composite Indexes
Potential Composite Indexes
Index Spec: /name ASC, /town ASC, /age ASC
Index Impact Score: High
---
Index Spec: /name ASC, /town ASC, /timestamp ASC
Index Impact Score: High
---
這些索引指標顯示查詢使用了索引路徑 /name/?、 /age/?、 /town/?和 /timestamp/?。 指數指標也顯示,加入綜合指數(/name ASC, /town ASC, /age ASC)和(/name ASC, /town ASC, /timestamp ASC)的可能性很高,有助於進一步提升效能。
後續步驟
更多關於索引的資訊,請參閱以下文章: