【发布时间】:2015-03-15 11:08:08
【问题描述】:
我将选择与任何铁路相交的省份。所以我这样做(使用 SQL Spatial):
SELECT * FROM ProvinceTable
WHERE (
SELECT count(*)
FROM RailroadTable
WHERE ProvinceTable.Shape.STIntersects(RailroadTable.Shape) > 1
) > 0
但它效率不高,因为它必须检查每个铁路几何图形和省份几何图形之间的交叉点才能计算 count。但是,最好在检测到每个第一个交叉点后立即停止 where 子句,而无需检查其他交叉点。这就是我的意思:
SELECT * FROM ProvinceTable
WHERE (
--return true if this is true for any row in the RailroadTable:
-- "ProvinceTable.Shape.STIntersects(RailroadTable.Shape) > 1"
)
那么有没有更好的方法来重写这个查询以实现这样的目标?
编辑 令人惊讶的是,这个查询花费了相同的时间并且没有返回任何行:
SELECT * FROM ProvinceTable
WHERE EXISTS (
SELECT *
FROM RailroadTable
WHERE ProvinceTable.Shape.STIntersects(RailroadTable.Shape) > 1
)
【问题讨论】:
-
可以在内连接中使用这些形状构造吗?如图所示here
-
我认为这个想法不会提高性能,因为必须使用内部连接检查每一行的交集。
标签: sql optimization sql-server-2014 spatial-query