Estou trabalhando com a edição SQL Server 2014 Express e quero carregar alguns dados do OpenStreetMaps.
Os dados são um XML de 172 Mb e carregam bem. O problema está neste script:
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,'') +')'
Recebo uma estrutura .NET sem memória no SQL Server Management Studio e também o executo no SQLCMD.
ways
tabela tem 101.393 linhas e waynodes
tem 1.018.575 linhas.
Você sabe como posso melhorar esse script?
By the way, eu recebo este script deste tutorial .
Não tenho índice e nem execução de plano. Estou apenas seguindo o tutorial e recebo um erro de falta de memória.
Como Ypercube disse em seu comentário, você parece ter uma subconsulta não correlacionada. Isso significa que, para cada caminho, você está tentando criar uma linha contendo 1.000.000 de nós ímpares.
Também seria melhor colocar um construtor Geography em torno do resultado da subconsulta.
A instrução de atualização do tutorial que você mencionou tem uma subconsulta correlacionada, porque a
WHERE
cláusula éwn.wayid = ways.wayid
Alterar sua consulta de atualização para isso deve corrigir o problema.Pessoalmente, prefiro construir minhas declarações de atualização semelhantes às seguintes.
Eu testei uma versão SELECT da minha atualização em alguns dados inventados. SQLFiddleName