3 votos

Optimización de consultas espaciales grandes en SQL

Estoy seguro de que se han dado respuestas similares en otro lugar, pero no importa lo que haya intentado, no puedo optimizar esta consulta.

Detalles: TableA tiene 3.5 millones de registros. TableB tenía 57000 registros, pero los he reducido a 170 basados en la categoría de datos.

Necesito devolver qué características en tableB intersectan con cada registro individual en tableA en una sola cadena.

Update a
   Set a.[Zone_Codes] = (SELECT SUBSTRING((SELECT '; '+ b.[ZONE_CODE] FROM  [TableB] AS b 
                        WHERE a.geometry.STIntersects(b.geometry.MakeValid()) = 1   
                        ORDER BY b.[ZONE_CODE] FOR XML PATH ('')), 2, 1000))
FROM [TableA] AS a

¿Alguna idea de cómo optimizar esto? Todas las tablas tienen índices espaciales. SQL Management Studio 13

--- código modificado eliminado, no se optimizó

0voto

Lo que tienes ahí es una Subconsulta Correlacionada. Los resultados de la subconsulta interna (SELECT '; '+ b.[ZONE_CODE] FROM [TablaB] etc ... variarán dependiendo de un valor (el geometry) de TablaA. Eso significa que el SELECT debe ejecutarse 3.5 millones de veces, una vez por cada una de las filas en TablaA.

He reescrito la consulta utilizando CTEs (expresiones de tabla comunes) con la esperanza de que pueda crear algo de almacenamiento en caché/reutilización de las uniones de tablas:

with step1  as 
(
SELECT  A.id, B.Zone_Code, B.id as Bid
FROM  TableA AS A 
INNER JOIN TableB AS B
 ON A.geometry.STIntersects(B.geometry.MakeValid()) = 1                  
),
step2 as 
(
SELECT id, STUFF(
    (SELECT N'; ' + Zone_Code FROM step1
       WHERE id = s.id
       ORDER BY Zone_Code
       FOR XML PATH, TYPE).value(N'.[1]',N'nvarchar(max)'),1,1,'') as zones
       from step1 as s
group by id
)

UPDATE TableA
SET Zone_Codes = step2.zones
FROM TableA INNER JOIN step2 on TableA.id=step2.id 

Pero no tengo una gran tabla espacial para probarlo, así que no estoy seguro si ayudará o dificultará.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X