Я путаюсь с политикой индексации cosmos-db и неявным полным сканированием.
Моя конечная цель:
- предотвращение случайного полного сканирования неиндексированных свойств
- индексировать только явно указанные свойства
Допустим, у меня есть таблица, подобная этой:
{
"id": "transactions",
"indexingPolicy": {
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{
"path": "/transactionId/?"
},
{
"path": "/createdOn/?"
}
],
"excludedPaths": [
{
"path": "/*"
},
{
"path": "/\"_etag\"/?"
}
]
},
"partitionKey": {
"paths": [
"/chargePointId"
],
"kind": "Hash"
}
}
Я предполагаю, что это означает, что у меня есть ровно 2 согласованных индекса (для транзакцииIid и столбцов createOn). Портал 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)
Таблица, о которой я говорю, создана недавно (~ несколько недель назад)У меня также есть таблица в другой учетной записи базы данных, созданной много лет назад. Если я попытаюсь сделать тот же трюк с этой таблицей - он не будет работать, как я ожидал.
Я не нашел никаких различий в учетной записи или таблицеarm-templates (экспортировано из портала Azure).
Почему не происходит сбой в новой таблице? Он все еще молча индексирует объекты или EnableScanInQuery
больше не учитывается для новых таблиц?