T-SQL Fastforward Cursor vs. foreach

mab*_*rei 5 c# t-sql sql-server

我想计算gps-point之间的距离,以获得第一个和最后一个点之间的完整距离.

我的问题是:什么更快?

  • 要将所有行加载到DataTable中,并通过foreach或在c#.net中计算它
  • 使用带有FastForward游标的StoredProcedure在Sql-Server上对其进行计算.

我谈到大约400,000行.

mar*_*c_s 4

我肯定会尝试在服务器上执行此操作 - 尽量避免仅仅为了计算单个数字(最后)而拖下 400'000 行。

另外:如果可能的话,我会尝试在没有光标的情况下进行操作。游标是 SQL Server 上的噩梦 - 应该不惜一切代价避免它们。

在您的情况下 - 不知道您的详细表结构 - 您绝对可以执行例如递归 CTE(通用表表达式),从第一个元素开始,总距离为 0.0,然后递归地总结所有其他路径点,计算距离点 (x+1) 和点 x 之间,然后求和为之前的总和。

最后,您应该有一个 CTE,显示所有航点、任意两个航点之间的所有距离以及整个旅程的总距离。

CTE 类似于:

;WITH Waypoints AS
(
    -- anchor your query
    SELECT
       WaypointID, PrevWaypointID, Long, Lat, 0.0 as Distance, 0.0 as SumOfDistance
    FROM
       dbo.Waypoint
    WHERE
       PrevWaypointID IS NULL  --  or some other condition

    UNION  -- recurse

    SELECT
       WaypointID, Long, Lat, 
       dbo.GetDistanceBetween(wp.WaypointID, pts.WaypointID),   -- distance
       pts.SumOfDistance + dbo.GetDistanceBetween(wp.WaypointID, pts.WaypointID)  -- sum
    FROM
       dbo.Waypoint wp
    INNER JOIN
       Waypoints pts ON wp.PrevWaypointID = pts.WaypointID          
    WHERE
       (some condition; ID = 1 or PreviousWaypointID IS NULL or something)
)
SELECT * FROM Waypoints
Run Code Online (Sandbox Code Playgroud)