【问题标题】:EnableScanInQuery no longer works for new CosmosDB containers启用扫描查询不再适用于新的 Cosmos DB 容器
【发布时间】: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


    【解决方案1】:

    我来自 CosmosDB 工程团队。我们正在逐步取消对 EnableScanInQuery 的支持,因为它并未针对每个可能的查询(例如,SELECT * from r)统一实施。此外,当 EnableScanInQuery 设置为 false 时,仍然允许部分扫描(即使查询中选择性最低的谓词之一满足大量文档并且可以从索引中提供,我们也会接受该查询,即使它可以有效地扫描)。对于今年年初开始的新容器,支持正在逐渐被取消。优化查询以避免扫描的推荐方法是检查查询执行指标以确定是否需要针对索引策略进行任何优化。

    这实际上意味着无论 EnableScanInQuery 是什么,查询都可能降级以自动扫描以提供结果,并且对于不支持此选项的容器,用户不会看到任何错误消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多