9Utilizando SDO_WITHIN_DISTANCE, SDO_NN, y el operador SDO_JOIN
OBJETIVOS•Conocer como el operador SDO_WITHIN_DISTANCE para resolver las consultas relacionadas con la distancia•Comprender como el operador SDO_NN para realizar la consulta del vecino más cercano•Poner en práctica SDO_JOIN para obtener un cruce espacio-producto
Algunos ejemplos de las consultas típicas de los datos espaciales:
Encuentre todas las ciudades dentro de una distancia de una carretera interestatal.Encuentra cinco ciudades más cercanas a la carretera interestatal I170.Encuentra toda las ciudades y los pares de condados que tiene la interacción.Buscar todas las ciudades dentro de 10 millas de todas las autopistas interestatales.
1 EJEMPLOS DE CONSULTAS ESPACIALES
2 OPERADORES ESPACIALES
Operadores espaciales que pueden ser utilizados para resolver la distancia o la proximidad de consultas relacionadas con:
SDO_WITHIN_DISTANCESDO_NNEl SDO_JOIN operador espacial:
Puede ser utilizado para comparar todas las geometrías de una capa a todas las geometrías en otra capaEs útil comparando la mayor parte de una capa con todo o la mayor parte de otra capa
3 OPERADOR SDO_WITHIN_DISTANCE
SDO_WITHIN_DISTANCE ( <geometry-1>, <geometry-2>, 'DISTANCE=<n>, [parameters]' ) = 'TRUE'
SDO_WITHIN_DISTANCE: se utiliza para determinar el conjunto de objetos en una tabla que están dentro de las unidades de distancia n de un objeto de referencia (ventana de consulta)<geometry1>: ¿Es la búsqueda de la columna<geometry2>: Es la ventana de consulta<DISTANCE=n>: Se expresa en las unidades utilizadas para el sistema de coordenadas<unit>: Es la unidad de medida para asociarse con el parámetro <DISTANCE>
4 OPERADOR: SDO_NN
SDO_NN ( <geometry-1>, <geometry-2> [,'parameters'][,tag] ) = 'TRUE'
SDO_NN:Utiliza el índice espacial para identificar a los vecinos más cercanos para una geometríaPuede especificar el número de vecinos más próximos a ser devueltosNo devuelve los resultados en orden de distanciaTiene un operador auxiliar, SDO_NN_DISTANCE, que devuelve la distancia asociada a un vecino más cercano
<geometry1>: Es la columna espacial que se busca<geometry2>: Es la geometría cuya vecinos más cercanos está buscando.
Argumentos opcionales: SDO_NN
DISTANCIA: es la máxima distancia opcional para considerar en la búsqueda de los vecinos más cercanos
SDO_NUM_RES: Define el número de vecinos más próximos a regresar. Esto toma sólo la proximidad en consideración.
SDO_BATCH_SIZE: Especifica el número de filas que se procesan en un momento en el que la evaluación de otras limitaciones de la cláusula WHERE. De forma predeterminada, el valor 0, en cuyo caso Espacial decide el tamaño del lote óptimo.Usar la rownum pseudocolumn para limitar el número de geometrías devueltas.Especificar SDO_BATCH_SIZE o SDO_NUM_RES, pero nunca ambos.Si no se especifica ninguno, el valor predeterminado es SDO_BATCH_SIZE = 0.
UNIT (opcional con SDO_NN_DISTANCE)Se aplica a SDO_NN_DISTANCEEs la unidad de medida asociado con la distancia
TAG (requerido con SDO_NN_DISTANCE)Debe coincidir con la etiqueta entero especificado en SDO_NN_DISTANCEAsociados a un operador auxiliar con una instancia específica de SDO_NN
5 OPERADOR AUXILIAR: SDO_NN_DISTANCE
Esto devuelve la distancia asociados con los vecinos más cercanos devuelto por SDO_NN.Esto es válido sólo dentro de una llamada al operador SDO_NN.La distancia se ajusta a los parámetros de UNIT en el operador de SDO_NN.Si la UNIT no se ha especificado, empleamos SDO_NN_DISTANCE :
Medidores de datos geodésicosLa unidad de sistema para coordinar los datos proyectados
TAG es un número que asocia al operador auxiliar con una llamada a SDO_NN.
Encuentra las cinco ciudades más cercanas a la carretera interestatal I170, ordenados por distancia:
SELECT /*+ ordered */ c.city, c.state_abrv, sdo_nn_distance (1) distance_in_milesFROM geod_interstates i, geod_cities c WHERE i.highway = 'I170' AND sdo_nn(c.location, i.geom, 'sdo_num_res=5 unit=mile', 1) = 'TRUE'ORDER by distance_in_miles;
Resultado de utilizar SDO_NN_DISTANCE con el operador auxiliar DO_NUM_RES.
La consulta en la diapositiva anterior devuelve las cinco ciudades más cercanas a la carretera interestatal I170, ordenados por distancia:
CITY ST DISTANCE_IN_MILES
----- ---- -------------------
St Louis MO 5.36297295
Springfield IL 78.7997464
Peoria IL 141.478022
Evansville IN 158.22422
Springfield MO 188.508631
6 UTILIZANDO SDO_NN CON SDO_BATCH_SIZE
Encuentra las cinco ciudades más cercanas a la carretera interestatal I170 que tienen la población mayor de 300.000, ordenados por distancia.
Si usted pone SDO_BATCH_SIZE=0, SDO_NN escoge SDO_BATCH_SIZE óptimo
SELECT /*+ ordered */ c.city, c.state_abrv, pop90, sdo_nn_distance (1) distance_in_milesFROM geod_interstates i, geod_cities c WHERE i.highway = 'I170' AND sdo_nn(c.location, i.geom, 'sdo_batch_size=10 unit=mile', 1) = 'TRUE' AND c.pop90 > 300000 AND rownum < 6ORDER BY distance_in_miles;
La consulta en la diapositiva anterior devuelve las cinco ciudades más cercanas a la carretera interestatal I170 que tienen la población mayor de 300.000, ordenados por distancia:
CITY ST POP90 DISTANCE_IN_MILES
----------- -- ---------- -----------------
St Louis MO 396685 5.36297295
Kansas City MO 435146 227.404883
Indianapolis IN 741952 234.708666
Memphis TN 610337 244.202072
Chicago IL 2783726 253.547961
Este debe tener un índice en GEOD_INTERSTATES.SDO_NN filas de vueltas en la distancia ordenan en la cláusula WHERE.Cuando se utiliza SDO_BATCH_SIZE:
Como excepción, es aceptable para tener la condición rownum seguida de una operación ORDER BYDesactivar todos los índices no espacial en las columnas que vienen de la misma tabla que la columna de búsqueda SDO_NN
7 USO DE LA SUGERENCIA DEL OPTIMIZADOR NO_INDEX
Para deshabilitar un índice no espacial, utiliza la sugerencia de optimizador no_index.
SELECT /*+ ordered no_index(c pop90_idx) */ c.city, pop90, sdo_nn_distance (1) distance_in_milesFROM geod_interstates i, geod_cities c WHERE i.highway = 'I170' AND sdo_nn(c.location, i.geom, 'sdo_batch_size=0 unit=mile', 1) = 'TRUE' AND c.pop90 > 300000 AND rownum < 6ORDER BY distance_in_miles;
8 UTILIZANDO SDO_NN CON DISTANCE
Encuentra las cinco ciudades más cercanas a la carretera interestatal I170 que tienen la población mayor de 300.000, y una distancia máxima de 240 millas de la carretera interestatal I170:
SELECT /*+ ordered no_index(c pop90_idx) */ c.city, pop90, sdo_nn_distance (1) distance_in_milesFROM geod_interstates i, geod_cities c WHERE i.highway = 'I170' AND sdo_nn(c.location, i.geom, 'sdo_batch_size=0 distance=240 unit=mile',
1) = 'TRUE' AND c.pop90 > 300000 AND rownum < 6ORDER BY distance_in_miles;
Encuentra las cinco ciudades más cercanas a la carretera interestatal I170 que tienen la población mayor de 300.000, y una distancia máxima de 240 millas de la carretera interestatal I170:
CITY ST POP90 DISTANCE_IN_MILES
----------- -- ---------- -----------------
St Louis MO 396685 5.36297295
Kansas City MO 435146 227.404883
Indianapolis IN 741952 234.708666
9 Enlace espacial: operador SDO_JOINEsto se utiliza para comparar todas las geometrías de una capa con todas las geometrías de otra capa.
Esto también es útil cuando se comparan más de una capa con toda o con la mayor parte de otra capa.
El enlace espacial puede ser usado para responder a preguntas como: ¿Qué carreteras cruzan los parques nacionales?La geometría de las capas que se comparan:
Debe estar en el mismo sistema de coordenadasTienen la misma dimensionalidad
Ambas tablas deben ser espacialmente indexadas.
<table_name-n>: tablas que contienen las columnas SDO_GEOMETRY<column_name-n>: columnas SDO_GEOMETRY indexadas ‘parámetros’: Elija una de dos:
MÁSCARA: define las relaciones topológicas a buscar, por ejemplo, ANYINTERACT, INSIDE, OVERLAPS, , y así sucesivamente.Distancia y la UNIT opcional
Nota: Si los parámetros no se especifican, esto es análogo a SDO_FILTER.
Esto devuelve un objeto del tipo SDO_ROWIDSET, es decir, un par de ROWIDs que coinciden con las dos capas espaciales.
SDO_JOIN( <table_name-1>, <column_name-1>, <table_name-2>, <column_name-2> [,'parameters'])RETURN SDO_ROWIDSET
DESCRIBE SDO_ROWIDSET
ROWID1 se refiere a ROWID de table_name-1, y ROWID2 se refiere a ROWID de table_name-2.
SDO_ROWIDSET TABLE OF MDSYS.SDO_ROWIDPAIR
Name Null? Type
-------------- -------- -----------
ROWID1 VARCHAR2(24)
ROWID2 VARCHAR2(24)
10 Enlace espacial: utilizando el parámetro MASK
Encuentra toda la ciudad y los pares de condado que tiene la interacción:
SELECT /*+ ordered use_nl(a,b) use_nl(a,c)*/ b.city, c.county
FROM TABLE(SDO_JOIN( 'GEOD_COUNTIES', 'GEOM', 'GEOD_CITIES', 'LOCATION', 'MASK=ANYINTERACT')) a, geod_cities b, geod_counties cWHERE a.rowid1 = c.rowid AND a.rowid2 = b.rowid ORDER BY a.city;
11 Enlace espacial: utilizando DISTANCE y el parámetro UNIT
Buscar todas las ciudades dentro de 10 millas de todas las autopistas interestatales:
SELECT /*+ ordered use_nl(a,b) use_nl(a,c)*/ b.city, c.highway
FROM TABLE(SDO_JOIN( 'GEOD_INTERSTATES', 'GEOM', 'GEOD_CITIES', 'LOCATION', 'DISTANCE=10 UNIT=MILE')) a, geod_cities b, geod_interstates c WHERE a.rowid1 = c.rowid AND a.rowid2 = b.rowid ORDER BY a.city;
12 PUNTOS IMPORTANTES ACERCA DE LOS OPERADORES ESPACIALES DE ORACLE
Hay tres puntos importantes para recordar que la ayuda para garantizar un rendimiento óptimo cuando se utilizan los operadores de Oracle Spatial son:
•Siempre use = 'true', y nunca <> 'false' o = 'true'.•Utilice la sugerencia /*+ ORDERED */ cuando la ventana de consulta proviene de una tabla.•Cuando se utiliza SDO_NN con el parámetro SDO_BATCH_SIZE, deshabilitar todos los índices no espacial en las columnas que vienen de la misma tabla que la columna de búsqueda SDO_NN.
• Esto se puede hacer con una sugerencia de Optimizador no_index.
13 EN PARALELO CON OPERADORES ESPACIALES Y CREATE TABLE AS SELECT
En general, los operadores espaciales no hacen el paralelismo de apalancamiento.Pero usted puede aprovechar el paralelismo con los operadores espaciales con CREATE TABLE AS SELECT.
El paralelismo con los operadores espaciales y CREATE TABLE AS SELECT se produce cuando la ventana de consulta alimentan el segundo argumento del operador espacial, por ejemplo:
ALTER SESSION ENABLE PARALLEL QUERY;
CREATE TABLE results NOLOGGING PARALLEL 4 AS SELECT /*+ ordered */ a.state, b.countyFROM geod_states a, geod_counties bWHERE sdo_relate (b.geom, a.geom, 'mask=touch')='TRUE';
Top Related