我有一个包含大约 500 个点的表格,并且正在寻找公差范围内的重复项。这需要不到一秒钟的时间,并给了我 500 行。大多数距离为零,因为它给出了相同的点(PointA = PointB)
DECLARE @TOL AS REAL
SET @TOL = 0.05
SELECT
PointA.ObjectId as ObjectIDa,
PointA.Name as PTNameA,
PointA.[Description] as PTdescA,
PointB.ObjectId as ObjectIDb,
PointB.Name as PTNameB,
PointB.[Description] as PTdescB,
ROUND(PointA.Geometry.STDistance(PointB.Geometry),3) DIST
FROM CadData.Survey.SurveyPoint PointA
JOIN [CadData].Survey.SurveyPoint PointB
ON PointA.Geometry.STDistance(PointB.Geometry) < @TOL
-- AND
-- PointA.ObjectId <> PointB.ObjectID
ORDER BY ObjectIDa
如果我使用底部附近的注释行,我会得到 14 行,但执行时间会增加到 14 秒。直到我的积分表扩大到十万,这没什么大不了的。
如果答案已经存在,我提前道歉。我确实看过,但是作为新手,我会迷失阅读那些超出我想象的帖子。
附录:ObjectID 是一个 bigint 和表的 PK,所以我意识到我可以将语句更改为
AND PointA.ObjectID > PointB.ObjectID
现在这需要一半的时间并给我一半的结果(7 秒内 7 行)。我现在没有重复(因为第 4 点接近第 8 点,然后第 8 点接近第 4 点)。但是性能仍然让我担心,因为表会非常大,所以任何性能问题都会成为问题。
附录 2:如下更改 JOIN 和 AND(或建议的 WHERE)的顺序也没有区别。
DECLARE @TOL AS REAL
SET @TOL = 0.05
SELECT
PointA.ObjectId as ObjectIDa,
PointA.Name as PTNameA,
PointA.[Description] as PTdescA,
PointB.ObjectId as ObjectIDb,
PointB.Name as PTNameB,
PointB.[Description] as PTdescB,
ROUND(PointA.Geometry.STDistance(PointB.Geometry),3) DIST
FROM CadData.Survey.SurveyPoint PointA
JOIN [CadData].Survey.SurveyPoint PointB
ON PointA.ObjectId < PointB.ObjectID
WHERE
PointA.Geometry.STDistance(PointB.Geometry) < @TOL
ORDER BY ObjectIDa
我发现我可以将 @Tol 值更改为返回超过 100 行而性能没有变化的大值,即使它需要很多计算,这很有趣。但随后添加一个简单的 A