Optimizing query against Dictionary views
I have some tables which contain varray of objects. I need a quick way to get a list of the attributes of each of those objects, and the data types they are.
I came up with this query. It runs in 16 seconds in my database for a table with 2 varrays, each of an object with 2 attributes (4 rows returned). In the PL/SQL program needing this info, I have implemented a 3 cursors manual nested loop version of this that runs in sub-second.
Just curious for curiosity's sake if anybody had any tips on how to speed the single query version?
select
dtc.owner table_owner
,dtc.table_name table_name
,dtc.column_name column_name
,dtc.data_type varray_type
,dct.elem_type_owner varray_element_owner
,dct.elem_type_name varray_element_type
,dct.upper_bound max_element_count
,dta.attr_name attribute_name
,dta.attr_type_name
from all_tab_columns dtc
,all_coll_types dct
,all_type_attrs dta
where dtc.owner = :OWNER
and dtc.table_name = :TABLE_NAME
and dtc.data_type_owner is not null
and dtc.data_type_owner = dct.owner
and dtc.data_type = dct.type_name
and dct.elem_type_owner = dta.owner
and dct.elem_type_name = dta.type_name;
1. You can check if your current optimizer setting affects this query: Just set for your particular session the "optimizer_features_enable" back to the default "10.2.0.4" using ALTER SESSION or use the "OPTIMIZER_FEATURES_ENABLE('10.2.0.4')" hint (undocumented, so better use the ALTER SESSION command) as part of your statement to check if the execution is any different.
2. Are you aware of any other optimizer related parameters that are set to non-default values?
3. Can you check in the DBA_SCHEDULER_JOBS view if the GATHER_STATS_JOB is ENABLED and the LAST_START_DATE of the job?
4. Sometimes you can help the optimizer by providing more information, although in this case it's a bit inaccurate, because the TYPE owner might of course be different from the table owner:
select
dtc.owner table_owner
,dtc.table_name table_name
,dtc.column_name column_name
,dtc.data_type varray_type
,dct.elem_type_owner varray_element_owner
,dct.elem_type_name varray_element_type
,dct.upper_bound max_element_count
,dta.attr_name attribute_name
,dta.attr_type_name
from all_tab_columns dtc
,all_coll_types dct
,all_type_attrs dta
where dtc.owner = :OWNER
and dtc.table_name = :TABLE_NAME
and dtc.data_type_owner is not null
and dtc.data_type_owner = dct.owner
and dct.owner = :OWNER
and dtc.data_type = dct.type_name
and dct.elem_type_owner = dta.owner
and dta.owner = :OWNER
and dct.elem_type_name = dta.type_name;As already mentioned, this is only applicable if the owner is the same for all the objects. You could also try to omit the join on the owner and use only the bind variables as shown.
5. Can you post your "tuning" attempt? I assume you tried to use the WITH-clause and the (undocumented) MATERIALIZE hint to materialize a part of the query?
6. Are you aware of any unusual high number of dictionary objects in your database, e.g. thousands of tables, types, synonyms etc. that might lead to partially large SYS base tables, like SYS.OBJ$?
Regards,
Randolf
Oracle related stuff blog:
http://oracle-randolf.blogspot.com/
SQLTools++ for Oracle (Open source Oracle GUI for Windows):
http://www.sqltools-plusplus.org:7676/
http://sourceforge.net/projects/sqlt-pp/
Similar Messages
-
Query against materialized view from stored procedure brings back empty row
I have a stored procedure that runs a query against a materialized view. When I run the query outside the SP it works just fine. When I change the MV to a table name, the SP works. When I change it back to the MV i get an empty row. Any ideas? The code is below:
PROCEDURE getAuth (p_naid IN NUMBER,
p_scope IN VARCHAR2,
o_xml_data OUT SYS_REFCURSOR
) IS
BEGIN
IF p_scope = 'Approved' THEN
OPEN o_xml_data FOR
SELECT naid,
p_naid,
auth_type,
xml_data
FROM some_mv
WHERE naid = p_naid;
RETURN;
CLOSE o_xml_data;
... the rest of the procedure ...does procedure contain EXCEPTION handler?
if so, then remove, delete & eliminate EXCEPTION handler (at least during testing & debugging) -
Query against materialized view awful after refresh of Mview
We have a materialized view defined to refresh complete daily at 5am. YOu can run queries against the MV alone or joining it to other tables. Results come back in 2 or 3 seconds. Once the MView refreshes at 5am - those same queries now take 15 minutes or even more sometimes to complete. WHY IS THIS HAPPENING?? Help anyone?
okay this is better... sorry...
this is the GOOD EXPLAIN PLAN:
PLAN_TABLE_OUTPUT
| Id | Operation | Name | Rows | Bytes | Cost |
| 0 | SELECT STATEMENT | | 1 | 127 | 1665 |
| 1 | SORT AGGREGATE | | 1 | 127 | |
| 2 | NESTED LOOPS | | 1 | 127 | 1665 |
| 3 | NESTED LOOPS | | 1 | 113 | 1664 |
| 4 | NESTED LOOPS | | 1 | 99 | 1663 |
| 5 | NESTED LOOPS | | 1 | 88 | 1662 |
|* 6 | HASH JOIN ANTI | | 1 | 70 | 1661 |
|* 7 | TABLE ACCESS BY INDEX ROWID| CONTACT | 3815 | 201K| 1534 |
| 8 | AND-EQUAL | | | | |
|* 9 | INDEX RANGE SCAN | IDX_CNT__C_STATE | | | |
|* 10 | INDEX RANGE SCAN | IDX_CNT__STATUS | | | |
| 11 | INDEX FAST FULL SCAN | PK_RPP | 69277 | 1082K| 120 |
|* 12 | TABLE ACCESS BY INDEX ROWID | REP_PROFILE | 1 | 18 | 1 |
|* 13 | INDEX UNIQUE SCAN | PK_C19 | 1 | | |
|* 14 | INDEX UNIQUE SCAN | PK_B01 | 1 | 11 | |
|* 15 | INDEX UNIQUE SCAN | PK_B02 | 1 | 14 | |
|* 16 | INDEX UNIQUE SCAN | PK_RCN | 1 | 14 | |
Predicate Information (identified by operation id):
6 - access("B"."CONTACT_ID"="RPP"."PARTNERSHIP_ID")
7 - filter("B"."C_STATE"='GA' AND "B"."C_LAST"<>'Name Unknown' AND
"B"."STATUS"='Confirmed')
9 - access("B"."C_STATE"='GA')
10 - access("B"."STATUS"='Confirmed')
12 - filter("C19"."TERR1"='46')
13 - access("B"."CONTACT_ID"="C19"."CONTACT_ID")
14 - access("B"."FIRM_ID"="B01"."FIRM_ID")
15 - access("B"."OFFICE_ID"="B02"."OFFICE_ID")
16 - access("B"."CONTACT_ID"="RCN"."CONTACT_ID")
Note: cpu costing is off
38 rows selected. -
Sdo_filter fail when query against a spatial view in different schema
We have a table with X,Y coordinates and would like to run spatial query against it. We do not want to change the table structure, so we opt to use a function based index. USER_SDO_GEOM_METADATA is updated and index is built. Then we created a view with spatial column from the table. Everything works fine with the user who owns the table and view.
When we try to run a spatial query against the view from a different user, it failed with error. However, if we substitute the select from my_view* with the actual SQL statement that created the view, it works. So it looks like Oracle refuse to acknowledge the spatial index if accessed via view. Here is some simplified scripts:
--- connect as USER1.
--update meta data
INSERT INTO USER_SDO_GEOM_METADATA ( TABLE_NAME, COLUMN_NAME, DIMINFO, SRID ) VALUES
('LOCATIONS', 'MDSYS.SDO_GEOMETRY(2001,2264,SDO_POINT_TYPE(NVL(X_COORD,0),NVL(Y_COORD,0),NULL),NULL,NULL)',
SDO_DIM_ARRAY( SDO_DIM_ELEMENT('X', 1300000, 1600000, 1), SDO_DIM_ELEMENT('Y', 400000, 700000, 1) ), 2264 );
--created index
CREATE INDEX LOCA_XYGEOM_IDX ON LOCATIONS
( SDO_GEOMETRY(2001,2264,SDO_POINT_TYPE(NVL(X_COORD,0),NVL(Y_COORD,0),NULL),NULL,NULL)
) INDEXTYPE IS MDSYS.SPATIAL_INDEX;
--create view
CREATE VIEW USER1.MY_VIEW AS SELECT ID ,X_COORD,Y_COORD, SDO_GEOMETRY(2001,2264,SDO_POINT_TYPE(NVL(X_COORD,0),NVL(Y_COORD,0),NULL),NULL,NULL) SHAPE
FROM USER1.LOCATIONS WHERE X_COORD>0 AND Y_COORD>0;
-- run spatial query from view, works fine by user1 by failed on user2.
SELECT SHAPE FROM (
SELECT * FROM USER1.MY_VIEW
) a WHERE sdo_filter (shape, sdo_geometry ('POLYGON ((1447000 540000, 1453000 540000, 1453000 545000, 1447000 545000, 1447000 540000))', 2264), 'querytype=window') = 'TRUE';
-- run spatial query from table directly, simply replace the view with actual statements that created the view. works fine by user1 AND user2.
SELECT SHAPE FROM (
SELECT ID ,X_COORD,Y_COORD, SDO_GEOMETRY(2001,2264,SDO_POINT_TYPE(NVL(X_COORD,0),NVL(Y_COORD,0),NULL),NULL,NULL) SHAPE
FROM USER1.LOCATIONS WHERE X_COORD>0 AND Y_COORD>0
) a WHERE sdo_filter (shape, sdo_geometry ('POLYGON ((1447000 540000, 1453000 540000, 1453000 545000, 1447000 545000, 1447000 540000))', 2264), 'querytype=window') = 'TRUE';
When run against the view by user2, the error is:
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 1173
13226. 00000 - "interface not supported without a spatial index"
*Cause: The geometry table does not have a spatial index.
*Action: Verify that the geometry table referenced in the spatial operator
has a spatial index on it.
Note, the SELECT SHAPE FROM (****) A WHERE SDO_FILTER(....) syntax is a third party application, all we have control is the part inside "(select ...)".
So it appears Oracle is treating view differently. Have attempted fake the view name into USER_SDO_GEOM_METADATA, did not work. Also, granted select on the index table to user2, did not work.
if we re-created the view in user2 schema, it worked for user2 but not user1, so it's not something we can do for every user.
Searched the forum, no good match found. A few posts talked about "union all" in view caused the problem but I do not have the union.
We are only use Oracle 10g Locator, not full spatial edition.
Any ideas?
Thanks!
Edited by: liu.284 on Oct 4, 2011 12:08 PMIt seems a bug, where a function-based spatial index is not correctly handled in a view query transformation.
Not sure if the following works for you or not.
add a new column "shape" (mdsys.sdo_geometry) in table locations, use a trigger and x_coord/y_coord
to set values for this new column, and just create a normal spatial index on this new column. (drop the
function-based spatial index). And create a view like:
CREATE VIEW USER1.MY_VIEW2 AS SELECT ID , X_COORD, Y_COORD, SHAPE
FROM USER1.LOCATIONS WHERE X_COORD>0 AND Y_COORD>0; -
Why do i get ORA-03113 when doing a spatial query against union all view?
Hi, i created the following view
CREATE OR REPLACE FORCE VIEW cola_markets_v
AS
(SELECT mkt_id, NAME, shape shape_a, NULL shape_b, NULL shape_c,
NULL shape_d
FROM COLA_MARKETS
WHERE NAME = 'cola_a')
UNION ALL
(SELECT mkt_id, NAME, NULL shape_a, shape shape_b, NULL shape_c,
NULL shape_d
FROM COLA_MARKETS
WHERE NAME = 'cola_b')
UNION ALL
(SELECT mkt_id, NAME, NULL shape_a, NULL shape_b, shape shape_c,
NULL shape_d
FROM COLA_MARKETS
WHERE NAME = 'cola_c')
UNION ALL
(SELECT mkt_id, NAME, NULL shape_a, NULL shape_b, NULL shape_c,
shape shape_d
FROM COLA_MARKETS
WHERE NAME = 'cola_d');added the necessary entries in USER_SDO_GEOM_METADATA and created a spatial index on COLA_MARKETS (SHAPE). However, when i do a spatial query against this view, i get ORA-03113. A spatial query against the base table works fine. Any ideas why this happens? (This is Oracle 10.2.0.3.0)
Thanks in advance, Markus
PS: This is my spatial query
SELECT *
FROM cola_markets_v t
WHERE sdo_filter (t.shape_a,
SDO_GEOMETRY (2003,
NULL,
NULL,
sdo_elem_info_array (1, 1003, 3),
sdo_ordinate_array (1, 1, 2, 2)
'querytype=window'
) = 'TRUE';Thank you for your reply. I have tried it with 11.1.0.6.0 today and it works. This might be an issue with 10.2.0.3.0.
-
I'm using SQL Server 2008 R2 (10.50.4033) and I'm troubleshooting an issue that a select query against a specific view is taking more than 30 seconds consistently. The issue just starts happening this week and there is no mass changes in data.
The problem only occur if the query is issued from an IIS application but not from SSMS. One thing I noticed is that sys.dm_exec_cached_plans is returning 2 Parse Tree rows for the view - one created when the select query is issued
1st time from the IIS application and another one created when the same select query is issued 1st time from SSMS. The usecounts of the Parse Tree row for the view (the IIS one) is increasing whenever the select query is issued. The
usecounts of the Parse Tree row for the view (the SSMS one) does not increase when the select query is issued again.
There seems to be a correlation between the slowness of the query and the increasing of the usecounts of the Parse Tree row for the view.
I don't know why there is 2 Parse Tree rows for the view. There is also 2 Compiled Plan rows for the select query.
What does the Parse Tree row mean especially the usecounts column?>> The issue just starts happening this week and there is no mass changes in data.
There might be a mass changes in the execution plan for several reason without mass changes in data
If you have the old version and a way to check the old execution plan, and compare to the new one, that this should be your starting point. In most cases you don't have this option and we need to monitor from scratch.
>> The problem only occur if the query is issued from an IIS application but not from SSMS.
This mean that we know exactly what is the different and you can compare both execution plan. once you do it, you will find that they are no the same. But this is very common issue and we can know that it is a result of different SETting while connecting
from different application. SSMS is an external app like any app that you develop in Visual studio but the SSMS dose not use the Dot.Net default options.
Please check this link, to find the full explanation and solutions:
http://www.sommarskog.se/query-plan-mysteries.html
Take a look at sys.dm_exec_sessions for your ASP.Net application and for your SSMS session.
If you need more specific help, then we need more information and less stories :-)
We need to see the DDL+DML+Query and both execution plans
>> What does the Parse Tree row mean
I am not sure what you mean but the parse tree represents the logical steps necessary to execute the query that has been requested. you can check this tutorial about the execution plan: https://www.simple-talk.com/sql/performance/execution-plan-basics/ or
this one: http://www.developer.com/db/understanding-a-sql-server-query-execution-plan.html
>> regarding the usecount column or any other column check this link:
https://msdn.microsoft.com/en-us/library/ms187404.aspx?f=255&MSPPError=-2147217396.
Ronen Ariely
[Personal Site] [Blog] [Facebook] -
After posting something here a few days back about the myriad views needing to be digested for the Fund.I Exam, I have just gleaned this lot from the Couchman book. No doubt some of the pros out there may well correct me, but this is simple what I have collected from the book, in the last 3 hours. Cheers.
Dictionary Views
Data Dictionary
Which users are in the database password file:
V$PWFILE_USERS
Where values set in the init.ora file can be viewed – all parameters:
V$PARAMETER
Script used to create the objects that comprise the data dictionary:
catalog.sql
To grant a special role to users so they can look at DBA views:
SELECT_CATALOG_ROLE
Information about all database objects in the database:
DBA_OBJECTS
Information about all tables in the database:
DBA_TABLES
Information about all indexes in the database:
DBA_INDEXES
Information about all views (including dictionary views) in the database:
DBA_VIEWS
Information about all sequences in the database:
DBA_SEQUENCES
Information about all users in the database:
DBA_USERS
Information about all constraints in the database:
DBA_CONSTRAINTS
Information about all table columns that have constraints on them:
DBA_CONS_COLUMNS
Information about all columns that have indexes on them in the database:
DBA_IND_COLUMNS
Information about all columns in all the tables in the database:
DBA_TAB_COLUMNS
Information about all the roles in the database:
DBA_ROLES
Information about all object privileges in the database:
DBA_TAB_PRIVS
Information about all system privileges granted to all users in the database:
DBA_SYS_PRIVS
Displays all PL/SQL source code in the database:
DBA_SOURCE
Information about all triggers in the database:
DBA_TRIGGERS
Information about object privileges granted to roles
ROLE_TAB_PRIVS
Information about system privileges granted to roles
ROLE_SYS_PRIVS
Information about roles granted to roles
ROLE_ROLE_PRIVS
Information about all tablespaces in the database:
DBA_TABLESPACES
Information about all profiles in the database:
DBA_PROFILES
For all parameters?
V$PARAMETER
General information about the database mounted to your instance:
V$DATABASE
Most information about the performance of the database is kept here:
V$SYSSTAT
Most information about the performance for individual user sessions is stored here:
V$SESSION , V$SESSTAT
Information about online redo logs (2)
V$LOG, V$LOGFILE
Information about datafiles
V$DATAFILE
Basic information about control files, and the two columns it has:
V$CONTROLFILE. STATUS / NAME
An object you can query to obtain a listing of all data dictionary objects (4)
CATALOG, CAT, DICTIONARY, DICT.
When the control file was created, Sequence Number, most recent SCN:
V$DATABASE
Information stored in different sections of the control file, Sequence Number:
V$CONTROLFILE_RECORD_SECTION
To see the names and locations of all control files in the db? (2)
V$PARAMETER. V$CONTROLFILE
Tablespace and Datafiles
Temporary Segments:
Name, tablespace location, and owner of temporary segments:
DBA_SEGMENTS
Size of temporary tablespaces, current number of extents allocated to sort segments, and sort segment high-water mark information. Space usage allocation for temporary segments:
V$SORT_SEGMENT
Types of sorts that are happening currently on the database
V$SORT_USAGE
To see the username corresponding with the session:
V$SESSION
Information about every datafile in the database associated with a temporary tablespace:
DBA_TEMP_FILES
Similar to DBA_TEMP_FILES, this performance view gives Information about every datafile in the database associated with a temporary tablespace:
V$TEMPFILE
Storage Structures
A summary view, contains all types of segments and their storage parameters, space utilization settings:
DBA_SEGMENTS
Tablespace quotas assigned to users:
DBA_TS_QUOTAS
Segment name, type, owner, total bytes of extent, name of tablespace storing the extent:
DBA_EXTENTS
The location and amount of free space by tablespace name:
DBA_FREE_SPACE
The location of free space in the tablespace that has been coalesced:
DBA_FREE_SPACE_COALESCED
Information about datafiles for every tablespace
DBA_DATAFILES
Performance view for information for datafiles for every tablespace
V$DATAFILE
To see the total amount of space allocated to a table?
DBA_EXTENTS
Table creation timestamp, information about the object ID:
DBA_OBJECTS
High water mark, all storage settings for a table, and statistics collected as part of the analyze (for row migration) operation on that table
DBA_TABLES
Information about every column in every table:
DBA_TAB_COLUMNS
To determine how many columns are marked unused for later removal?
DBA_UNUSED_COL_TABS
To find the number of deleted index entries ?
INDEX_STATS
To determine the columns on a table that have been indexed:
DBA_ID_COLUMNS
The dynamic view to show whether the index is being used in a meaningful way?
V$OBJECT_USAGE
To see whether a constraint exists on a particular column?
DBA_CONS_COLUMNS
To see the constraints associated with a particular table:
DBA_CONSTRAINTS
To find the username, ID number, (encrypted) password, default and temporary tablespace information, user profile of a user, password expiry date:
DBA_USERS
To all objects, which objects belong to which users, how many objects a user has created?
DBA_OBJECTS
Resource-usage parameters for a particular profile:
DBA_PROFILES
Identifies all resources in the database and their corresponding cost:
RESOURCE_COST
Identifies system resource limits for individual users:
USER_RESOURCE_LIMITS
Shows all system privileges:
DBA_SYS_PRIVS
Show all object privileges:
DBA_TAB_PRIVS
Shows all privileges in this session available to you as the current user:
SESSION_PRIVS
Views for audits currently taking place are created by this script:
cataudit.sql
a list of audit entries generated by the exists option of the audit command:
DBA_AUDIT_EXISTS
A list of audit entries generated for object audits:
DBA_AUDIT_OBJECT
A list of audit entries generated by session connects and disconnects:
DBA_AUDIT_SESSION
A list of audit entries generated by statement options of the audit command:
DBA_AUDIT_STATEMENT
A list of all entries in the AUD$ table collected by the audit command:
DBA_AUDIT_TRAIL
To determine the roles available in the database, the names of all the roles on the database and if a password is required to use each role:
DBA_ROLES
Names of all users and the roles granted to them:
DBA_ROLE_PRIVS
All the roles and the roles that are granted to them:
ROLE_ROLE_PRIVS
Which system privileges have been granted to a role:
DBA_SYS_PRIVS
All the system privileges granted only to roles:
ROLE_SYS_PRIVS
All the object privileges granted only to roles:
ROLE_TAB_PRIVS
All the roles available in the current session:
SESSION_ROLES
Which object privilege has been granted to a role:
DBA_TAB_PRIVS
To display the value of the NLS_CHARACTERSET parameter:
NLS_DATABASE_PARAMETERS
DAYou can also find a lot of stuff by doing:
SELECT *
FROM dictionary; -
The query against the database caused an error in https: site
Hi
I have created a new Data source and External content type in sharePoint 2013
I have also given all the permission to this Content type (including "Users(Windows)")
I also having edit permission in the Sql-database.
I have tied almost all the possibilities given in the net for this error.
still the error("the query against the database caused an error") is there.
Is this because of "https:/ " in the url?
Can any one give a suggestion / solution for this?
Thanks
S H A J A NHi,
Can you please check ULS Log as well as event viewer, to see if there's any related error reported?
Thanks,
Sohel Rana
http://ranaictiu-technicalblog.blogspot.com -
Oracle dictionary view 2 find the queries run and it's execution time
Hi All,
I s there any oracle dictionary view which captures the queries being run by users on the database and time taken to execute those queries?
We need to find out the OS user not the database user since we have to identify the users who are executing long running queries.
We require this basically to monitor the long running queries on the database.
Thanks in AdvanceHi,
welcome to the forum!
Oracle doesn't store information about individual executions of SQL queries (that would've been too expensive), but you can find cumulative query execution stats in V$SQL. If you are interested in queries by a specific OS user, then Active Session History can help you (provided you have the Diagnostic Pack License).
Best regards,
Nikolay -
Run Query against a Workspace without activating it
Hello,
Do you know if it is possible to run a query against a specific Workspace without having to activate it before?
Many Thanks,
NogueiraHi,
You might be able to use the MW view after calling dbmswm.SetMultiWorkspaces and specifying only the workspace that you care about. However, this view is read only and has some additional metadata columns and so may not be what you are looking for. Other than using this view however, you need to call GotoWorkspace.
Regards,
Ben -
Dba_jobs_running dictionary view
i'm trying to query the dba_jobs_running dictionary view from PL/SQL procedure and am getting
Table or view does not exists Error at compile Time.
I also tried the same using Execute Immediate and am getting the same error
Table or view does not exists Error at run Time.
Also when I query the same dba_jobs_running from SQL*Plus
i am getting the required output.
The Oracle Version i'm using is 9.2.0.1.0
I tried all the above steps in Oracle version 8.1.5.0.0
and am not getting the above errors
Table or view does not exists(inside PL/SQL Procedure)
Pls can any one help me on the same.Try SYS.dba_jobs, maybe there isn't a public synonym for that view.
-
Why Is Query Against XMLTYPE Table ACME_CUST Doing A Full Table Scan?
On our Oracle Database 11g Enterprise Edition Release 11.2.0.1.0, we have a query against against a 25,214 record XMLTYPE ACME_CUST table.
SELECT rownum AS seq,
EID AS eid,
SUBSTR(CUST_ID, 1, INSTR(CUST_ID, '|')-1) AS tgt_acme_customer_id,
SUBSTR(CUST_ID, INSTR(CUST_ID, '|') +1) AS src_acme_customer_id_list
FROM
(SELECT ac.eid EID,
listagg(ac.acme_cust_id, '|') WITHIN GROUP (
ORDER BY ac.acme_cust_id, ac.acme_cust_id) CUST_ID
FROM ACME_CUST ac
GROUP BY ac.eid
HAVING COUNT(ac.acme_cust_id)>1)Explain plan shows:
Select Statement
Count
VIEW
FILTER
Filter Predicates
COUNT(*) > 1
SORT GROUP BY
TABLE ACCESS ACME_CUST FULL
The ACME_CUST Table has a virtual column defined on acme_cust_id along with a corresponding index. This filed is also defined as a primary key.
Here is the table definitiion and associated statements:
CREATE
TABLE "N98991"."ACME_CUST" OF XMLTYPE
CONSTRAINT "ACME_CUST_ID_PK" PRIMARY KEY ("ACME_CUST_ID") USING INDEX
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 65536
NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1
FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE
DEFAULT) TABLESPACE "ACME_DEV" ENABLE
XMLTYPE STORE AS SECUREFILE BINARY XML
TABLESPACE "ACME_DEV" ENABLE STORAGE IN ROW CHUNK 8192 CACHE READS LOGGING
NOCOMPRESS KEEP_DUPLICATES STORAGE(INITIAL 106496 NEXT 1048576 MINEXTENTS 1
MAXEXTENTS 2147483645 PCTINCREASE 0 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT
CELL_FLASH_CACHE DEFAULT)
ALLOW NONSCHEMA ALLOW ANYSCHEMA VIRTUAL COLUMNS
"EID" AS (CAST(SYS_XQ_UPKXML2SQL(SYS_XQEXVAL(XMLQUERY(
'declare default element namespace "http://www.cigna.com/acme/domains/customer/customerprofile/2011/11"; (::)
/customerProfile/@eid'
PASSING BY VALUE SYS_MAKEXML(128,"XMLDATA") RETURNING CONTENT ),0,0,
16777216,0),50,1,2) AS VARCHAR2(15))),
*bold* "ACME_CUST_ID" AS (CAST(SYS_XQ_UPKXML2SQL(SYS_XQEXVAL(XMLQUERY(
'declare default element namespace "http://www.cigna.com/acme/domains/customer/customerprofile/2011/11"; (::)
/customerProfile/@id' *bold*
PASSING BY VALUE SYS_MAKEXML(128,"XMLDATA") RETURNING CONTENT ),0,0,
16777216,0),50,1,2) AS VARCHAR2(50))),
"CRET_DT" AS (SYS_EXTRACT_UTC(CAST(TO_TIMESTAMP_TZ(SYS_XQ_UPKXML2SQL(
SYS_XQEXVAL(XMLQUERY(
'declare default element namespace "http://www.cigna.com/acme/domains/customer/customerprofile/2011/11"; (::)
/customerProfile/@create_dt'
PASSING BY VALUE SYS_MAKEXML(128,"XMLDATA") RETURNING CONTENT ),0,0,
16777216,0),50,1,2),'SYYYY-MM-DD"T"HH24:MI:SS.FFTZH:TZM') AS TIMESTAMP
WITH
TIME ZONE)))
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE
INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0
FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT
CELL_FLASH_CACHE DEFAULT
TABLESPACE "ACME_DEV" ;
CREATE
INDEX "N98991"."ACME_CST_CRET_DT_IDX" ON "N98991"."ACME_CUST"
"CRET_DT"
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE
INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0
FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT
CELL_FLASH_CACHE DEFAULT
TABLESPACE "ACME_DEV" ;
CREATE
INDEX "N98991"."ACME_CST_EID_IDX" ON "N98991"."ACME_CUST"
"EID"
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE
INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0
FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT
CELL_FLASH_CACHE DEFAULT
TABLESPACE "ACME_DEV" ;
*bold*CREATE UNIQUE INDEX "N98991"."ACME_CUST_ID_PK" ON "N98991"."ACME_CUST"
"ACME_CUST_ID"
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE *bold*
INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0
FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT
CELL_FLASH_CACHE DEFAULT
TABLESPACE "ACME_DEV" ;
CREATE
INDEX "N98991"."ACME_CUST_XMLINDEX_IX" ON "N98991"."ACME_CUST"
OBJECT_VALUE
INDEXTYPE IS "XDB"."XMLINDEX" PARAMETERS
'XMLTABLE ACME_CUST_IDX_TAB XMLNamespaces (''http://www.cigna.com/acme/domains/commoncontact/2011/11'' as "cm", default ''http://www.cigna.com/acme/domains/customer/customerprofile/2011/11''),
''/customerProfile''
columns
DOB date PATH ''personInformation/cm:birthDate'',
FIRSTNAME varchar2(40) PATH ''name/cm:givenName'',
LASTNAME varchar2(40) PATH ''name/cm:surName'',
SSN varchar2(30) PATH ''identifiers/ssn'',
MEMBERINFOS XMLType path ''memberInfos/memberInfo'' VIRTUAL
XMLTable acme_cust_lev2_idx_tab XMLNAMESPACES(default ''http://www.cigna.com/acme/domains/customer/customerprofile/2011/11''),
''/memberInfo'' passing MEMBERINFOS
columns
ami varchar2(40) PATH ''ami'',
subscId varchar2(50) PATH ''clientRelationship/subscriberInformation/subscriberId'',
employeeId varchar2(50) PATH ''systemKeys/employeeId'',
clientId varchar2(50) PATH ''clientRelationship/clientId''
CREATE UNIQUE INDEX "N98991"."SYS_C00384339" ON "N98991"."ACME_CUST"
"SYS_NC_OID$"
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE
INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0
FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT
CELL_FLASH_CACHE DEFAULT
TABLESPACE "ACME_DEV" ;
CREATE UNIQUE INDEX "N98991"."SYS_IL0000649948C00003$$" ON "N98991"."ACME_CUST"
PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576
MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST
GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "ACME_DEV" PARALLEL (DEGREE 0 INSTANCES 0) ;Why isn't the unique index ACME_CUST_ID_PK on the virtual column ACME_CUST_ID being used in the explain plan?
Any input would be much appreciated, as really stumped here.
Regards,
RickHi Richard,
The 10053 event appears overkill for this situation. What's the big deal?
Set the event, run the query, unset the event, check the trace file, that's all.
It's not overkill if it helps you understanding what happens and why an index is of no use in this situation.
Tried the /*+ INDEX_FFS(ACME_CUST_ID_PK) */ hint in the 'nested' query.Not sure what nested query you're referring to, so if I misunderstood what you mean, just ignore the following comment.
From what you posted earlier, it looks like you're talking about this part :
listagg(ac.acme_cust_id,'|') WITHIN GROUP (
ORDER BY ac.acme_cust_id,ac.acme_cust_id) CUST_IDThat's not a nested query, it's a projection. All the main work (retrieving rows) has already been done when it comes to this part.
May just have to accept the query performance as it is...Maybe you can try something else.
See the document : Oracle XML DB : Best Practices, page 15 ex. 8 :
When there are multiple scalar values that need to be grouped or ordered, it is better to write it
with XMLTable construct that projects out all columns to be ordered or grouped as shown
below.Here's an example close to your actual requirement :
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production
SQL> create table xtab_cols of xmltype
2 xmltype store as securefile binary xml;
Table created.
SQL> insert /*+ append */ into xtab_cols
2 select xmlelement("ROW",
3 xmlforest(
4 TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_TYPE_MOD, DATA_TYPE_OWNER,
5 DATA_LENGTH, DATA_PRECISION, DATA_SCALE, NULLABLE, COLUMN_ID,
6 DEFAULT_LENGTH, NUM_DISTINCT, LOW_VALUE, HIGH_VALUE,
7 DENSITY, NUM_NULLS, NUM_BUCKETS, LAST_ANALYZED, SAMPLE_SIZE,
8 CHARACTER_SET_NAME, CHAR_COL_DECL_LENGTH,
9 GLOBAL_STATS, USER_STATS, AVG_COL_LEN, CHAR_LENGTH, CHAR_USED,
10 V80_FMT_IMAGE, DATA_UPGRADED, HISTOGRAM
11 )
12 )
13 from dba_tab_cols
14 where owner = 'SYS'
15 ;
57079 rows created.
SQL> commit;
Commit complete.
SQL> set long 1000
SQL> set pages 100
SQL> select xmlserialize(document object_value) from xtab_cols where rownum = 1;
XMLSERIALIZE(DOCUMENTOBJECT_VALUE)
<ROW>
<TABLE_NAME>ACCESS$</TABLE_NAME>
<COLUMN_NAME>D_OBJ#</COLUMN_NAME>
<DATA_TYPE>NUMBER</DATA_TYPE>
<DATA_LENGTH>22</DATA_LENGTH>
<NULLABLE>N</NULLABLE>
<COLUMN_ID>1</COLUMN_ID>
<NUM_DISTINCT>7454</NUM_DISTINCT>
<LOW_VALUE>C2083A</LOW_VALUE>
<HIGH_VALUE>C3031D18</HIGH_VALUE>
<DENSITY>,000134156157767642</DENSITY>
<NUM_NULLS>0</NUM_NULLS>
<NUM_BUCKETS>1</NUM_BUCKETS>
<LAST_ANALYZED>2012-01-28</LAST_ANALYZED>
<SAMPLE_SIZE>34794</SAMPLE_SIZE>
<GLOBAL_STATS>YES</GLOBAL_STATS>
<USER_STATS>NO</USER_STATS>
<AVG_COL_LEN>5</AVG_COL_LEN>
<CHAR_LENGTH>0</CHAR_LENGTH>
<V80_FMT_IMAGE>NO</V80_FMT_IMAGE>
<DATA_UPGRADED>YES</DATA_UPGRADED>
<HISTOGRAM>NONE</HISTOGRAM>
</ROW>
SQL> exec dbms_stats.gather_table_stats(user, 'XTAB_COLS');
PL/SQL procedure successfully completed.
SQL> set autotrace traceonly
SQL> set timing on
SQL> set lines 120
SQL> select x.table_name
2 , listagg(x.column_name, ',') within group (order by column_id)
3 from xtab_cols t
4 , xmltable('/ROW' passing t.object_value
5 columns table_name varchar2(30) path 'TABLE_NAME'
6 , column_name varchar2(30) path 'COLUMN_NAME'
7 , column_id number path 'COLUMN_ID'
8 ) x
9 group by x.table_name
10 ;
4714 rows selected.
Elapsed: 00:00:08.25
Execution Plan
Plan hash value: 602782846
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 466M| 101G| 1580K (3)| 05:16:04 |
| 1 | SORT GROUP BY | | 466M| 101G| 1580K (3)| 05:16:04 |
| 2 | NESTED LOOPS | | 466M| 101G| 1552K (1)| 05:10:32 |
| 3 | TABLE ACCESS FULL| XTAB_COLS | 57079 | 12M| 408 (1)| 00:00:05 |
| 4 | XPATH EVALUATION | | | | | |
Statistics
9 recursive calls
1 db block gets
1713 consistent gets
0 physical reads
96 redo size
773516 bytes sent via SQL*Net to client
3873 bytes received via SQL*Net from client
316 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
4714 rows processedAnd of course, even better after adding a structured XML index (4714 rows fetched in 1s) :
SQL> CREATE INDEX xtab_cols_sxi ON xtab_cols (OBJECT_VALUE) INDEXTYPE IS XDB.XMLIndex
2 PARAMETERS (
3 q'#XMLTable my_xtab
4 '/ROW'
5 columns table_name varchar2(30) path 'TABLE_NAME'
6 , column_name varchar2(30) path 'COLUMN_NAME'
7 , column_id number path 'COLUMN_ID' #');
Index created.
Elapsed: 00:00:13.42
SQL> select x.table_name
2 , listagg(x.column_name, ',') within group (order by column_id)
3 from xtab_cols t
4 , xmltable('/ROW' passing t.object_value
5 columns table_name varchar2(30) path 'TABLE_NAME'
6 , column_name varchar2(30) path 'COLUMN_NAME'
7 , column_id number path 'COLUMN_ID'
8 ) x
9 group by x.table_name
10 ;
4714 rows selected.
Elapsed: 00:00:01.00
Execution Plan
Plan hash value: 3303494605
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 57520 | 3201K| 174 (3)| 00:00:03 |
| 1 | SORT GROUP BY | | 57520 | 3201K| 174 (3)| 00:00:03 |
| 2 | TABLE ACCESS FULL| MY_XTAB | 57520 | 3201K| 171 (1)| 00:00:03 |
Note
- dynamic sampling used for this statement (level=2)
Statistics
297 recursive calls
1 db block gets
989 consistent gets
0 physical reads
176 redo size
773516 bytes sent via SQL*Net to client
3873 bytes received via SQL*Net from client
316 SQL*Net roundtrips to/from client
21 sorts (memory)
0 sorts (disk)
4714 rows processed -
Update query against InfoPath form data
Hi,
We are using SharePoint Enterprise 2010, and have set up a series of InfoPath forms to manage various aspects of the projects we run (request forms, change control, toll gating, status reports, etc). The forms are all created in InfoPath and save the
data to form libraries on SharePoint.
We are in the process of revamping the status report. The fields for Accomplishments, Planned Activities, Risks and Dependencies were origianally set up as plain text. We are moving to a bullted field for each. My concern is that once we
add the new fields to the published form, the old ones will disappear fom view. So if we pull up an older status report, the information wont be available to view.
Is there any way to write an update query against this form data? Supposed I add a new bulleted field for "Accomplishments_NEW" and change the existing field to "Accomplishments_OLD". If I were working with in Access, it would
be a simple update query where the field selected would be "Accomplishments_NEW" and the update value would be "Accomplishments_OLD". I have actually tried this through Access but we only seem to be able to read this data through
Access, not write to it.
Is there any way to make such a change on the SharePoint side?
DennisYes.
The approach is to add two fields:
- Accomplishments_v2 and Accomplishments_v1_Loaded (true/false)
when the form loads, if _v1_Loaded is false, migrate the data from the old field into _v2, and then set _v1_loaded = true
Scott Brickey
MCTS, MCPD, MCITP
www.sbrickey.com
Strategic Data Systems - for all your SharePoint needs -
How to use one query against multiple table and recieve one report?
I have duplicate tables, (except for their names of course) with commodities prices. They have the same column headings, but the data is different of course. I have a query that gives me a certain piece of information I am looking for but now I need to run this query against every table. I will do this every day as well, to see if the buying criteria is met. There are alot of tables though (256). Is there a way to say run query in all tables and return the results in one place? Thanks for your help.
hey
a. the all 256 tables whuld be one big partitoned table
b. you can use all_tables in order to write a select that will write the report for you:
SQL> set head off
SQL> select 'select * from (' from dual
2 union all
3 select 'select count(*) from ' || table_name || ' union all ' from a
4 where table_name like 'DB%' AND ROWNUM <= 3
5 union all
6 select ')' from dual;
select * from (
select count(*) from DBMS_LOCK_ALLOCATED union all
select count(*) from DBMS_ALERT_INFO union all
select count(*) from DBMS_UPG_LOG$ union all
remove the last 'union all', and tun the generated quary -
SQL> set head on
SQL> select * from (
2 select count(*) from DBMS_LOCK_ALLOCATED union all
3 select count(*) from DBMS_ALERT_INFO union all
4 select count(*) from DBMS_UPG_LOG$
5 );
COUNT(*)
0
0
0
Amiel -
Select query in materialized view with two dblinks
Hi All,
We have oracle 10g On windows.
We are trying to create materialized view. Scenario is we have base table on other database and we are creating mview on different database.
Basa database have two schema's and i am selecting records from that two schema's using two private db links.
But when i am tryin gto create mview its not getting created. After 15 hrs. its still showing creation command and not finished.
Query is :-
Is it good practice to have two db links in select query of materialized view.Billy Verreynne wrote:
Chanchal Wankhade wrote:
Is it good practice to have two db links in select query of materialized view.Same db link being used twice, or two different db links?
If the former, you ideally want the local Oracle db to send the join to the remote database, and for the remote database to drive the join between those 2 tables. There is a hint (<i>driving_site</i>) that can be used - or the join query can be defined on the remote database as a view, and the local materialised view can then use that remote view.
If you have 2 different db links and joining across these - usually a bad idea to perform distributed database joins. There are lots of limitations as to how the tables can be joined. Worse case, full table scans of both remote tables, pulling all the rows from the 2 remote database tables to the local database, and joining these on the local database.
I have seen some severe performance issues in the past as a result of distributed joins. I'll rather use 2 materialised views for pulling both distributed tables's data locally, and then do the join on local data (using indexes, partition pruning, etc)Hi Billy,
My scenario is i have two database database A and database B. Database A is having two schema's SCOTT AND HR. SCOTT schema have select privileges on HR schema.
DB LINK is between Database B to Database A. name is db.link.B.A.oracle.com.
What if i priovide while creating materialized view, the schema name before the table name in database B for this particuler table so it will pick up the table from that schema using same DB LINK(db.link.B.A.oracle.com.) that i am using to fetch records from SCOTT schema.
Above schnario is like two base schema's and one db link using two schema.
Maybe you are looking for
-
MOVED: k9a2-cf ps/2 mouse not working in vista x86/x64
This topic has been moved to Vista problems. https://forum-en.msi.com/index.php?topic=114992.0
-
my cd-dvd_room is broket pls any help to boot from usb and how if is posible
-
HT204135 scanning from elements 11
I am having trouble scanning from Photoshop elements 11. I have a Canon Pixma MP560 (multifunction), and the printer works, but the import button is not available. I have downloaded and installed the latest drivers from Canon, reinstalled elements an
-
Creating a database Table From DataTable
I have a live oracle database and test oracle database. i am copy data from my live to my test system, which doesnt have all of the current table that the live system has. so what i would like to do for a table that doesnt exist in my test system, is
-
I'd like to use the JSR-168 Consumer for Aqualogic G6 SP1, to consume some portlets that I currently have deployed on WebLogic Portal 8.1 SP4. Can someone please tell me where to download it? Or if it's built in now, can someone tell me how to use it