我正在使用 SQL Server 2014 Express 版本,我想上传一些 OpenStreetMaps 数据。
数据是一个 172 Mb 的 XML,它加载正常。问题出在这个脚本上:
UPDATE ways
SET geog4326 = 'LINESTRING(' + STUFF((
SELECT ',' + CAST(CAST(n.Longitude AS decimal(18,9)) AS varchar(32)) + ' ' + CAST(CAST(n.Latitude AS decimal(18,9)) AS varchar(32)) AS [text()]
FROM
ways w JOIN waynodes wn ON w.wayid = wn.wayid
JOIN nodes n ON wn.nodeid = n.nodeid
WHERE wn.wayid = w.wayid
ORDER BY w.wayid, orderid
FOR XML PATH(''), TYPE
).value('/', 'NVARCHAR(MAX)'),1,1,'') +')'
我在 SQL Server Management Studio 上得到一个内存不足的 .NET 框架,并且还从 SQLCMD 运行它。
ways
表有 101,393 行和waynodes
1,018,575 行。
你知道我该如何改进这个脚本吗?
顺便说一句,我从本教程中获得了这个脚本。
我没有索引,也没有执行计划。我只是按照教程进行操作,但出现内存不足错误。
正如 Ypercube 在他的评论中所说,你似乎有一个不相关的子查询。这意味着对于每种方式,您都试图构建一条包含 1,000,000 个奇数节点的线。
此外,最好在子查询的结果周围放置一个 Geography 构造函数。
您引用的教程的更新语句有一个相关的子查询,因为
WHERE
子句是wn.wayid = ways.wayid
Changing your update query to this 应该可以解决这个问题。我个人更喜欢构建类似于以下内容的更新语句。
我已经在一些虚构的数据上测试了我更新的 SELECT 版本。 SQLFiddle