How to create index to speed up query on XMLTYPE table
I have a table of XMLTYPE called gary_pass_xml. What kind of index can I create on the table to speed up this query.
SELECT (Extract(Value(FareGroupNodes),'/FareGroup')) FareGroup
FROM GARY_PASS_XML tx,
TABLE(XMLSequence(Extract(Value(tx),'/FareSearchRS/FareGroup'))) FareGroupNodes
WHERE existsnode(value(tx),'/FareSearchRS/FareGroup') = 1
I have a table of XMLTYPE called gary_pass_xml. What kind of index can I create on the table to speed up this query.
SELECT (Extract(Value(FareGroupNodes),'/FareGroup')) FareGroup
FROM GARY_PASS_XML tx,
TABLE(XMLSequence(Extract(Value(tx),'/FareSearchRS/FareGroup'))) FareGroupNodes
WHERE existsnode(value(tx),'/FareSearchRS/FareGroup') = 1
Similar Messages
-
How to create a relational view base on an xmltype table which included sev
Hi,
I am using oracle 11.2.0.1.0.
how to create a relational view base on an xmltype table which content several different .xml files?
Thanks.
for examle:
SQL> SELECT OBJECT_VALUE FROM document;
Edited by: Cow on Jan 6, 2011 7:57 PMFor example I already have these three xml files inserted into the document xmltype table.
These xml files have same schemas. I have attached below.
I want to show all elements/attribute values in xml files to relational view.
Is this possible to create one big relational view to show everything
or I have to create three separate relation views then use UNION to put together? Thanks a lot. Cow
<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="http://www.accessdata.fda.gov/spl/stylesheet/spl.xsl" type="text/xsl"?>
<document xmlns="urn:hl7-org:v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hl7-org:v3 http://localhost:8080/home/DEV/xsd/spl.xsd">
<id root="5ca4e3cb-7298-4948-8cc2-58e71ad32694"/>
</component>
</document>
<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="http://www.accessdata.fda.gov/spl/stylesheet/spl.xsl" type="text/xsl"?>
<document xmlns="urn:hl7-org:v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hl7-org:v3 http://localhost:8080/home/DEV/xsd/spl.xsd">
</component>
</document>
Edited by: Cow on Jan 4, 2011 9:51 AM -
How to create indexes on ODS ?
Hello friends ,
Need some help .
Could any one please let me know how to create indexes on ODS ?
How Indexes are useful on ODS ?
Thanks in advance
RegardsDear Akshay,
Below is the information about indexes and there creation for ODS.
You can search a table for data records that satisfy certain search criteria faster using an index.
An index can be considered a copy of a database table that has been reduced to certain fields. This copy is always in sorted form. Sorting provides faster access to the data records of the table, for example using a binary search. The index also contains a pointer to the corresponding record of the actual table so that the fields not contained in the index can also be read.
The primary index is distinguished from the secondary indexes of a table. The primary index contains the key fields of the table and a pointer to the non-key fields of the table. The primary index is created automatically when the table is created in the database.
You can also create further indexes on a table in the ABAP Dictionary. These are called secondary indexes.Under Indexes, you can create secondary indexes by using the context menu in order to improve the load and query performance of the ODS object This is necessary if the table is frequently accessed in a way that does not take advantage of the sorting of the primary index for the access.
The database system sometimes does not use a suitable index for a selection, even if there is one. The index used depends on the optimizer used for the database system. You should therefore check if the index you created is also used for the selection (see How to Check if an Index is Used).).
Creating an additional index could also have side effects on the performance. This is because an index that was used successfully for selection might not be used any longer by the optimizer if the optimizer estimates (sometimes incorrectly) that the newly created index is more selective.
The indexes on a table should therefore be as disjunct as possible, that is they should contain as few fields in common as possible. If two indexes on a table have a large number of common fields, this could make it more difficult for the optimizer to choose the most selective index.
Leaving content frame.
With Regards,
Prafulla Singh -
How to create a transport request with query and only with its structure.
HI guru,
how to create a transport request with query and only with its structure.transport request should not include any other query items like ( variables, conditions...etc)
thanks in advance.
venkataHi,
Goto RSA1 and then Transport Connection -> In SAP Transports select Object Types-> Query Elements -> Then select Query->Give Technical name of the query and then select for transfer. In the right side you can choose the components which you wanted to transport.
Regards,
anil -
How to create indexes using CREATE TABLE statement
Hi,
Can anyone please tell me how to create indexes using CREATE TABLE staement? This point is part SQL Expert exam (1Z0-047) and please guide me to use which books for this particular exam.
Thanks in advance.Can anyone please tell me how to create indexes using CREATE TABLE staement?e.g. creating a primary key or a unique constraint will generate indexes along with the create table syntax:
SQL> create table t (a integer primary key, b integer unique)
Table created.
SQL> select index_name, index_type, uniqueness
from user_indexes
where table_name = 'T'
INDEX_NAME INDEX_TYPE UNIQUENES
SYS_C0016575 NORMAL UNIQUE
SYS_C0016574 NORMAL UNIQUE
2 rows selected. -
How to create index on Global Temporary Table?
Hi,
Can i create index with storage parameters on global temporary table? If possible, how?
ThanksYes. You can create an index on a global temporary table (GTT) with the regular 'CREATE INDEX' statement.
Not sure though if you are allowed to locate it in a specific tablespace. Why would you want to do that anyway?
My guess is, like the GTT, indexes on GTT's also default to the temporary tablespace. -
How to create snapshot portlet and snapshot query using server API
How to create snapshot portlet and snapshot query using server API
Regards
DheerajHi Sebastian,
I have used the query and it is working fine. but, How could i include the headers of the query also in to the Excel Sheet.
RehaanKhan. M
see the method discussed here
http://sqlblogcasts.com/blogs/madhivanan/archive/2008/10/10/export-to-excel-with-column-names.aspx
Please Mark This As Answer if it solved your issue
Please Vote This As Helpful if it helps to solve your issue
Visakh
My Wiki User Page
My MSDN Page
My Personal Blog
My Facebook Page -
I want information in practical sceario how to create indexes?
hi,
i want complete information about indexes? how create indexes in real time?" Secondary Database
First it must be stated that table design is a more logical work while index design is rather technical. In table design it might make sense to place certain fields (client, company code, ...) in the beginning. In index design, this is not advisable. Very important for an index is that it contains very selective fields in the beginning. Those are fields like object numbers. Not selective are client, company code, ...
Indexes should be small (few fields). The Database optimizer can combine two or more indexes to execute a query.
Indexes of one table should be disjoint (have few common fields), in order not to confuse the optimizer which index to use.
Note that each index slows the inserts into the table down. Updates are only slowed down if indexed fields are updated. In general, heavy inserted tables should have only few indexes while heavy selected tables might have more.
" Creating Secondary Indexes
Procedure
1.In the maintenance screen of the table, choose Indexes.
If indexes already exist on the table, a list of these indexes is displayed. Choose .
2.In the next dialog box, enter the index ID and choose
The maintenance screen for indexes appears.
3.Enter an explanatory text in the field Short text.
You can then use the short text to find the index at a later time, for example with the R/3 Repository Information System.
4.Select the table fields to be included in the index using the input help for the Field name column.
The order of the fields in the index is very important. See What to Keep in Mind for Secondary Indexes.
5.If the values in the index fields already uniquely identify each record of the table, select Unique index.
A unique index is always created in the database at activation because it also has a functional meaning (prevents double entries of the index fields).
6.If it is not a unique index, leave Non-unique index selected.
In this case you can use the radio buttons to define whether the index should be created for all database systems, for selected database systems or not at all in the database.
7.Select for selected database systems if the index should only be created for selected database systems.
Click on the arrow behind the radio buttons. A dialog box appears in which you can define up to 4 database systems with the input help. Select Selection list if the index should only be created on the given database systems. Select Exclusion list if the index should not be created on the given database systems. Choose .
8.Choose activate.
" Result
The secondary index is automatically created in the database during activation if the corresponding table was already created there and index creation was not excluded for the database system.
You can find information about the activation flow in the activation log, which you can call with Utilities ® Activation log. If errors occurred when activating the index, the activation log is automatically displayed.
" How to Check if an Index is Used
Procedure
1.Open a second session and choose System -> Utilities ->Performance trace.
The Trace Requests screen appears.
2.Select Trace on.
The SQL trace is activated for your user, that is all the database operations under your user are recorded.
3.In the first window, perform the action in which the index should be used.
If your database system uses a cost-based optimizer, you should perform this action with as representative data as possible. A cost-based optimizer tries to determine the best index based on the statistics.
4.In the second session, choose Trace off and then Trace list.
Result
The format of the generated output depends on the database system used. You can determine the index that the database used for your action with the EXPLAIN function for the critical statements (PREPARE, OPEN, REPOPEN).
" What to Keep in Mind for Secondary Indexes
How well an existing index supports data selection from a table largely depends on whether the data selected with the index represents the data that will ultimately be selected. This can best be shown using an example.
' Example :
An index is defined on fields FIELD1, FIELD2, FIELD3 and FIELD4 of table BSPTAB in this order. This table is accessed with the SELECT statement:
SELECT * FROM BSPTAB WHERE FIELD1 = X1 AND FIELD2 = X2 AND FIELD4= X4.
Since FIELD3 is not specified more exactly, only the index sorting up to FIELD2 is of any use. If the database system accesses the data using this index, it will quickly find all the records for which FIELD1 = X1 and FIELD2 = X2. You then have to select all the records for which FIELD4 = X4 from this set.
The order of the fields in the index is very important for the accessing speed. The first fields should be those which have constant values for a large number of selections. During selection, an index is only of use up to the first unspecified field.
Only those fields that significantly restrict the set of results in a selection make sense for an index.
Reward points if it is usefull.....
Girish -
How to create index for a column of a view
Hi,
I have created view for a table and then i am trying to create index for a column of that view. i am using the query "CREATE INDEX index_name ON view_name (col)". but Mysql is showing error like "view_name is not a base table".
How can i do that......As mentioned this is a java forum not a mysql forum, but as I know the answer - you can't create an index directly on a view in mysql.
-
How to create index on a single parition
Hi,
I have a table which has got 7 partitons,I want to index only one partition how do it?
i am using oracle 11g.Also i want to know if it is possible to create an index within a o partiotn only fr some values..
Edited by: user8731258 on Jul 13, 2012 12:35 AMHi,
I've been thinking a bit about your requirement.
One way could be to use the fact that index do not "store" nulls.
Let's make a table with data :SQL> create table t
2 (
3 grp integer,
4 id integer,
5 val varchar2(10)
6 )
7 partition by range(grp)
8 (
9 partition p01 values less than (2)
10 ,partition p02 values less than (3)
11 ,partition p03 values less than (4)
12 ,partition pXX values less than (maxvalue)
13 );
Table created.
SQL> insert into t select 1+mod(level,4), level, dbms_random.string('a',10) from dual connect by level <= 200000;
200000 rows created.
SQL> select grp, count(*) cnt from t group by grp order by grp;
GRP CNT
1 50000
2 50000
3 50000
4 50000
SQL> select grp, count(*) cnt from t group by grp order by grp;
GRP CNT
1 50000
2 50000
3 50000
4 50000
SQL> begin
2 dbms_stats.gather_table_stats(
3 ownname => user,
4 tabname => 'T',
5 method_opt => 'for all columns size 1',
6 granularity => 'global and partition',
7 estimate_percent => null);
8 end;
9 /
PL/SQL procedure successfully completed.
SQL> select table_name, partition_name, num_rows from user_tab_partitions where table_name='T' order by partition_name;
TABLE_NAME PARTITION_NAME NUM_ROWS
T P01 50000
T P02 50000
T P03 50000
T PXX 50000Now let's say you only want to index P01.
You could do it as follows :SQL> create index t_idx on t(decode(grp,1,id,null)) local;
Index created.The index would only have IDs from partition P01.
SQL> select INDEX_NAME, PARTITION_NAME, DISTINCT_KEYS
2 from user_ind_partitions
3 where index_name='T_IDX'
4 order by partition_name;
INDEX_NAME PARTITION_NAME DISTINCT_KEYS
T_IDX P01 50000
T_IDX P02 0
T_IDX P03 0
T_IDX PXX 0
SQL> select SEGMENT_NAME, PARTITION_NAME, BYTES
2 from user_segments
3 where SEGMENT_NAME='T_IDX'
4 order by partition_name;
SEGMENT_NAME PARTITION_NAME BYTES
T_IDX P01 1048576
T_IDX P02 65536
T_IDX P03 65536
T_IDX PXX 65536See, only the keys from P01 are here, and only the segment for P01 partition has grown <i>(the 65k segment for the others partitions come from default values of storage clause which I didn't specify)</i>.
Now you can query your table in the following way.
Instead of writing (for P01) : select * from t where grp=1 and id between 30 and 40;If you want to use the index on P01, you would do :SQL> select * from t where grp=1 and decode(grp,1,id,null) between 30 and 40;
GRP ID VAL
1 32 hSrmmTYXXW
1 36 xofKlsxORE
1 40 vazRGnWzWc
Execution Plan
Plan hash value: 1186642050
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
| 0 | SELECT STATEMENT | | 125 | 2375 | 3 (0)| 00:00:01 | | |
| 1 | PARTITION RANGE SINGLE | | 125 | 2375 | 3 (0)| 00:00:01 | 1 | 1 |
|* 2 | TABLE ACCESS BY LOCAL INDEX ROWID| T | 125 | 2375 | 3 (0)| 00:00:01 | 1 | 1 |
|* 3 | INDEX RANGE SCAN | T_IDX | 225 | | 2 (0)| 00:00:01 | 1 | 1 |
Predicate Information (identified by operation id):
2 - filter("GRP"=1)
3 - access(DECODE("GRP",1,"ID",NULL)>=30 AND DECODE("GRP",1,"ID",NULL)<=40)The index is being used.
+(also note that the grp value is "given" twice in the query : once explicitly, the other one within the decode.)+
Now for a query like : SQL> select * from t where grp=2 and id between 30 and 40;
GRP ID VAL
2 33 bhFrCYCiDb
2 37 jnPauHJiyo
Execution Plan
Plan hash value: 2931986080
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
| 0 | SELECT STATEMENT | | 5 | 95 | 68 (0)| 00:00:01 | | |
| 1 | PARTITION RANGE SINGLE| | 5 | 95 | 68 (0)| 00:00:01 | 2 | 2 |
|* 2 | TABLE ACCESS FULL | T | 5 | 95 | 68 (0)| 00:00:01 | 2 | 2 |
Predicate Information (identified by operation id):
2 - filter("ID"<=40 AND "ID">=30 AND "GRP"=2)The optimizer goes for a FULL TABLE (partition) SCAN.
<b>NOTE :</b> That would also work with a global index.
Of course, it remains a rather dirty tweak...
;-) -
How to create index for Telecom large table
Hi ,
I'm working on DB 10G on REHL 5 for telecom company with more than 1 million recorded per day , we need to speed the query result ,
we know there are many types of the INDEX and I'm need a professional advice to create a suitable one ,
many of our queries depend on the MSID ( the MAC address of the Modem ) column ,
Name Null Type
STREAMNUMBER NUMBER(9)
MSID VARCHAR2(20)
USERNAME VARCHAR2(20)
DOMAIN VARCHAR2(20)
USERIP VARCHAR2(16)
CORRELATION_ID VARCHAR2(64)
ACCOUNTREASON NUMBER(3)
STARTTIME VARCHAR2(14)
PRIORTIME VARCHAR2(14)
CURTIME VARCHAR2(14)
SESSIONTIME NUMBER(9)
SESSIONVOLUME NUMBER(9)
.please any help ,really i have 3 queries for the subscriber activity like (usage details , the date of bundle start the the total of the download , he's working out of bundle or not )
and any of the subscribers can check those queries at any time thorw web ,
select nvl(min(substr(a.starttime,1,8)),0) Service_Start_Time, nvl(sum(a.sessionvolume),0) Total_Traffic_KB
FROM aaa_bill a
where msid='84A8E46E929D'
and starttime >=(select max(fee) FROM aaa_bill
where msid='84A8E46E929D' and accountreason=5);and the expected result is
service_start_date totoal_traffic_KB
20120225 440554the MSIDs examples
(84A8E46E7F43,
84A8E46E7A82,
84A8E46E7C84,
84A8E46E7CBF,
also i have this query ,
select
substr(nvl(
(select nvl(starttime,'0') as starttime
from (
select nvl(starttime,0) starttime,sum(sessionvolume) over(partition by msid order by starttime) sum1
from aaa_bill
where msid='84A8E46E90BC' and starttime >=(select max(fee) FROM aaa_bill
where msid='84A8E46E90BC' and accountreason=5))
where sum1>=44987000
and rownum<2)
,0),1,8) Reached_45GB
from dual;and this one ,
select min(to_char(to_date(starttime,'yyyymmddhh24miss'),'yyyy-mm-dd hh24:mi:ss')) "Accounting Start Time",
max(to_char(to_date(curtime,'yyyymmddhh24miss'),'yyyy-mm-dd hh24:mi:ss')) "Accounting Stop Time",sum(sessiontime) Duration1,
TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (sum(sessiontime), 'second'),'hh24:mi:ss') hr,
sum(sessionvolume) Traffic
from aaa_bill
where msid='84A8E46E78EF'
and starttime >=(select max(fee) FROM aaa_bill
where msid='84A8E46E78EF' and accountreason=5)
group by correlation_id
order by min(starttime); -
How to create index on XMLTYPE ordered collection table?
I am using Oracle 11.2.0.2.
Essentially, my XML documents have a 3-level hierarchy:
event
+---action [1:n]
+---- param [1:n]
I am trying to create indexes on ordered collection tables, but can not get the syntax right...
I have created a table with an object-relational XMLType column:
CREATE TABLE T_C_RMP_MNTRNG_XML_FULL_IL4 (
MESSAGE_ID NUMBER(22,0) NOT NULL ENABLE,
XML_EVAL_ID NUMBER(22,0),
VIN7 VARCHAR2(7 BYTE),
FLEET_ID VARCHAR2(50 BYTE),
CSC_SW_VERSION VARCHAR2(100 BYTE),
RECEIVED DATE,
XML_CONTENT SYS.XMLTYPE ,
DWH_LM_TS_UTC DATE NOT NULL ENABLE,
CONSTRAINT PK_C_RMP_MNTRNG_XML_FULL_IL4 PRIMARY KEY (MESSAGE_ID)
) NOLOGGING TABLESPACE CATALOG
VARRAY "XML_CONTENT"."XMLDATA"."action" STORE AS TABLE "T_OR_MON_ACTION" (
NOLOGGING TABLESPACE "CATALOG"
VARRAY "param" STORE AS TABLE "T_OR_MON_ACTION_PARAM" (
NOLOGGING TABLESPACE "CATALOG"
) RETURN AS LOCATOR
) RETURN AS LOCATOR
XMLTYPE XML_CONTENT STORE AS OBJECT RELATIONAL XMLSCHEMA "http://mydomain.com/cs.xsd" ELEMENT "monitoring";
I am running the following SELECT:
SELECT EVENT_ID, ACTION_SUB_ID, MESSAGE_ID, ACTION_TYPE, UNIXTS_TO_DATE(ACTION_TIMESTAMP) ACTION_TIMESTAMP
FROM T_C_RMP_MNTRNG_XML_FULL_IL4,
XMLTABLE(
'for $i1 in /monitoring ,
$i2 in $i1/action
return element r {
$i1/eventId,
$i2
PASSING XML_CONTENT COLUMNS
EVENT_ID VARCHAR(40) PATH 'eventId',
ACTION_SUB_ID INTEGER PATH 'action/actionSubId',
ACTION_TYPE VARCHAR2(100) PATH 'action/type',
ACTION_TIMESTAMP NUMBER(13,0) PATH 'action/time'
) T2
WHERE (
EVENT_ID IS NOT NULL AND ACTION_SUB_ID IS NOT NULL
The explain plan looks like this (sorry, don't know how to get this formatted any "eye-friendlier"):
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 1609K| 6316M| | 6110K (1)| 20:22:11 |
|* 1 | HASH JOIN | | 1609K| 6316M| 111M| 6110K (1)| 20:22:11 |
| 2 | TABLE ACCESS FULL| T_C_RMP_MNTRNG_XML_FULL_IL4 | 582K| 104M| | 5241 (1)| 00:01:03 |
|* 3 | TABLE ACCESS FULL| T_OR_MON_ACTION | 32M| 117G| | 105K (2)| 00:21:08 |
Predicate Information (identified by operation id):
1 - access("NESTED_TABLE_ID"="T_C_RMP_MNTRNG_XML_FULL_IL4"."SYS_NC0001300014$")
filter(CAST(SYS_XQ_UPKXML2SQL(SYS_XQEXVAL(SYS_XQEXTRACT(XMLCONCAT(SYS_XMLGEN("T_C_RMP_MNTRN
G_XML_FULL_IL4"."SYS_NC00017$",NULL,SYS_XMLCONV("T_C_RMP_MNTRNG_XML_FULL_IL4"."SYS_NC00012$",0,32,
'EC1EEF23FD023A27E04032A06D930A8D',3,3783,1)),SYS_MAKEXML('EC1EEF23FD023A27E04032A06D930A8D',3780,
"T_C_RMP_MNTRNG_XML_FULL_IL4"."SYS_NC00008$","SYS_ALIAS_0"."SYS_NC_ROWINFO$")),'/eventId',NULL),0,
0,20971520,0),50,1,2) AS VARCHAR(40) ) IS NOT NULL)
3 - filter(CAST(TO_NUMBER(TO_CHAR("SYS_ALIAS_0"."actionSubId")) AS INTEGER ) IS NOT NULL)
Note
- dynamic sampling used for this statement (level=2)
- Unoptimized XML construct detected (enable XMLOptimizationCheck for more information)
The XML schema looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns:oraxdb="http://xmlns.oracle.com/xdb" oraxdb:storeVarrayAsTable="true" oraxdb:flags="2105639" oraxdb:schemaURL="http://mydomain.com/cs.xsd" oraxdb:schemaOwner="MYUSER" oraxdb:numProps="23">
<xs:element name="monitoring" oraxdb:propNumber="3785" oraxdb:global="true" oraxdb:SQLName="monitoring" oraxdb:SQLType="monitoring755_T" oraxdb:SQLSchema="MYUSER" oraxdb:memType="258" oraxdb:defaultTable="monitoring757_TAB" oraxdb:defaultTableSchema="MYUSER">
<xs:complexType oraxdb:SQLType="monitoring755_T" oraxdb:SQLSchema="MYUSER">
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="action" oraxdb:propNumber="3780" oraxdb:global="false" oraxdb:SQLName="action" oraxdb:SQLType="action752_T" oraxdb:SQLSchema="MYUSER" oraxdb:memType="258" oraxdb:MemInline="false" oraxdb:SQLInline="true" oraxdb:JavaInline="false" oraxdb:SQLCollType="action756_COLL" oraxdb:SQLCollSchema="MYUSER"/>
<xs:element ref="reservationType" oraxdb:propNumber="3781" oraxdb:global="false" oraxdb:SQLName="reservationType" oraxdb:SQLType="VARCHAR2" oraxdb:memType="1" oraxdb:MemInline="false" oraxdb:SQLInline="true" oraxdb:JavaInline="false"/>
<xs:element ref="softwareVersion" oraxdb:propNumber="3782" oraxdb:global="false" oraxdb:SQLName="softwareVersion" oraxdb:SQLType="VARCHAR2" oraxdb:memType="1" oraxdb:MemInline="false" oraxdb:SQLInline="true" oraxdb:JavaInline="false"/>
<xs:element ref="eventId" oraxdb:propNumber="3783" oraxdb:global="false" oraxdb:SQLName="eventId" oraxdb:SQLType="VARCHAR2" oraxdb:memType="1" oraxdb:MemInline="false" oraxdb:SQLInline="true" oraxdb:JavaInline="false"/>
<xs:element ref="vin" oraxdb:propNumber="3784" oraxdb:global="false" oraxdb:SQLName="vin" oraxdb:SQLType="VARCHAR2" oraxdb:memType="1" oraxdb:MemInline="false" oraxdb:SQLInline="true" oraxdb:JavaInline="false"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="action" oraxdb:propNumber="3790" oraxdb:global="true" oraxdb:SQLName="action" oraxdb:SQLType="action752_T" oraxdb:SQLSchema="MYUSER" oraxdb:memType="258" oraxdb:defaultTable="action754_TAB" oraxdb:defaultTableSchema="MYUSER">
<xs:complexType oraxdb:SQLType="action752_T" oraxdb:SQLSchema="MYUSER">
<xs:sequence>
<xs:element ref="type" oraxdb:propNumber="3786" oraxdb:global="false" oraxdb:SQLName="type" oraxdb:SQLType="VARCHAR2" oraxdb:memType="1" oraxdb:MemInline="false" oraxdb:SQLInline="true" oraxdb:JavaInline="false"/>
<xs:element maxOccurs="unbounded" ref="param" oraxdb:propNumber="3787" oraxdb:global="false" oraxdb:SQLName="param" oraxdb:SQLType="param749_T" oraxdb:SQLSchema="MYUSER" oraxdb:memType="258" oraxdb:MemInline="false" oraxdb:SQLInline="true" oraxdb:JavaInline="false" oraxdb:SQLCollType="param753_COLL" oraxdb:SQLCollSchema="MYUSER"/>
<xs:element ref="actionSubId" oraxdb:propNumber="3788" oraxdb:global="false" oraxdb:SQLName="actionSubId" oraxdb:SQLType="NUMBER" oraxdb:memType="2" oraxdb:MemInline="false" oraxdb:SQLInline="true" oraxdb:JavaInline="false"/>
<xs:element ref="time" oraxdb:propNumber="3789" oraxdb:global="false" oraxdb:SQLName="time" oraxdb:SQLType="NUMBER" oraxdb:memType="2" oraxdb:MemInline="false" oraxdb:SQLInline="true" oraxdb:JavaInline="false"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="type" type="xs:string" oraxdb:propNumber="3791" oraxdb:global="true" oraxdb:SQLName="type" oraxdb:SQLType="VARCHAR2" oraxdb:memType="1" oraxdb:defaultTable="type751_TAB" oraxdb:defaultTableSchema="MYUSER"/>
<xs:element name="param" oraxdb:propNumber="3794" oraxdb:global="true" oraxdb:SQLName="param" oraxdb:SQLType="param749_T" oraxdb:SQLSchema="MYUSER" oraxdb:memType="258" oraxdb:defaultTable="param750_TAB" oraxdb:defaultTableSchema="MYUSER">
<xs:complexType oraxdb:SQLType="param749_T" oraxdb:SQLSchema="MYUSER">
<xs:sequence>
<xs:element minOccurs="0" ref="value" oraxdb:propNumber="3792" oraxdb:global="false" oraxdb:SQLName="value" oraxdb:SQLType="VARCHAR2" oraxdb:memType="1" oraxdb:MemInline="false" oraxdb:SQLInline="true" oraxdb:JavaInline="false"/>
<xs:element ref="key" oraxdb:propNumber="3793" oraxdb:global="false" oraxdb:SQLName="key" oraxdb:SQLType="VARCHAR2" oraxdb:memType="1" oraxdb:MemInline="false" oraxdb:SQLInline="true" oraxdb:JavaInline="false"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="value" type="xs:string" oraxdb:propNumber="3795" oraxdb:global="true" oraxdb:SQLName="value" oraxdb:SQLType="VARCHAR2" oraxdb:memType="1" oraxdb:defaultTable="value748_TAB" oraxdb:defaultTableSchema="MYUSER"/>
<xs:element name="key" type="xs:string" oraxdb:propNumber="3796" oraxdb:global="true" oraxdb:SQLName="key" oraxdb:SQLType="VARCHAR2" oraxdb:memType="1" oraxdb:defaultTable="key747_TAB" oraxdb:defaultTableSchema="MYUSER"/>
<xs:element name="actionSubId" type="xs:integer" oraxdb:propNumber="3797" oraxdb:global="true" oraxdb:SQLName="actionSubId" oraxdb:SQLType="NUMBER" oraxdb:memType="2" oraxdb:defaultTable="actionSubId746_TAB" oraxdb:defaultTableSchema="MYUSER"/>
<xs:element name="time" type="xs:integer" oraxdb:propNumber="3798" oraxdb:global="true" oraxdb:SQLName="time" oraxdb:SQLType="NUMBER" oraxdb:memType="2" oraxdb:defaultTable="time745_TAB" oraxdb:defaultTableSchema="MYUSER"/>
<xs:element name="reservationType" type="xs:string" oraxdb:propNumber="3799" oraxdb:global="true" oraxdb:SQLName="reservationType" oraxdb:SQLType="VARCHAR2" oraxdb:memType="1" oraxdb:defaultTable="reservationType744_TAB" oraxdb:defaultTableSchema="MYUSER"/>
<xs:element name="softwareVersion" type="xs:string" oraxdb:propNumber="3800" oraxdb:global="true" oraxdb:SQLName="softwareVersion" oraxdb:SQLType="VARCHAR2" oraxdb:memType="1" oraxdb:defaultTable="softwareVersion743_TAB" oraxdb:defaultTableSchema="MYUSER"/>
<xs:element name="eventId" type="xs:string" oraxdb:propNumber="3801" oraxdb:global="true" oraxdb:SQLName="eventId" oraxdb:SQLType="VARCHAR2" oraxdb:memType="1" oraxdb:defaultTable="eventId742_TAB" oraxdb:defaultTableSchema="MYUSER"/>
<xs:element name="vin" type="xs:string" oraxdb:propNumber="3802" oraxdb:global="true" oraxdb:SQLName="vin" oraxdb:SQLType="VARCHAR2" oraxdb:memType="1" oraxdb:defaultTable="vin741_TAB" oraxdb:defaultTableSchema="MYUSER"/>
</xs:schema>
How can I create an index on these ordered collection tables in order to improve performance?
I found the example at http://docs.oracle.com/cd/E11882_01/appdev.112/e23094/xdb_rewrite.htm#ADXDB5859 but am not able to apply it to this particular case...
Thank you in advance...If the schema is not annotated then xs:integer and xs:string are mapped to NUMBER and VARCHAR2(4000) datatypes, so you have to use those in your query in order to avoid unnecessary typecasting operations.
You should also use chained XMLTABLEs when accessing a parent/child relationship instead of a FLWOR expression, otherwise the CBO may not rewrite the XQuery correctly (maybe it's fixed in the latest release).
If you make those changes, the plan should show cleaner predicates :
SQL> SELECT EVENT_ID, ACTION_SUB_ID, MESSAGE_ID, ACTION_TYPE, ACTION_TIMESTAMP
2 FROM test_table,
3 XMLTABLE('/monitoring'
4 PASSING XML_CONTENT COLUMNS
5 EVENT_ID VARCHAR2(4000) PATH 'eventId',
6 actions XMLTYPE PATH 'action'
7 ) T1,
8 XMLTABLE('/action'
9 PASSING actions COLUMNS
10 ACTION_SUB_ID NUMBER PATH 'actionSubId',
11 ACTION_TYPE VARCHAR2(4000) PATH 'type',
12 ACTION_TIMESTAMP NUMBER PATH 'time'
13 ) T2
14 WHERE EVENT_ID IS NOT NULL
15 AND ACTION_SUB_ID IS NOT NULL
16 ;
Execution Plan
Plan hash value: 1763884463
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 109 | 220K| 6 (17)| 00:00:01 |
| 1 | MERGE JOIN | | 109 | 220K| 6 (17)| 00:00:01 |
|* 2 | TABLE ACCESS BY INDEX ROWID| TEST_TABLE | 11 | 352 | 2 (0)| 00:00:01 |
| 3 | INDEX FULL SCAN | SYS_C007567 | 11 | | 1 (0)| 00:00:01 |
|* 4 | SORT JOIN | | 109 | 216K| 4 (25)| 00:00:01 |
|* 5 | TABLE ACCESS FULL | T_OR_MON_ACTION | 109 | 216K| 3 (0)| 00:00:01 |
Predicate Information (identified by operation id):
2 - filter("TEST_TABLE"."SYS_NC00012$" IS NOT NULL)
4 - access("SYS_ALIAS_0"."NESTED_TABLE_ID"="TEST_TABLE"."SYS_NC0000800009$")
filter("SYS_ALIAS_0"."NESTED_TABLE_ID"="TEST_TABLE"."SYS_NC0000800009$")
5 - filter("SYS_ALIAS_0"."actionSubId" IS NOT NULL)
Note
- dynamic sampling used for this statement (level=2)
Now, if still necessary, it all boils down to choosing a technique to index NULL values :
- composite index with a not null or constant column
- FBI
- bitmap
Pick one that best fits your data, selectivity and activity on the tables. -
How to create index on xmtype column
Hi,
I have a table as follows
CREATE TABLE T_TEST_XML (PROCESS_ID NUMBER, TXT_XML XMLTYPE);
I query the above table very frequently with the query
SELECT * FROM T_TEST_XML TXS WHERE EXISTSNODE(TXS.TXT_XML, '/order[status="PEN"]') = 1
How to create function based index on the TXT_XML column for the xpath expression /order[status="PEN"]' to improve the query performance?
Thank youActually if you are limited to using older software
1. Consider defining an XML Schema and storing the XML using object relational storage.
or
2. If you must store the XML as CLOB create the index on extractValue(), rather than existsNode() and supply the predicate value at the SQL level rather than the XPATH level.
SQL> DROP TABLE T_TEST_XML
2 /
Table dropped.
SQL> CREATE TABLE T_TEST_XML (PROCESS_ID NUMBER, TXT_XML XMLTYPE)
2 /
Table created.
SQL> create INDEX T_TEXT_XML_IDX on T_TEST_XML( extractValue(TXT_XML,'/order/status'))
2 /
Index created.
SQL> set autotrace on explain
SQL> --
SQL> SELECT *
2 FROM T_TEST_XML TXS
3 WHERE ExistsNode(TXT_XML,'/order[status="PEN"]') = 1
4 /
no rows selected
Execution Plan
Plan hash value: 3001212210
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 1 | 2017 | 31 (0)| 00:00:01 |
| 1 | NESTED LOOPS SEMI | | 1 | 2017 | 31 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| T_TEST_XML | 1 | 2015 | 2 (0)| 00:00:01 |
|* 3 | XPATH EVALUATION | | | | | |
Predicate Information (identified by operation id):
3 - filter("P"."C_01$"='PEN')
Note
- dynamic sampling used for this statement (level=2)
SQL> SELECT *
2 FROM T_TEST_XML TXS
3 WHERE extractValue(TXT_XML,'/order/status') = 'PEN'
4 /
no rows selected
Execution Plan
Plan hash value: 1430727070
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 1 | 2015 | 1 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T_TEST_XML | 1 | 2015 | 1 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | T_TEXT_XML_IDX | 1 | | 1 (0)| 00:00:01 |
Predicate Information (identified by operation id):
2 - access(EXTRACTVALUE(SYS_MAKEXML(0,"SYS_NC00003$"),'/order/status',null,0,0,5242
93,133120)='PEN')
Note
- dynamic sampling used for this statement (level=2)
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>This allows the index to support querying on any value of status, rather than just PEN -
How to create index for particular table in R3
Hi
My load is taking too much time and it leads to process over due error. Does creating indexes on table in r3 side will solve this issue? If so how can we find out on which table does this particular data source depend. I went to maintain extract structure and findout only one table is supplying data for this data source.
Is there any other factors depend to solve this.
Thanks
kkHi,
it will depend on the table.... Having an index created will speed up the loading but slow down the insert therefore slowing some process perhaps...
May I ask which table it is? And which fields would you need to index?
Are you sure that bottleneck is located in R/3? Analyze your loading time in the monitor and see if this is really the case.
Otherwise you can create index for a table in Tx SE11; first check if an index is not already created...
hope this helps,
Olivier. -
How to create index not unique at the time of the CREATE TABLE
Hi,
I am trying to find out how in Oracle create secondary indexes that can accept duplicated into the CREATE TABLE statement, without have to execute a CREATE INDEX separately.
As far I can see the only syntax accepted by Oracle 9i to create more than one index at the time of the table creation is:
CREATE TABLE test_tab (x INTEGER, y INTEGER, z INTEGER PRIMARY KEY(x,y), UNIQUE(z))
But, in my case I need to have the unicity only for the primary key, but not for the second index, that I would like to have not unique.
How to do that inside of the CREATE TABLE statement?
Any help?
Thanks a lot in advance.To create an index automatically (not constraint related) , you will need to have an 'event' trigger on the schema that will (IE: detecting a table create/drop matching ARCHIVE_%) , generate the appropriate SQL required (create index sql) and pass THAT to a DBMS_JOB.
Make sure you have job queue's enabled.
This was the ONLY way that I could re-create a view automatically as new tables were created that matched a criteria IE ARCHIVE_JAN06, ARCHIVE_FEB06 etc.
The application's "archiving" method created and was thus aware of these tables and permitted searching within 'archived' data, but 3rd party reporting applications needed to see a view encompassing all data, regardless of the tables involved. The view automatically created was a 'union_all' of all tables concerned.
Maybe you are looking for
-
How to create a table with more tan 20 columns
I created a A4 landscape document to make a calendar for the next year. To add the date information I need to insert a table with 32 columns (name of month + 31 days). It should be possible to create a table with a over all width of 29.7 cm (consisti
-
Iframe has a problem in displaying the content of the source in iframe
iframe displaying a RSS feed from an XML file so on subscribing to RSS, iframe goes blank and does not render any kind of control. Inspite of this, control comes for the bookmark. This functionality is working fine with all the versions of IE. but am
-
Hello, I have an question -- why the firefox do not sync group tabs on my devices?
Sorry, my English is not good, but this problem is so important and I decided write about it. In my settings, in section "Synchronization" I did not seen the checkbox which may let me synchronize my group tabs. It's so bad, because I have more groups
-
BW Source system plugin upgrade
Hi, We are in a process of ungrading PI_BASIS component from 2004 to 2005 and I need to know if there is anything to be done on the deltas before it. we have all sort of logistics applications like SD, PO etc. and we dont want to lose any records.
-
Ipad 1 doesnt import my photos in iphoto, seems stuck
Got some 500 pictures (5.7 GB) on my Ipad-and left it running for one night... Still see no advance in the process of iphoto import... am I just impatient or is the process frozen somehow? The button "import all" and import selected are grey... but I