【问题标题】:Getting Nearest records to more different points将最近的记录获取到更多不同的点
【发布时间】:2014-01-17 15:40:37
【问题描述】:

我想使用空间索引提示查询到更多不同点的最近记录。如果我在它们之间加上“和”(如第一个块),就没有问题。但如果我使用“或”(如第二个块),我会收到错误消息:

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

怎么了?有没有替代的解决方案?

第一个区块:

SELECT 
   [Id],[Geocode]
FROM 
   [dbo].[Companies] with (INDEX(SpatialIndex_GeoCode))
WHERE 
   ([Geocode].STDistance(geography::Point(42.7085, -74.9456, 4326)) < 8046.72) 
   and ([Geocode].STDistance(geography::Point(42.7085, -74.9456, 4326)) < 18046.72)

第二块:

SELECT 
    [Id],[Geocode]
FROM 
    [dbo].[Companies] with (INDEX(SpatialIndex_GeoCode))
WHERE 
    ([Geocode].STDistance(geography::Point(42.7085, -74.9456, 4326)) < 8046.72) 
    OR ([Geocode].STDistance(geography::Point(42.7085, -74.9456, 4326)) < 18046.72)

【问题讨论】:

  • 请解释为什么不能删除索引提示
  • 因为性能。在没有提示的情况下运行查询时,不使用索引。所以查询运行很慢
  • 我发布了一个包含提示的答案。它的性能是否足够?

标签: sql sql-server sql-server-2012


【解决方案1】:

您始终可以将or 生成的两个数据集分开,然后将它们重新组合在一起。使用union 而不是union all 应该避免重复:

SELECT 
    [Id],[Geocode]
FROM 
    [dbo].[Companies] with (INDEX(SpatialIndex_GeoCode))
WHERE 
    ([Geocode].STDistance(geography::Point(42.7085, -74.9456, 4326)) < 8046.72) 
union
SELECT 
    [Id],[Geocode]
FROM 
    [dbo].[Companies] with (INDEX(SpatialIndex_GeoCode))
WHERE 
    ([Geocode].STDistance(geography::Point(42.7085, -74.9456, 4326)) < 18046.72)

【讨论】:

    猜你喜欢
    • 2018-08-02
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    相关资源
    最近更新 更多