Partioning spatially indexed tables
I am a complete novice when it comes to partitioning, so can someone tell me any advantages/disadvantages/problems in partitioning a large RTREE spatially indexed table (using an SDO_GEOMETRY column) containing several million rows?
Just to make sure you understand what is and isn't possible:
When partitioning a table with spatial data, you cannot partition based on the geometry column.
Spatial index partitioning is only available on a table that has been partitioned by range.
All of the manageability benefits associated with partitioning data applies to data with a spatial column as well. If the index has been built using partitioning, you can do things like store different index partitions in different tablespaces, index partition rebuilds, index partition archives, exchange, split, merge partitions, etc.
In terms of performance, there are several benefits that can be achieved:
If the partition key can be specified as a predicate on the query, then there can be a large performance improvement.
If you can't specify a partition key in the query, then if the index is stored across different tablespaces then concurrency can improve if multiple sessions are accessing the index.
Single stream performance can be improved through the use of parallelism as well.
Most of the above is available in 9iR1, although exchange partition and parallelism both were available as of 9iR2.
If there is no parallelism, and no partition key predicate can be specified in spatial queries, and there is only single session access to the database, and you don't need the manageability benefits, then partitioning probably isn't for you.
Similar Messages
-
Performance issue when inserting into spatial indexed table with JDBC
We have a table named 'feature' which has a "sdo_geometry" column, and we created spatial index on that column,
CREATE TABLE feature ( id number, desc varchar, oshape sdo_gemotry)
CREATE INDEX feature_sp_idx ON feature(oshape) INDEXTYPE IS MDSYS.SPATIAL_INDEX;
Then we executed the following SQL to insert about 800 records into that table(We tried this by using DB visualizer and
our Java application, both of them were using JDBC driver to connect to the oracle 11gR2 database) .
insert into feature(id,desc,oshape) values (1001,xxx,xxxxx);
insert into feature (id,desc,oshape) values (1002,xxx,xxxxx);
insert into feature (id,desc,oshape) values (1800,xxx,xxxxx);
We encoutered the same problem as this topic
Performance of insert with spatial index
It takes nearly 1 secs for inserting one record,compare to 50 records inserted per sec without spatial index,
which is 50x drop in peformance when doing insertion with spatial index.
However, when we copy and paste those insertion scripts into Oracle Client(same test and same table with spatial index), we got a totally different performance result:
more than 50 records inserted in 1 secs, just as fast as the insertion without building spatial index.
Is it because Oracle Client is not using JDBC? Perhaps JDBC was got something wrong when updating those spatial indexed tables.
Edited by: 860605 on 19/09/2011 18:57
Edited by: 860605 on 19/09/2011 18:58
Edited by: 860605 on 19/09/2011 19:00Normally JDBC use auto-commit. So each insert can causes a commit.
I don't know about Oracle Client. In sqlplus, insert is just a insert,
and you execute "commit" to explicitly commit your changes.
So maybe this is the reason. -
Creating a combined view of two spatially indexed tables
Hi All,
I'm using oracle 10g and C++ occi to store and retrieve data. I have two tables that are identical in structure, they have an SDO_GEOM column where I store lat/long/altitude info. When I store the data using a stored procedure, the data is put into the correct table. I now want to retrieve the data using a spatial operator - I use SDO_NN to retrive data within a given distance of a lat/long/altitude point. This works fine for a single or multiple tables as I use a stored function to give me the data back as an object. I now have a requirement to list all the data from both tables - I thought I could do this by creating a combined view but I understand this cannot be done with spatial data - I habe also tried using the join operator but I am having problems since the columns for each table are identical. Is there any workaround for this - the combined view will not have any spatial operators run on it, I just need to return each row (the spatial data can be returned as individual lat/long/alt instead of as a SDO_GEOM. A second idea I had would be to return all the data using a ref cursor - this works for a single table but I do not understand how I can open the cursor with a select from two tables with identical column names.
Unfortunately it is a requirement that the tables are seperate so combining the two tables into one is not an option.
Thanks in advance for any help anyone can offer,
Cheers,
RobYou can create a UNION ALL view:
CREATE TABLE cola_markets_1 (
mkt_id NUMBER PRIMARY KEY,
name VARCHAR2(32),
shape SDO_GEOMETRY);
CREATE TABLE cola_markets_2 (
mkt_id NUMBER PRIMARY KEY,
name VARCHAR2(32),
shape SDO_GEOMETRY);
CREATE VIEW v1 AS
SELECT * FROM cola_markets_1 UNION ALL SELECT * FROM cola_markets_2;
If both tables have a spatial index on their shape column, a query plan will look
like:
explain plan for SELECT c.mkt_id, c.name FROM v1 c WHERE SDO_NN(c.shape, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(4,6, 8,8)) , 'sdo_num_res=1') = 'TRUE';
0 SELECT STATEMENT | |
1 VIEW | V1 |
2 UNION-ALL | |
3 TABLE ACCESS BY INDEX ROWID| COLA_MARKETS_1
4 DOMAIN INDEX | COLA_SPATIAL_IDX_1
5 TABLE ACCESS BY INDEX ROWID| COLA_MARKETS_2
6 DOMAIN INDEX | COLA_SPATIAL_IDX_2
However, the above SDO_NN query will return 2 rows (one from each table),
because it can only work on one table, it won't return the nearest neighbor
from the combined view without some tweaks. For example, to return the
top one, you may try:
select * from (SELECT c.mkt_id, c.name FROM v1 c WHERE SDO_NN(c.shape, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(4,6, 8,8)) , 'sdo_num_res=1') = 'TRUE' order by sdo_geom.sdo_distance(c.shape, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(4,6, 8,8)), 0.0001)) where rownum < 2;
Note that you can only pass literals or bind variables into the second input parameter
of spatial operators (including SDO_NN), when a UNION ALL view is used. i.e. the following
query won't work right now:
SELECT c.* FROM v1 c, another_table b WHERE b.id =1 and SDO_NN(c.shape, b.shape, 'sdo_num_res=1')= 'TRUE'; -
Hello,
We are facing a problem with spatial query performance on 10.2.0.5.
Apologies for limited information, I am still gathering information, but thought of asking this upfront.
What we have noticed is that queries involving SDO_ANYINTERACT runs slower say at about 8 secs. On Export/Import of data, the same query
runs in 0.5 secs.
Has anyone had a similar issue ? From the spatial index table I am not able identify if there is any fragmentation.
Pls let me know.
Rgds,
GokulGokul,
You'll have to provide a lot more information to get a meaningful answer.
I haven't found any issues with spatial queries on 10.2.0.5.
- Can you supply us your SQL query, preferably with an execution plan?
- How many rows in the table?
- How many rows does the query return?
- Is the data in a projected coordinate system or not?
- What do you mean by Export/Import and what is different about the query run at that stage?
John -
Spatial Index problem with query
I created a spatial index with user A. When i do a spatail query, i receive a good result. But, when i execute the same query with user B, i receive the following error :
ERROR at line 1:
ORA-13226: interface not supported without a spatial index
ORA-06512: at "MDSYS.MD", line 1723
ORA-06512: at "MDSYS.MDERR", line 8
ORA-06512: at "MDSYS.SDO_3GL", line 58
I don't understand why user B seems not to be able to see or use the spatal index created by user A.Hi,
What version of spatial are you using? You might have to grant select access on the spatial index table to user b in older versions of spatial. -
Specifying nologging while creating spatial indexes
Hello
Is it possible to specify NOLOGGING parameter while creating spatial indexes? When i am trying to specify this i get the following error message
SQL> create index BUSH_sx on BUSH(BUSHLOCATION) indextype is mdsys.spatial_index nologging;
create index BUSH_sx on BUSH(BUSHLOCATION) indextype is mdsys.spatial_index nologging
ERROR at line 1:
ORA-29850: invalid option for creation of domain indexes
Even i cannot alter the index with NOLOGGING option. Does Oracle allow this option in spatial indexes?
Regards
samI am looking into the logging issues.
SDO_COMMIT_INTERVAL determines the number records in a commit chunk during index BUILD, I noted this was not documented raised doc BUG 6414510 for this
and SDO_DML_BATCH_SIZE manual entries....
Specifies the number of index updates to be processed in each batch of updates after a commit operation. The default value is 1000. For example, if you insert 3500 rows into the spatial table and then perform a commit operation, the updates to the spatial index table are performed in four batches of insert operations (1000, 1000, 1000, and 500).
The sdo_dml_batch_size parameter can improve application performance, because Spatial can preallocate system resources to perform multiple index updates more efficiently than successive single index updates; however, to gain the performance benefit, you must not perform commit operations after each insert operation or at intervals less than or equal to the sdo_dml_batch_size value. You should not specify a value greater than 10000 (ten thousand), because the cost of the additional memory and other resources required will probably outweigh any marginal performance increase resulting from such a value.
====================================
I have found if you are doing repeated inserts/updates etc of 100,000 plus records despite the above, there is an advantage or appears to be! ;-) for setting it to 50,000.
it can be adjusted for an index that has been built
update SDO_INDEX_METADATA_TABLE
set SDO_DML_BATCH_SIZE = <Desired Value>
where sdo_index_owner = <INDEX/SCHEMA Owner>
and sdo_index_name = 'INDEX_NAME';
Clearly every system will be different experiment on test systems only....
Another area which can generally impact DML is undo_retention holding blocks when
you just don't care.
good settings when you dont wish to hold it
Look at SQL> show parameter undo
undo_management string AUTO
undo_retention integer 1 <<<< One second
undo_tablespace string MAKE Sure its big enough
with 10.2.0.x seems to be an issue with setting it to 0 but I've not had time to investigate
will do later. Also at 10.2.0.2 VERY large DML can sometimes hit ORA-600's the reasons are complex if you do hit them open a service request with support. There is a patch to cope with 95% of the issues. The other 5% I'm in the process of nailing and for those the current workaround is
update SDO_INDEX_METADATA_TABLE
set SDO_DML_BATCH_SIZE = 1
where sdo_index_owner = <INDEX/SCHEMA Owner>
and sdo_index_name = 'INDEX_NAME';
========================================
Dont do this without checking the 600 with support....
========================================
rather rambling....regarding the redo watch this space... -
Spatial index creation for table with more than one geometry columns?
I have table with more than one geometry columns.
I'v added in user_sdo_geom_metadata table record for every column in the table.
When I try to create spatial indexes over geometry columns in the table - i get error message:
ERROR at line 1:
ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-13203: failed to read USER_SDO_GEOM_METADATA table
ORA-13203: failed to read USER_SDO_GEOM_METADATA table
ORA-06512: at "MDSYS.SDO_INDEX_METHOD", line 8
ORA-06512: at line 1
What is the the solution?I'v got errors in my user_sdo_geom_metadata.
The problem does not exists! -
Create a spatial index on a large table
Hi all
I think that I might be starting to push XE beyond what it is capable of, but I thought I would ask here to see if anyone has some ideas how to get around my problem.
I have a table with around 8,000,000 record in it. It has position data in it (SDO_GEOMETRY) which I would like to index. The geometry is not complex, just a single point for each record. The SQL I use is
CREATE INDEX "ANNOTATION_TEXT_SX" ON "ANNOTATION_TEXT" ("GEOLOC") INDEXTYPE IS "MDSYS"."SPATIAL_INDEX"
The command fails, due to memory issues. The errors thrown are
ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-13249: internal error in Spatial index: [mdidxrbd]
ORA-13249: Error in Spatial index: index build failed
ORA-13236: internal error in R-tree processing: [failed to cluster in memory]
ORA-13232: failed to allocate memory during R-tree creation
ORA-13236: internal error in R-tree processing: [failed to allocate memory 7272216 (mdrtsalloc)]
ORA-04031: unable to allocate ORA-04031: unable to allocate 7272264 bytes of shared memory ("lar
I have done a bit of reading up, this type of error generally occurs when the tablespace runs out of memory. Since I am using the SYSTEM tablespace, I figure I am running it out to its capacity before the index is completed.
I have not created any other tablespaces. Is this an option to allow the creation of the index? Storage and Memory are at about 60% capacity (due to this one table) so is it just too big to create a spatial index on in XE? Am I barking up the wrong tree?
Cheers
JamesGood to see you are not using the SYSTEM tablespace. (And no need to apologize too profusely for being new at this - we all were at one time.)
It normally doesn't matter how many rows are involved. The issue is how much actual space those rows require. 8,000,000 rows is actually not a lot in the GIS world, esp. if all you have is simple point data. Using the sdo_point field instead of the arrays should be a lot more compact as well.
Some steps I would take:
- Identify the actual amount of space used, in total as well as by tablespace. (One of the web-based admin screens can show you this.)
- Load it all up usnig the free 'developer license' Enterprise Edition insead of XE just to verify it'll work.
- Try indexing a smaller data set and see whether that works. (Export the table first) Delete about 1/2 rows and try indexing.
The ORA-04031 is really telling you something about the SGA is not big enough. One of the SGA pools is trying to extend by 7M. Post the info about your SGA, as well ass some details about your machine (disk/processor/total memory)
Message was edited by:
forbrich
The actual error causing the problem is the last line. It ends with "la and the rest is cut off. Could it have said 'large pool'??? -
How to optimize massive insert on a table with spatial index ?
Hello,
I need to implement a load process for saving up to 20 000 points per minutes in Oracle 10G R2.
These points represents car locations tracked by GPS and I need to store at least all position from the past 12 hours.
My problem is that the spatial index is very costly during insert (For the moment I do only insertion).
My several tries for the insertion by :
- Java and PreparedStatement.executeBatch
- Java and generation a SQLLoader file
- Java and insertion on view with a trigger "instead of"
give me the same results... (not so good)
For the moment, I work on : DROP INDEX, INSERT, CREATE INDEX phases.
But is there a way to only DISABLE INDEX and REBUILD INDEX only for inserted rows ?
I used the APPEND option for insertion :
INSERT /*+ APPEND */ INTO MY_TABLE (ID, LOCATION) VALUES (?, MDSYS.SDO_GEOMETRY(2001,NULL,MDSYS.SDO_POINT_TYPE(?, ?, NULL), NULL, NULL))
My spatial index is created with the following options :
'sdo_indx_dims=2,layer_gtype=point'
Is there a way to optimize these heavy load ???
What about the PARALLEL option and how does it work ? (Not so clear for me regarding the documentation... I am not a DBA)
Thanks in advancedIt is possible to insert + commit 20000 points in 16 seconds.
select * from v$version;
BANNER
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
drop table testpoints;
create table testpoints
( point mdsys.sdo_geometry);
delete user_sdo_geom_metadata
where table_name = 'TESTPOINTS'
and column_name = 'POINT';
insert into user_sdo_geom_metadata values
('TESTPOINTS'
,'POINT'
,sdo_dim_array(sdo_dim_element('X',0,1000,0.01),sdo_dim_element('Y',0,1000,0.01))
,null)
create index testpoints_i on testpoints (point)
indextype is mdsys.spatial_index parameters ('sdo_indx_dims=2,layer_gtype=point');
insert /*+ append */ into testpoints
select (sdo_geometry(2001,null,sdo_point_type(1+ rownum / 20, 1 + rownum / 50, null),null,null))
from all_objects where rownum < 20001;
Duration: 00:00:10.68 seconds
commit;
Duration: 00:00:04.96 seconds
select count(*) from testpoints;
COUNT(*)
20000 The insert of 20 000 rows takes 11 seconds, the commit takes 5 seconds.
In this example there is no data traffic between the Oracle database and a client but you have 60 -16 = 44 seconds to upload your points into a temporary table. After uploading in a temporary table you can do:
insert /*+ append */ into testpoints
select (sdo_geometry(2001,null,sdo_point_type(x,y, null),null,null))
from temp_table;
commit;Your insert ..... values is slow, do some bulk processing.
I think it can be done, my XP computer that runs my database isn't state of the art. -
Creating spatial index on spatial table
Hi there. Just a quick query on creating spatial indexes on spatial tables. I have a table called System_Sessions which has the following four fields and types:
USER_ID NUMBER(10)
SESSION_ID NUMBER(10)
SESSION_BOUNDARY MDSYS.SDO_GEOMETRY (polygon)
START_POINT MDSYS.SDO_GEOMETRY (point)
I am inserting one row per user session into this table. I also need to retrieve the session ids of previous sessions involving a particular user based on the session's start point. The query i am running is an sdo_within_distance query which looks as follows:
Select session_id from joeweaker.system_sessions where user_id = 1003 and SDO_WITHIN_DISTANCE(start_point,
(MDSYS.SDO_GEOMETRY(2001, 8265, MDSYS.SDO_POINT_TYPE
(-105.0,40.0, NULL),NULL, NULL)), 'DISTANCE = 10000')='TRUE';
However I encounter the following error whenever I attempt to execute this query:
ORA-13226: interface not supported without a spatial index
ORA-06512: at "MDSYS.MD", line 1723
ORA-06512: at "MDSYS.MDERR", line 8
ORA-06512: at "MDSYS.SDO_3GL", line 255
I know I haven't built the spatial index on the table so I was hoping that somebody might show me how to do this. Thnaks a lot, JoeThnaks a lot Dan for the prompt reply. I have done as you advised and everything appears to be fine. However I have a second table called Session_Interest_Areas which appears as follows:
USER_ID----NUMBER(10)
SESSION_ID----NUMBER(10)
AREA_ID----NUMBER(10)
AREA_BOUNDARY----MDSYS.SDO_GEOMETRY
I inserted the necessary detail into the user_sdo_geom_metadata table and then attempted to create the index as follows (exactly the same format as my other spatial tables:
create index session_interest_areas_idx on
session_interest_areas (area_boundary)
indextype is mdsys.spatial_index;
When I execute this query I get the following stream of error messages:
ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-13249: internal error in Spatial index: [mdidxrbd]
ORA-13249: Error in Spatial index: index build failed
ORA-13249: Error in spatial index: [mdrcrtxfergm]
ORA-13249: Error in spatial index: [mdpridxtxfergm]
ORA-13200: internal error [ROWID:AAAHocAAJAAAAC8AAA] in spatial indexing.
ORA-13206: internal error [] while creating the spatial index
ORA-13373: Element of type Extent is not supported for Geodetic data
ORA-06512: at "MDSYS.SDO_INDEX_METHOD_9I", line 7
ORA-06512: at line 1
Why does this give me an error when the same approach worked fine for my other spatial tables? Is it something to do with the SRID? Also the index appears to have been created so I presume it has been created incorrectly. Thanks for your time, Joe -
Error dialog when open index dialog on tables with spatial index
Hi all,
When I want to open in the preferences of a table with a spatial index the index dialog, then there appears the following message:
"Index <myIndex> column GEOMETRY, datatype SDO_GEOMETRY is not a valid column type for use in a text index".
I can only click the ok button, but I am not able to modify any of my set index.
Does anyone else have the same problem?
regards markus
Version:
Java: 1.6.0.16
Oracle IDE: 2.1.1.64.39
OS: Linux, Ubuntu 9.10
Edited by: markusin on Mar 3, 2010 12:32 AMI have the same problem on SQLDev 2.1.1 for Windows. I hadn't this problem in 1.5.
I must use a normal sql script to create spatial index.
Vittorio -
Spatial index on table with object-column (and inheritance)
Hi!
Is it possible to create a spatial index on a table with an object-column (and inheritance) like this:
CREATE OR REPLACE TYPE feature_type AS OBJECT (
shape MDSYS.SDO_GEOMETRY
) NOT FINAL;
CREATE OR REPLACE TYPE building_type UNDER feature_type (
name VARCHAR2(50)
CREATE TABLE features ( no NUMBER PRIMARY KEY, feature feature_type);
[...] user_sdo_geom_metadata [...]
Then
CREATE INDEX features_idx ON features(feature.shape) INDEXTYPE IS MDSYS.SPATIAL_INDEX;
throws:
ORA-01418: specified index does not exist
Curious! :)
If I define feature_type with "NOT FINAL" option but without subtypes, I get (create index):
ORA-00604: error occurred at recursive SQL level 1
ORA-01460: unimplemented or unreasonable conversion requested
So I think besides object tables also inheritance isn't supported whith oracle spatial!?
Thanks,
Michael
ps:
We use Oracle9i Enterprise Edition Release 9.0.1.4.0 / Linux.
Solves Oracle9i 9.2 this problems?Hi
You'll need to be on 9.2 to do this....
Dom -
SDO_NN doesn't work though tables are spatially indexed
Hi,
As said Andrew Thomas, the Search function doesn't work today, so I don't know if the answer is already somewhere in the forum.
I' trying to perform a SDO_NN (nearest neighbor) search on a set of tables which are almost identical in structure. I first created a view in order to do 'ordinary' selects on the 'ordinary' columns.
Now I need to code request on spatial columns, with joins based on results from SDO_NN and values from ancillary function SDO_NN_DISTANCE.
As SDO_NN requires its first parameter to be a spatially indexed column and it is not possible to index a view, I create a temporary table on the fly, index it, insert a line into USER_SDO_INDEX_METADATA about this index and then launch my request.
I always get the following error:
ERROR at line 1 :
ORA-13249: SDO_NN cannot be evaluated without using index
ORA-06512: in "MDSYS.MD", ligne 1723
ORA-06512: in "MDSYS.MDERR", ligne 17
ORA-06512: in "MDSYS.PRVT_IDX", ligne 27
I've spent 3 days on it now, reading the manual for clues, adding optimizer hints, and so on.
Here comes the trace of my SQL script (with SET ECHO ON):
===================================================
SQL> @er_ens.sql
SQL>
SQL> DROP TABLE TEMPGEOMDATA ; -- Drop the temp table to be sure
DROP TABLE TEMPGEOMDATA
ERREUR � la ligne 1 :
ORA-00942: Table ou vue inexistante -- It didn't exist
SQL> DROP INDEX TEMPGEOMDATA_IDX ; -- Drop the temp index to be sure
DROP INDEX TEMPGEOMDATA_IDX
ERREUR � la ligne 1 :
ORA-01418: L'index indiqu� n'existe pas -- It didn't exist, either
SQL> DESCRIBE v$_er_ens; -- Display the view structure
Nom NULL ? Type
ADRESSE_NUMERO VARCHAR2(255)
ADRESSE_RUE VARCHAR2(255)
CLEF_DISTANCIER_GLOBAL VARCHAR2(255)
CODE_INSEE VARCHAR2(255)
DATE_CREATION DATE
DATE_MODIFICATION DATE
EFFECTIF_1997_1998 NUMBER
GEOMETRIE MDSYS.SDO_GEOMETRY
ID_FOURNISSEUR VARCHAR2(255)
INCLUS_DANS_LES_YVELINES VARCHAR2(255)
NOM VARCHAR2(255)
OBSERVATIONS_REMARQUES VARCHAR2(255)
RNE VARCHAR2(255)
SOURCE_DONNEES_GRAPHIQUES VARCHAR2(255)
STATUT VARCHAR2(255)
TYPE VARCHAR2(261)
SQL> SELECT Count(*) FROM v$_er_ens; -- Display the number of rows in the view
COUNT(*)
438
SQL> CREATE TABLE TEMPGEOMDATA AS SELECT * from v$_er_ens; -- Create temp table based on view
Table cr��e. -- Created
SQL>
SQL> DESCRIBE TEMPGEOMDATA; -- Display the temp table structure: all the same
Nom NULL ? Type
ADRESSE_NUMERO VARCHAR2(255)
ADRESSE_RUE VARCHAR2(255)
CLEF_DISTANCIER_GLOBAL VARCHAR2(255)
CODE_INSEE VARCHAR2(255)
DATE_CREATION DATE
DATE_MODIFICATION DATE
EFFECTIF_1997_1998 NUMBER
GEOMETRIE MDSYS.SDO_GEOMETRY
ID_FOURNISSEUR VARCHAR2(255)
INCLUS_DANS_LES_YVELINES VARCHAR2(255)
NOM VARCHAR2(255)
OBSERVATIONS_REMARQUES VARCHAR2(255)
RNE VARCHAR2(255)
SOURCE_DONNEES_GRAPHIQUES VARCHAR2(255)
STATUT VARCHAR2(255)
TYPE VARCHAR2(261)
SQL> SELECT Count(*) FROM TEMPGEOMDATA ; -- Display the number of rows in the temp table: the very same
COUNT(*)
438
SQL>
SQL> INSERT INTO -- Insert a new line in SDO_USER_INDEX_METADATA
2 USER_SDO_GEOM_METADATA
3 VALUES (
4 'TEMPGEOMDATA'
5 , 'GEOMETRIE'
6 , MDSYS.SDO_DIM_ARRAY(
7 MDSYS.SDO_DIM_ELEMENT('X', 56957200, 59045500, 0.005)
8 , MDSYS.SDO_DIM_ELEMENT('Y', 242450500, 244324700, 0.005)
9 )
10 , NULL
11 )
12 ;
1 ligne cr��e. -- Line inserted
SQL> SELECT * FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME LIKE 'TEMPGEOMDATA'; -- Check to be sure!
TABLE_NAME COLUMN_NAME DIMINFO SRID
TEMPGEOMDATA GEOMETRIE SDO_DIM_ARRAY(SDO_DIM_ELEMENT('X', 56957 NULL
200, 59045500, ,005), SDO_DIM_ELEMENT('Y
', 242450500, 244324700, ,005))
SQL> CREATE INDEX TEMPGEOMDATA_IDX -- Create the spatial index on temp table
2 ON "TEMPGEOMDATA" ("GEOMETRIE")
3 INDEXTYPE IS MDSYS.SPATIAL_INDEX
4 PARAMETERS (' SDO_INDX_DIMS=2 LAYER_GTYPE="COLLECTION"')
5 ;
Index cr��. -- Index created
SQL> show errors
Pas d'erreur. -- NO errors!
SQL> COMMIT;
Validation effectu�e. -- Commited to be sure!
SQL> SELECT -- Checking that every table involved has a spatial index
2 U.SDO_INDEX_NAME
3 --, A.OWNER
4 --, A.INDEX_TYPE
5 --, A.TABLE_OWNER
6 , A.TABLE_NAME
7 , A.STATUS
8 , A.PARAMETERS
9 --, A.JOIN_INDEX
10 FROM
11 USER_SDO_INDEX_METADATA U,
12 ALL_INDEXES A
13 WHERE
14 ( U.SDO_INDEX_NAME = A.INDEX_NAME )
15 AND (
16 ( A.TABLE_NAME LIKE '%TEMPGEOMDATA%' )
17 OR
18 ( A.TABLE_NAME LIKE '%BATSP_CIS%' )
19 OR
20 ( A.TABLE_NAME LIKE '%ENS%' )
21 )
22 ;
SDO_INDEX_NAME TABLE_NAME STATUS PARAMETERS
BATSP_CIS_SP_IDX BATSP_CIS VALID SDO_INDX_DIMS=2 LAYER_GTYPE="COLLECTION"
ENS_COLLEGE_SP_IDX ENS_COLLEGE VALID SDO_INDX_DIMS=2 LAYER_GTYPE="COLLECTION"
ENS_ECOLEPRIM_SP_IDX ENS_ECOLEPRIM VALID SDO_INDX_DIMS=2 LAYER_GTYPE="COLLECTION"
ENS_LYCEE_SP_IDX ENS_LYCEE VALID SDO_INDX_DIMS=2 LAYER_GTYPE="COLLECTION"
ENS_UIT_SP_IDX ENS_UIT VALID SDO_INDX_DIMS=2 LAYER_GTYPE="COLLECTION"
ENS_UNIV_SP_IDX ENS_UNIV VALID SDO_INDX_DIMS=2 LAYER_GTYPE="COLLECTION"
TEMPGEOMDATA_IDX TEMPGEOMDATA VALID SDO_INDX_DIMS=2 LAYER_GTYPE="COLLECTION"
7 ligne(s) s�lectionn�e(s). -- Yes, they all do (Join table, original tables for the view, temp table from the view)
SQL> SELECT /*+ INDEX(TEMPGEOMDATA TEMPGEOMDATA_IDX) INDEX(BATSP_CIS BATSP_CIS_SP_IDX INDEX LIMADM_COMMUNE LIMADM_COMMUNE_SP_IDX)*/
2 v.nom ENS_NOM
3 , v.adresse_numero -- Spatial request with
4 , v.adresse_rue -- optimizer hints to be sure indexes are used
5 , c.code_insee -- My understanding of manual is that only the
6 , c.nom COM_NOM -- 1st SDO_NN() parameter has to be spatially indexed
7 , b.code_centre -- i.e. alias 'b', table BATSP_CIS
8 , MDSYS.SDO_NN_DISTANCE(1) DIST -- which is the case!
9 FROM
10 --v$_er_ens v
11 TEMPGEOMDATA v
12 , limadm_commune c
13 , batsp_cis b
14 WHERE
15 ( v.code_insee = c.code_insee ) AND
16 ( SDO_NN(b.geometrie, v.geometrie, 'sdo_num_res=1', 1) = 'TRUE' )
17 ;
SELECT /*+ INDEX(TEMPGEOMDATA TEMPGEOMDATA_IDX) INDEX(BATSP_CIS BATSP_CIS_SP_IDX INDEX LIMADM_COMMUNE LIMADM_COMMUNE_SP_IDX)*/
ERREUR � la ligne 1 : -- An error occurs, though!
ORA-13249: SDO_NN cannot be evaluated without using index
ORA-06512: � "MDSYS.MD", ligne 1723
ORA-06512: � "MDSYS.MDERR", ligne 17
ORA-06512: � "MDSYS.PRVT_IDX", ligne 27
SQL> DELETE FROM
2 USER_SDO_GEOM_METADATA
3 WHERE
4 TABLE_NAME = 'TEMPGEOMDATA'
5 ;
1 ligne supprim�e. -- Deleted the line from USER_SDO_INDEX_METADATA, so it did exist!
SQL> DROP INDEX TEMPGEOMDATA_IDX ;
Index supprim�. -- Deleted the temp index, so it did exist!
SQL> DROP TABLE TEMPGEOMDATA ;
Table supprim�e. -- Deleted the temp table, so it did exist!
SQL>
SQL> SET ECHO OFF
SQL>
===================================================
Does anyone have a clue?Hi,
As a general rule, whenever using an operator where the query window comes from a table rather than a constructor, try using the ordered hint and put the table that contains the query window (the second geometry in the operator) first in the from clause. You are right in that the table associated with the first geometry must be indexed. This query might be changed to:
SELECT /*+ ordered */
v.nom ENS_NOM, v.adresse_numero, v.adresse_rue,
c.code_insee , c.nom COM_NOM , b.code_centre,
MDSYS.SDO_NN_DISTANCE(1) DIST
FROM TEMPGEOMDATA v, limadm_commune c, batsp_cis b
WHERE v.code_insee = c.code_insee
AND SDO_NN(b.geometrie, v.geometrie, 'sdo_num_res=1', 1) = 'TRUE' ;
Hope this helps,
Dan -
Performance of insert with spatial index
I'm writing a test that inserts (using OCI) 10,000 2D point geometries (gtype=2001) into a table with a single SDO_GEOMETRY column. I wrote the code doing the insert before setting up the index on the spatial column, thus I was aware of the insert speed (almost instantaneous) without a spatial index (with layer_gtype=POINT), and noticed immediately the performance drop with the index (> 10 seconds).
Here's the raw timing data of 3 runs in each 3 configuration (the clock ticks every 14 or 15 or 16 ms, thus the zero when it completes before the next tick):
truncate execute commit
no spatial index 0.016 0.171 0.016
no spatial index 0.031 0.172 0.000
no spatial index 0.031 0.204 0.000
index (1000 default for batch size) 0.141 10.937 1.547
index (1000 default for batch size) 0.094 11.125 1.531
index (1000 default for batch size) 0.094 10.937 1.610
index SDO_DML_BATCH_SIZE=10000 0.203 11.234 0.359
index SDO_DML_BATCH_SIZE=10000 0.094 10.828 0.344
index SDO_DML_BATCH_SIZE=10000 0.078 10.844 0.359As you can see, I played with SDO_DML_BATCH_SIZE to change the default of 1,000 to 10,000, which does improve the commit speed a bit from 1.5s to 0.35s (pretty good when you only look at these numbers...), but the shocking part of the almost 11s the inserts are now taking, compared to 0.2s without an index: that's a 50x drop in peformance!!!
I've looked at my table in SQL Developer, and it has no triggers associated, although there has to be something to mark the index as dirty so that it updates itself on commit.
So where is coming the huge overhead during the insert???
(by insert I mean the time OCIStmtExecute takes to run the array-bind of 10,000 points. It's exactly the same code with or without an index).
Can anyone explain the 50x insert performance drop?
Any suggestion on how to improve the performance of this scenario?
To provide another data point, creating the index itself on a populated table (with the same 10,000 points) takes less than 1 second, which is consistent with the commit speeds I'm seeing, and thus puzzles me all the more regarding this 10s insert overhead...
SQL> set timing on
SQL> select count(*) from within_point_distance_tab;
COUNT(*)
10000
Elapsed: 00:00:00.01
SQL> CREATE INDEX with6CDF1526$point$idx
2 ON within_point_distance_tab(point)
3 INDEXTYPE IS MDSYS.SPATIAL_INDEX
4 PARAMETERS ('layer_gtype=POINT');
Index created.
Elapsed: 00:00:00.96
SQL> drop index WITH6CDF1526$POINT$IDX force;
Index dropped.
Elapsed: 00:00:00.57
SQL> CREATE INDEX with6CDF1526$point$idx
2 ON within_point_distance_tab(point)
3 INDEXTYPE IS MDSYS.SPATIAL_INDEX
4 PARAMETERS ('layer_gtype=POINT SDO_DML_BATCH_SIZE=10000');
Index created.
Elapsed: 00:00:00.98
SQL>Thanks for your input. We are likely to use partioning down the line, but what you are describing (partition exchange) is currently beyond my abilities in plain SQL, and how this could be accomplished from an OCI client application without affecting other users and keep the transaction boundaries sounds far from trivial. (i.e. can it made transparent to the client application, and does it require privileges the client does have???). I'll have to investigate this further though, and this technique sounds like one accessible to a DBA only, not from a plain client app with non-privileged credentials.
The thing that I fail to understand though, despite your explanation, is why the slow down is not entirely on the commit. After all, documentation for the SDO_DML_BATCH_SIZE parameter of the Spatial index implies that the index is updated on commit only, where new rows are fed 1,000 or 10,000 at a time to the indexing engine, and I do see time being spent during commit, but it's the geometry insert that slow down the most, and that to me looks quite strange.
It's so much slower that it's as if each geometry was indexed one at a time, when I'm doing a single insert with an array bind (i.e. equivalent to a bulk operation in PL/SQL), and if so much time is spend during the insert, then why is any time spent during the commit. In my opinion it's one or the other, but not both. What am I missing? --DD -
Create local spatial index on range sub-partitions?
Is is possible to create a local spatial index on a table with range sub-partitions? We're trying to do this on a table that contains lots of x,y,z point data.
Trying to do so gives me the error: ORA-29846: cannot create a local domain index on a composite partitioned tableAccording to the spatial documentation:The following restrictions apply to spatial index partitioning:
- The partition key for spatial tables must be a scalar value, and must not be a spatial column.
- Only range partitioning is supported on the underlying table. All other kinds of partitioning are not currently
supported for partitioned spatial indexes.So there is nothing saying it can or can't be done. The examples I've seen in the documentation tend to partition based on a single value and don't use subpartitioning.
Example of what we're trying to do:SQL> SELECT * FROM V$VERSION;
BANNER
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
PL/SQL Release 11.1.0.7.0 - Production
CORE 11.1.0.7.0 Production
TNS for 64-bit Windows: Version 11.1.0.7.0 - Production
NLSRTL Version 11.1.0.7.0 - Production
SQL>
SQL> --- Create a table, partioned by X and subpartitioned by Y
SQL> CREATE TABLE sub_partition_test
2 (
3 x NUMBER,
4 y NUMBER,
5 z NUMBER,
6 geometry MDSYS.SDO_GEOMETRY
7 )
8 PARTITION BY RANGE (x)
9 SUBPARTITION BY RANGE (y)
10 (
11 PARTITION p_x100 VALUES LESS THAN (100)
12 (
13 SUBPARTITION sp_x100_y100 VALUES LESS THAN (100),
14 SUBPARTITION sp_x100_y200 VALUES LESS THAN (200),
15 SUBPARTITION sp_x100_yMAXVALUE VALUES LESS THAN (MAXVALUE)
16 ),
17 PARTITION p_x200 VALUES LESS THAN (200)
18 (
19 SUBPARTITION sp_x200_y100 VALUES LESS THAN (100),
20 SUBPARTITION sp_x200_y200 VALUES LESS THAN (200),
21 SUBPARTITION sp_x200_yMAXVALUE VALUES LESS THAN (MAXVALUE)
22 ),
23 PARTITION p_xMAXVALUE VALUES LESS THAN (MAXVALUE)
24 (
25 SUBPARTITION sp_xMAXVALUE_y100 VALUES LESS THAN (100),
26 SUBPARTITION sp_xMAXVALUE_y200 VALUES LESS THAN (200),
27 SUBPARTITION sp_xMAXVALUE_yMAXVALUE VALUES LESS THAN (MAXVALUE)
28 )
29 );
Table created.
SQL>
SQL> -- Insert some sample data
SQL> INSERT INTO sub_partition_test (x, y, z, geometry)
2 VALUES (1, 1, 50, SDO_GEOMETRY(3001, 2157, SDO_POINT_TYPE(1, 1, 50), NULL, NULL));
1 row created.
SQL> INSERT INTO sub_partition_test (x, y, z, geometry)
2 VALUES (50, 150, 50, SDO_GEOMETRY(3001, 2157, SDO_POINT_TYPE(50, 150, 50), NULL, NULL));
1 row created.
SQL> INSERT INTO sub_partition_test (x, y, z, geometry)
2 VALUES (150, 150, 50, SDO_GEOMETRY(3001, 2157, SDO_POINT_TYPE(150, 150, 50), NULL, NULL));
1 row created.
SQL> INSERT INTO sub_partition_test (x, y, z, geometry)
2 VALUES (150, 250, 50, SDO_GEOMETRY(3001, 2157, SDO_POINT_TYPE(150, 250, 50), NULL, NULL));
1 row created.
SQL> INSERT INTO sub_partition_test (x, y, z, geometry)
2 VALUES (150, 300, 50, SDO_GEOMETRY(3001, 2157, SDO_POINT_TYPE(150, 300, 50), NULL, NULL));
1 row created.
SQL> INSERT INTO sub_partition_test (x, y, z, geometry)
2 VALUES (220, 210, 50, SDO_GEOMETRY(3001, 2157, SDO_POINT_TYPE(220, 210, 50), NULL, NULL));
1 row created.
SQL> INSERT INTO sub_partition_test (x, y, z, geometry)
2 VALUES (220, 150, 50, SDO_GEOMETRY(3001, 2157, SDO_POINT_TYPE(220, 150, 50), NULL, NULL));
1 row created.
SQL> INSERT INTO sub_partition_test (x, y, z, geometry)
2 VALUES (220, 250, 50, SDO_GEOMETRY(3001, 2157, SDO_POINT_TYPE(220, 250, 50), NULL, NULL));
1 row created.
SQL> INSERT INTO sub_partition_test (x, y, z, geometry)
2 VALUES (220, 300, 50, SDO_GEOMETRY(3001, 2157, SDO_POINT_TYPE(220, 300, 50), NULL, NULL));
1 row created.
SQL> INSERT INTO sub_partition_test (x, y, z, geometry)
2 VALUES (320, 250, 50, SDO_GEOMETRY(3001, 2157, SDO_POINT_TYPE(320, 250, 50), NULL, NULL));
1 row created.
SQL> INSERT INTO sub_partition_test (x, y, z, geometry)
2 VALUES (320, 160, 50, SDO_GEOMETRY(3001, 2157, SDO_POINT_TYPE(320, 160, 50), NULL, NULL));
1 row created.
SQL> INSERT INTO sub_partition_test (x, y, z, geometry)
2 VALUES (320, 290, 50, SDO_GEOMETRY(3001, 2157, SDO_POINT_TYPE(320, 290, 50), NULL, NULL));
1 row created.
SQL> INSERT INTO sub_partition_test (x, y, z, geometry)
2 VALUES (320, 320, 50, SDO_GEOMETRY(3001, 2157, SDO_POINT_TYPE(320, 320, 50), NULL, NULL));
1 row created.
SQL>
SQL> -- Create some metadata
SQL> DELETE FROM user_sdo_geom_metadata WHERE TABLE_NAME = 'SUB_PARTITION_TEST';
1 row deleted.
SQL> INSERT INTO user_sdo_geom_metadata VALUES ('SUB_PARTITION_TEST','GEOMETRY',
2 SDO_DIM_ARRAY(
3 SDO_DIM_ELEMENT('X', 0, 1000, 0.005),
4 SDO_DIM_ELEMENT('Y', 0, 1000, 0.005)
5 ), 262152);
1 row created.
SQL>
SQL> -- Create an Unusable Local Spatial Index
SQL> CREATE INDEX sub_partition_test_spidx ON sub_partition_test (geometry)
2 INDEXTYPE IS MDSYS.SPATIAL_INDEX
3 LOCAL
4 UNUSABLE;
CREATE INDEX sub_partition_test_spidx ON sub_partition_test (geometry)
ERROR at line 1:
ORA-29846: cannot create a local domain index on a composite partitioned tableThanks,
JohnOk, thanks. That's what we're planning on doing now.
SQL> CREATE TABLE partition_test
2 (
3 x NUMBER,
4 y NUMBER,
5 z NUMBER,
6 geometry MDSYS.SDO_GEOMETRY
7 )
8 PARTITION BY RANGE (x, y)
9 (
10 PARTITION p_x100y100 VALUES LESS THAN (100, 100),
11 PARTITION p_x100y200 VALUES LESS THAN (100, 200),
12 PARTITION p_x100yMAX VALUES LESS THAN (100, MAXVALUE),
13 PARTITION p_x200y100 VALUES LESS THAN (200, 100),
14 PARTITION p_x200y200 VALUES LESS THAN (200, 200),
15 PARTITION p_x200yMAX VALUES LESS THAN (200, MAXVALUE),
16 PARTITION p_x300y100 VALUES LESS THAN (300, 100),
17 PARTITION p_x300y200 VALUES LESS THAN (300, 200),
18 PARTITION p_x300yMAX VALUES LESS THAN (MAXVALUE, MAXVALUE)
19 );
Table created.
SQL>
SQL> INSERT INTO user_sdo_geom_metadata VALUES ('PARTITION_TEST','GEOMETRY',
2 SDO_DIM_ARRAY(
3 SDO_DIM_ELEMENT('X', 0, 1000, 0.005),
4 SDO_DIM_ELEMENT('Y', 0, 1000, 0.005)
5 ), 262152);
1 row created.
SQL> CREATE INDEX partition_test_spidx ON partition_test (geometry)
2 INDEXTYPE IS MDSYS.SPATIAL_INDEX
3 LOCAL
4 UNUSABLE;
Index created.
Maybe you are looking for
-
Beware if you plan to use Drive Genius with SL
After having SL installed now for nearly 2 weeks I decided to take a look at my HD and see if by defraging would speed thing up a bit. I already had Drive Genius (DG) installed when I upgraded to SL so all I had to do was update it to version 2.2.1.
-
How can I get my Mac to detect my wireless printer?
I recently upgraded to yosemite and my Mac no longer recognizes my canon pima printer (wi-fi connection). I deleted the printer on the printer list after I received a connection error with the intention of adding it back and now cannot get my Mac to
-
Left join and where clause with not equal ( ) returns too many rows
Say I have something like this Table A ========= Id OrderNum Date StoreName AddressKey Table B ======== Id StreetNumber City State select a.* from [Table A] a left join [Table B] b on a.AddressKey = b.Id where a.StoreName <> 'Burger place' The troubl
-
If I could redo my answer to that question for my bank account, it would speed up my online banking experience but I do not know how to do that.
-
HI THERE previously i have connected two r/3 systems vai ale/idoc for master data distribution. is the same way to follow for ale config for r/3 to srm. i need to replicate material master from r/3 to srm