Auch für Geodaten-Tabellen werden recht häufig Views generiert. Daten aus verschiedenen
Tabellen stehen damit quasi als "eine Tabelle" bereit. Und man kann mit den Views auch
sehr gut arbeiten. Nur lassen sich die Views von vielen GIS-Werkzeugen und auch vom
Oracle MapBuilder (das Werkzeug zum Einrichten der Kartendefinitionen für Oracle MAPS)
nicht verwenden - die Auswahldialoge zeigen sie einfach nicht an.
Nun befindet sich auf der View zwar kein Spatial-Index, aber das ist ja auch richtig so;
auf eine View kann kein Index gelegt werden. Der Grund ist die Spatial-Metadaten-View
USER_SDO_GEOM_METADATA, die von all diesen Werkzeugen ausgelesen wird und meist
Grundlage der Auswahllisten ist.
Die Lösung ist also einfach: Die View wird, wie die zugrundeliegende Spatial-Tabelle in
USER_SDO_GEOM_METADATA eingetragen. Nehmt einfach dieses SQL hier als Vorlage.
insert into user_sdo_geom_metadata values ( '{TABLE/VIEW NAME}', '{GEOM_COL_NAME}', sdo_dim_array( sdo_dim_element('X', {xmin}, {xmax}, {tolerance}), sdo_dim_element('Y', {ymin}, {ymax}, {tolerance}) ), {SRID} ) /
Einen Index könnt Ihr danach immer noch nicht anlegen - aber das braucht Ihr auch
nicht - der View sollte nun in eurem GIS-Werkzeug oder im Oracle MapBuilder sicht- und
auswählbar sein.
Sollte die View von einem anderen User benutzt werden, muss diese View auch für diesen User in den GDOSYS Metadaten eingetragen werden. Weiter benötigt dieser Benutzer das MERGE ANY VIEW Recht, da ansonsten der räumliche Index bei Zugriffen nicht genutzt werden kann. So können enorme Performance Probleme entstehen!!
AntwortenLöschenVielen Dank für den Hinweis. Natürlich muss der Nutzername in den MDSYS-Metadaten angegeben werden, sofern auf eine in einem anderen Schema liegende SDO_GEOMETRY Tabelle verwiesen wird.
AntwortenLöschenHier sind ein paar nützliche Abfragen auf Views zu SDO_GEOMETRY:
AntwortenLöschen-- Alle Tabelle mit SDO_GEOMETRY-Spalten (in einem Schema)
select table_name, column_name
from user_tab_columns
where data_type = 'SDO_GEOMETRY'
order by 1,2;
-- Tabellen mit SDO_GEOMETRY-Spalten, für die keine Metadaten registiert sind:
select table_name, column_name
from user_tab_columns
where data_type = 'SDO_GEOMETRY'
order by 1,2;
-- Tabellen mit SDO_GEOMETRY-Spalten, auf denen keine Spatial Indexes angelegt wurden
select table_name, column_name
from user_tab_columns
where data_type = 'SDO_GEOMETRY'
and (table_name, column_name) not in (
select table_name, column_name
from user_sdo_index_info)
order by table_name, column_name;
-- Invalide Spatial Indexes
select table_name, index_name
from user_indexes
where index_type = 'DOMAIN'
and ityp_name = 'SPATIAL_INDEX'
and domidx_opstatus = 'FAILED'
order by table_name, index_name;