【发布时间】:2015-02-10 03:42:57
【问题描述】:
我正在编写一个循环,它从一个表中获取一个点(美国州也是已知的),并查看该点与哪个县相交(#INPUT 拥有所有点地理,[dbo].[counties] 拥有所有县地理)。
这是查询:
DECLARE @RN_BEGIN INT
DECLARE @RN_END INT
SET @RN_BEGIN = 1
SELECT @RN_END = MAX([RN]) FROM #INPUT
DECLARE @STATE CHAR(2)
DECLARE @GEO GEOGRAPHY
WHILE @RN_BEGIN <= @RN_END
BEGIN
SELECT @ID_NUMBER = [ID_NUMBER] FROM #INPUT WHERE [RN] = @RN_BEGIN
SELECT @STATE = [STATE] FROM #INPUT WHERE [RN] = @RN_BEGIN
SELECT @GEO = [Geo] FROM #INPUT WHERE [RN] = @RN_BEGIN
INSERT INTO #OUTPUT
SELECT
@ID_NUMBER,
CONCAT([statefp], [countyfp]) AS [FIPSTCNTY]
FROM [dbo].[counties]
WHERE @GEO.STIntersects([Geo]) = 1 AND [statefp] = @STATE
SET @RN_BEGIN = @RN_BEGIN + 1
END
对于表#INPUT(约100 万行):我在[ID_NUMBER] 上有一个聚集索引,在[RN] 上有一个非聚集索引(不包括任何列),在@987654328 上有一个空间索引@(这是点列)。
对于表 #OUTPUT(完成后应该是大约 100 万行):我在 '[ID_NUMBER]` 上有一个聚集索引
对于表[dbo].[counties](~3000 行):我在 ID 字段上有一个聚集索引(这是我导入它时引入的方式),[statefp] 上有一个非聚集索引(同时包括[geo] 和 [countyfp]),以及 [Geo] 上的空间索引(这是县列)。
所以我对你们所有人的问题是,是否有任何我遗漏的明显索引,或者可能是解决这个问题的新方法(不是循环)?我知道循环很慢(特别是当它必须循环大约 100 万次迭代时),所以我希望以一种或另一种方式加速这个查询。
非常感谢任何建议/cmets。谢谢。
【问题讨论】:
-
什么是
@GEO.STIntersects([Geo])? -
@Dave.Gugg STIntersects (geography data type) 如果地理实例与另一个地理实例相交,则返回 1。如果不是,则返回 0。
-
好的,有道理。我以前从未使用过地理...我认为您的答案是正确的。
-
@GarethD 感谢您在下面提出的建议。我最近一直在循环思考事情,完全错过了那个加入。我会通过缩小
[dbo].[counties](即仅佛罗里达州的县)和#INPUT更小(即仅佛罗里达州的纬度/经度点)来提高性能吗?
标签: sql-server performance loops while-loop geo