【问题标题】:MSSQL Spatial index multiple predicate not using the indexMSSQL 空间索引多个谓词不使用索引
【发布时间】:2018-05-03 09:25:34
【问题描述】:

我有一个位置表,在 GeoLocation 列上有一个空间索引。以下查询有效:

SELECT *
FROM Location WITH (INDEX (SpatialIndex_GeoLocation))
WHERE GeoLocation.STDistance(GEOGRAPHY::STGeomFromText('POINT(4.271942         
52.085289)', 4326)) < 50

但是,当添加第二个谓词时:

SELECT *
FROM Location WITH (INDEX (SpatialIndex_GeoLocation))
WHERE GeoLocation.STDistance(GEOGRAPHY::STGeomFromText('POINT(4.271942         
52.085289)', 4326)) < 50
OR 
GeoLocation.STDistance(GEOGRAPHY::STGeomFromText('POINT(5.758871 52.7845827)', 4326)) < 50

抛出以下异常:

查询处理器无法为带有 a
的查询生成查询计划 空间索引提示。原因:找不到所需的比较谓词。
尝试删除索引提示或删除 SET FORCEPLAN。

当然,删除索引提示会使查询工作,但不使用索引。

任何帮助将不胜感激

【问题讨论】:

    标签: indexing azure-sql-database spatial sql-server-2016 sqlgeography


    【解决方案1】:

    在这种情况下,一种解决方法可能是使用 UNION 操作,如下所示:

    SELECT *
    FROM Location WITH (INDEX (SpatialIndex_GeoLocation))
    WHERE GeoLocation.STDistance(GEOGRAPHY::STGeomFromText('POINT(4.271942         
    52.085289)', 4326)) < 50
    UNION 
    SELECT *
    FROM Location WITH (INDEX (SpatialIndex_GeoLocation))
    WHERE
    GeoLocation.STDistance(GEOGRAPHY::STGeomFromText('POINT(5.758871 52.7845827)', 4326)) < 50
    

    【讨论】:

    • 工会确实有效。正在使用该索引。但是,不允许对 geography 数据类型进行联合。这将导致: 数据类型 geography 不能用作 UNION、INTERSECT 或 EXCEPT 运算符的操作数,因为它不可比较。同样对于我的特殊情况,大约有 4000 个或谓词,这将导致 4000 个联合和大量工作,这对我来说目前不值得。不过谢谢你的建议。
    猜你喜欢
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2012-04-25
    • 1970-01-01
    • 2012-03-01
    • 2016-05-07
    • 1970-01-01
    相关资源
    最近更新 更多