Azure Cosmos DB地理空间查找消耗的RU太高

时间:2018-11-21 19:25:51

标签: azure azure-cosmosdb

我要查询的是一个Azure Cosmos DB集合,希望使用地理空间索引进行有效查询。我遇到的问题是RU消耗效率低下。

该集合中只有5万个1kb文档,但是使用ST_DISTANCE返回单个文档的查询将消耗900 RU。

我已经看到RUs基于集合中文档的数量线性增加。索引似乎可以防止这种情况。

示例查询(950 RU):

SELECT * FROM c where ST_DISTANCE(c.location, { 'type': 'Point', 'coordinates': [34.69, -1.91] }) < 500

示例文档:

[
    {
        "id": "1504891036",
        "name": "Oujda",
        "location": {
            "type": "Point",
            "coordinates": [
                34.69,
                -1.91
            ]
        },
        "population": 409391,
        "country": "Morocco",
        "country.iso2": "MA",
        "country.iso3": "MAR",
    }
]

我尚未修改默认的索引策略,该策略似乎涵盖了空间索引:

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*",
            "indexes": [
                {
                    "kind": "Range",
                    "dataType": "Number",
                    "precision": -1
                },
                {
                    "kind": "Range",
                    "dataType": "String",
                    "precision": -1
                },
                {
                    "kind": "Spatial",
                    "dataType": "Point"
                }
            ]
        }
    ],
    "excludedPaths": []
}

1 个答案:

答案 0 :(得分:0)

我确定了问题。我已经调换了GeoJSON指定的经度和纬度坐标:

Cosmos预期:

"location": {
            "type": "Point",
            "coordinates": [
                <@lon>,
                <@lat>
            ]

我错误地认为这是经/纬度。因此,我的许多纬度超出了所需的90 / -90范围,因为经度可以为180 / -180。重新创建约5万份文档后,用于基于坐标的查找的RU始终为<10 RU。

在修复之前(所有文档都已调换经/纬度坐标,许多超出了90 / -90范围,因此无效):

SELECT * FROM c where ST_DISTANCE(c.location, { 'type': 'Point', 'coordinates': [34.69, -1.91] }) < 500
940 RUs, 1 document returned

修复后(根据GeoJSON规范正确设置了经纬度的所有文档)

SELECT * FROM c where ST_DISTANCE(c.location, { 'type': 'Point', 'coordinates': [-1.91,34.69] }) < 500
6 RUs, 1 document returned

最初的问题已通过以下查询确认/诊断:

SELECT ST_ISVALIDDETAILED(c.location) FROM c where c.name = "Kansas City"
Error: "Latitude values must be between -90 and 90 degrees."