我有一个包含地理列的表,用于存储属性的位置。
我有一个类似的程序 -
PROCEDURE dbo.spt_sold_property_search
(
@latitude_min Decimal(9,6),
@latitude_max Decimal(9,6),
@longitude_max Decimal(9,6),
@longitude_min Decimal(9,6)
)
AS BEGIN
SET NOCOUNT ON
SELECT * FROM [dbo].[sold_property] AS p WITH(NOLOCK)
WHERE p.location ***is in the lat/long min max bounds***
END
我需要在where子句中检查地理点是否在Lat / Long min max的范围内?它是一个大型数据集,因此性能至关重要。
我是否应该在边界的代码中创建Geography SQL类型并将其作为过程传递给proc?
我还在考虑创建2个计算的int列(lat / long),这些列将在insert上创建,然后简单< >我听说这比地理查询要快。
答案 0 :(得分:0)
如果您只要求纬度和经度在最大/最小值范围内,请使用Lat和长属性:
SELECT * FROM [dbo].[sold_property] AS p WITH(NOLOCK)
WHERE p.location.Lat BETWEEN @latitude_min and @latitude_max
AND p.location.Long BETWEEN @longitude_min and @longitude_max
但是,在我看来,从提供的坐标构造多边形是正确的,然后使用STWithin方法检查表中的点是否在多边形内,如下所示:
DECLARE @g geography;
SET @g = geography::Parse('POLYGON (('+CONVERT(NVARCHAR(20),@latitude_min)+', '+
CONVERT(NVARCHAR(20),@latitude_max)+', '+CONVERT(NVARCHAR(20),@longitude_min)+', '+
CONVERT(NVARCHAR(20),@longitude_max)+'))');
SELECT * FROM [dbo].[sold_property] AS p WITH(NOLOCK)
WHERE @g.STWithin(p.location)
请注意,后一个查询可能不是sargable。正如Ben Thul在下面提到的,空间索引可能支持STWithin