Имам колекция cosmosdb (sql api), която съм попълнил с документи, представляващи CIDR мрежови диапазони.
Съответната част от всеки документ е
{
"Network": "31.216.102.0/23",
"IPRangeStart": 534275584,
"IPRangeEnd": 534276095,
Всеки CIDR блок има своя начален и краен IP адрес, преобразуван в uint
и съхранен в свойствата RangeStart
и RangeEnd
.
Когато стартирам заявка за търсене на конкретен запис по неговия начален диапазон, тя работи според очакванията и е доста бърза.
SELECT top 1 * FROM c WHERE c.IPRangeStart = 532361216
Request Charge: 3.02 RUs
Въпреки това, когато въвеждам между заявка, използвайки оператори ‹= / =>, става МНОГО скъпо.
SELECT top 1 * FROM c WHERE c.IPRangeStart <= 534275590 AND c.IPRangeEnd >= 534275590
Request Change: 1647.99 RUs
Прегледах настройката на индекса на колекцията
Също така приложих 2 допълнителни индекса на диапазон от цели числа върху колекцията за въпросните две конкретни свойства. Въпреки че изглежда няма начин да се провери дали тези индекси се прилагат/създават във фонов режим.
Има ли нещо очевидно, което може да пропускам.
{
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{
"path": "/*",
"indexes": [
{
"kind": "Range",
"dataType": "Number",
"precision": -1
},
{
"kind": "Hash",
"dataType": "String",
"precision": 3
}
]
},
{
"path": "/IPRangeStart/?",
"indexes": [
{
"kind": "Range",
"dataType": "Number",
"precision": -1
},
{
"kind": "Hash",
"dataType": "String",
"precision": 3
}
]
},
{
"path": "/IPRangEnd/?",
"indexes": [
{
"kind": "Range",
"dataType": "Number",
"precision": -1
},
{
"kind": "Hash",
"dataType": "String",
"precision": 3
}
]
}
],
"excludedPaths": []
}