【发布时间】:2019-10-07 11:27:22
【问题描述】:
我对 cosmos-db 索引策略和隐式全扫描感到困惑。
我的最终目标是:
- 防止对非索引属性的意外全扫描
- 仅索引明确指定的属性
假设我有一张这样的桌子:
{
"id": "transactions",
"indexingPolicy": {
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{
"path": "/transactionId/?"
},
{
"path": "/createdOn/?"
}
],
"excludedPaths": [
{
"path": "/*"
},
{
"path": "/\"_etag\"/?"
}
]
},
"partitionKey": {
"paths": [
"/chargePointId"
],
"kind": "Hash"
}
}
我认为这意味着我有 2 个一致的索引(在 transactionId 和 createdOn 列上)。 Azure 门户不允许我指定索引类型:它“接受”更改,但是当它重新加载页面时,所有更改都消失了。
现在我在禁用全扫描的不存在列上执行查询,假设它将失败并出现错误:An invalid query has been specified with filters against path(s) excluded from indexing. Consider adding allow scan header in the request.。
但是,它不会发生。它工作正常并在控制台中打印00:00:00。
var policy = new ConnectionPolicy()
{
ConnectionMode = ConnectionMode.Gateway
};
var client = new DocumentClient(host, key, policy);
var queryText = "select * from c where c.asdasdasd > '2'";
var query = client.CreateDocumentQuery(
UriFactory.CreateDocumentCollectionUri("transactions", "transactions"),
queryText,
new FeedOptions
{
PopulateQueryMetrics = true,
EnableScanInQuery = false,
EnableCrossPartitionQuery = true,
}
).AsDocumentQuery();
var result = await query.ExecuteNextAsync();
var metrics = result.QueryMetrics;
Console.WriteLine(metrics.Single().Value.QueryEngineTimes.IndexLookupTime);
(代码取自本指南https://docs.microsoft.com/en-us/azure/cosmos-db/sql-api-query-metrics)
我正在谈论的表是最近创建的(〜几周前)。我在很久以前创建的另一个数据库帐户中也有一个表。如果我尝试在这张桌子上做同样的把戏 - 它会像我预期的那样失败。
我没有发现帐户或表格臂模板(从 azure 门户导出)有任何差异。
为什么在新表上没有失败?
它是否仍然默默地索引事物或EnableScanInQuery 不再被新表所尊重?
【问题讨论】:
标签: azure azure-cosmosdb azure-cosmosdb-sqlapi