如果查询大于~200,000行

时间:2017-10-10 22:46:28

标签: sql sql-server geometry

我试图确定大型几何表中几何类型的分布,但即使在使用STIsValid()函数后仍然会出现无效的几何错误。

我使用的代码是:

WITH validDimensions AS
(
SELECT [id], [geometry]
FROM dimensions
WHERE [geometry].STIsValid()=1
)

SELECT COUNT(id), [geometry].STGeometryType() AS [GeometryType]
FROM validDimensions
GROUP BY
[geometry].STGeometryType()

如果我将第一个查询过滤到小于~200,000行的任何范围,则查询工作正常。

例如,

此查询有效:

WHERE [geometry].STIsValid()=1 AND id <200000

并且此查询有效:

WHERE [geometry].STIsValid()=1 AND id > 150000 AND id <300000

但此查询失败:

WHERE [geometry].STIsValid()=1 AND id <250000

错误是:

  

Msg 6522,Level 16,State 1,Line 1发生了.NET Framework错误   在执行用户定义的例程或聚合&#34; geometry&#34;时   System.ArgumentException:24144:无法完成此操作   因为实例无效。使用MakeValid转换   实例到有效实例。请注意,MakeValid可能会导致积分   几何实例稍微移位System.ArgumentException:   在Microsoft.SqlServer.Types.SqlGeometry.ThrowIfInvalid()   在Microsoft.SqlServer.Types.SqlGeometry.STGeometryType()

我可以通过使用.MakeValid()来运行查询,但它太慢而无法使用。有人遇到过这个吗?

编辑: 我通过切换到临时表而不是使用&#39; WITH&#39;来实现这一点:

SELECT [id], [geometry]
INTO validdimensions
FROM dimensions
WHERE [geometry].STIsValid()=1


SELECT COUNT(id), [geometry].STGeometryType() AS [GeometryType]
FROM validDimensions
GROUP BY
[geometry].STGeometryType()

我仍然有兴趣知道为什么第一个查询会出错。

谢谢,

最高

0 个答案:

没有答案