Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 98b8afd

Browse files
committed
v1522
1 parent c1c479b commit 98b8afd

2 files changed

Lines changed: 117 additions & 4 deletions

File tree

sql/constraints_nonindexed.sql

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
-- based on "Oracle Database Transactions and Locking Revealed" book by Thomas Kyte
2+
WITH
3+
ref_int_constraints AS (
4+
SELECT /*+ MATERIALIZE NO_MERGE */
5+
col.owner,
6+
col.table_name,
7+
col.constraint_name,
8+
con.status,
9+
con.r_owner,
10+
con.r_constraint_name,
11+
COUNT(*) col_cnt,
12+
MAX(CASE col.position WHEN 01 THEN col.column_name END) col_01,
13+
MAX(CASE col.position WHEN 02 THEN col.column_name END) col_02,
14+
MAX(CASE col.position WHEN 03 THEN col.column_name END) col_03,
15+
MAX(CASE col.position WHEN 04 THEN col.column_name END) col_04,
16+
MAX(CASE col.position WHEN 05 THEN col.column_name END) col_05,
17+
MAX(CASE col.position WHEN 06 THEN col.column_name END) col_06,
18+
MAX(CASE col.position WHEN 07 THEN col.column_name END) col_07,
19+
MAX(CASE col.position WHEN 08 THEN col.column_name END) col_08,
20+
MAX(CASE col.position WHEN 09 THEN col.column_name END) col_09,
21+
MAX(CASE col.position WHEN 10 THEN col.column_name END) col_10,
22+
MAX(CASE col.position WHEN 11 THEN col.column_name END) col_11,
23+
MAX(CASE col.position WHEN 12 THEN col.column_name END) col_12,
24+
MAX(CASE col.position WHEN 13 THEN col.column_name END) col_13,
25+
MAX(CASE col.position WHEN 14 THEN col.column_name END) col_14,
26+
MAX(CASE col.position WHEN 15 THEN col.column_name END) col_15,
27+
MAX(CASE col.position WHEN 16 THEN col.column_name END) col_16,
28+
par.owner parent_owner,
29+
par.table_name parent_table_name,
30+
par.constraint_name parent_constraint_name
31+
FROM dba_constraints con,
32+
dba_cons_columns col,
33+
dba_constraints par
34+
WHERE con.constraint_type = 'R'
35+
AND con.owner NOT IN ('ANONYMOUS','APEX_030200','APEX_040000','APEX_SSO','APPQOSSYS','CTXSYS','DBSNMP','DIP','EXFSYS','FLOWS_FILES','MDSYS','OLAPSYS','ORACLE_OCM','ORDDATA','ORDPLUGINS','ORDSYS','OUTLN','OWBSYS')
36+
AND con.owner NOT IN ('SI_INFORMTN_SCHEMA','SQLTXADMIN','SQLTXPLAIN','SYS','SYSMAN','SYSTEM','TRCANLZR','WMSYS','XDB','XS$NULL','PERFSTAT','STDBYPERF')
37+
AND col.owner = con.owner
38+
AND col.constraint_name = con.constraint_name
39+
AND col.table_name = con.table_name
40+
AND par.owner(+) = con.r_owner
41+
AND par.constraint_name(+) = con.r_constraint_name
42+
GROUP BY
43+
col.owner,
44+
col.constraint_name,
45+
col.table_name,
46+
con.status,
47+
con.r_owner,
48+
con.r_constraint_name,
49+
par.owner,
50+
par.constraint_name,
51+
par.table_name
52+
),
53+
ref_int_indexes AS (
54+
SELECT /*+ MATERIALIZE NO_MERGE */
55+
r.owner,
56+
r.constraint_name,
57+
c.table_owner,
58+
c.table_name,
59+
c.index_owner,
60+
c.index_name,
61+
r.col_cnt
62+
FROM ref_int_constraints r,
63+
dba_ind_columns c,
64+
dba_indexes i
65+
WHERE c.table_owner = r.owner
66+
AND c.table_name = r.table_name
67+
AND c.column_position <= r.col_cnt
68+
AND c.column_name IN (r.col_01, r.col_02, r.col_03, r.col_04, r.col_05, r.col_06, r.col_07, r.col_08,
69+
r.col_09, r.col_10, r.col_11, r.col_12, r.col_13, r.col_14, r.col_15, r.col_16)
70+
AND i.owner = c.index_owner
71+
AND i.index_name = c.index_name
72+
AND i.table_owner = c.table_owner
73+
AND i.table_name = c.table_name
74+
AND i.index_type != 'BITMAP'
75+
GROUP BY
76+
r.owner,
77+
r.constraint_name,
78+
c.table_owner,
79+
c.table_name,
80+
c.index_owner,
81+
c.index_name,
82+
r.col_cnt
83+
HAVING COUNT(*) = r.col_cnt
84+
)
85+
SELECT /*+ NO_MERGE */ *
86+
FROM ref_int_constraints c
87+
WHERE NOT EXISTS (
88+
SELECT NULL
89+
FROM ref_int_indexes i
90+
WHERE i.owner = c.owner
91+
AND i.constraint_name = c.constraint_name
92+
AND i.col_cnt >= c.col_cnt
93+
)
94+
ORDER BY
95+
1, 2, 3
96+
/

sql/planx.sql

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ COL x_maximum_date NEW_V x_maximum_date NOPRI;
6666
SELECT TO_CHAR(MAX(end_interval_time), 'DD-MON-YYYY HH24:MI:SS') x_maximum_date FROM dba_hist_snapshot WHERE :license = 'Y' AND snap_id = &&x_maximum_snap_id.;
6767
-- get sql_text
6868
VAR sql_text CLOB;
69+
EXEC :sql_text := NULL;
6970
BEGIN
7071
SELECT sql_fulltext
7172
INTO :sql_text
@@ -86,16 +87,23 @@ END;
8687
/
8788
VAR signature NUMBER;
8889
VAR signaturef NUMBER;
89-
EXEC :signature := DBMS_SQLTUNE.SQLTEXT_TO_SIGNATURE(:sql_text);
90-
EXEC :signaturef := DBMS_SQLTUNE.SQLTEXT_TO_SIGNATURE(:sql_text, TRUE);
90+
EXEC :signature := NVL(DBMS_SQLTUNE.SQLTEXT_TO_SIGNATURE(:sql_text), -1);
91+
EXEC :signaturef := NVL(DBMS_SQLTUNE.SQLTEXT_TO_SIGNATURE(:sql_text, TRUE), -1);
9192
COL signature NEW_V signature FOR A20;
9293
COL signaturef NEW_V signaturef FOR A20;
9394
SELECT TO_CHAR(:signature) signature, TO_CHAR(:signaturef) signaturef FROM DUAL;
95+
BEGIN
96+
IF :sql_text IS NULL THEN
97+
:sql_text := 'Unknown SQL Text';
98+
END IF;
99+
END;
100+
/
94101
-- spool and sql_text
95102
SPO planx_&&sql_id._&&current_time..txt;
96103
PRO SQL_ID: &&sql_id.
97104
PRO SIGNATURE: &&signature.
98105
PRO SIGNATUREF: &&signaturef.
106+
PRO
99107
SET PAGES 0;
100108
PRINT :sql_text;
101109
SET PAGES 50000;
@@ -302,16 +310,20 @@ SELECT s.snap_id,
302310
PRO
303311
PRO DBA_HIST_SQL_PLAN (ordered by plan_hash_value)
304312
PRO ~~~~~~~~~~~~~~~~~
313+
COL plan_timestamp FOR A19;
314+
BREAK ON plan_timestamp SKIP 2;
305315
SET PAGES 0;
306316
WITH v AS (
307317
SELECT /*+ MATERIALIZE */
308-
DISTINCT sql_id, plan_hash_value, dbid
318+
DISTINCT sql_id, plan_hash_value, dbid, timestamp
309319
FROM dba_hist_sql_plan
310320
WHERE :license = 'Y'
311321
AND dbid = :dbid
312322
AND sql_id = '&&sql_id.'
313323
ORDER BY 1, 2, 3 )
314-
SELECT /*+ ORDERED USE_NL(t) */ t.plan_table_output
324+
SELECT /*+ ORDERED USE_NL(t) */
325+
TO_CHAR(v.timestamp, 'YYYY-MM-DD HH24:MI:SS') plan_timestamp,
326+
t.plan_table_output
315327
FROM v, TABLE(DBMS_XPLAN.DISPLAY_AWR(v.sql_id, v.plan_hash_value, v.dbid, 'ADVANCED')) t
316328
/
317329
PRO
@@ -749,7 +761,12 @@ END;
749761
/
750762
SET LONG 2000000 LONGC 2000 LIN 32767;
751763
COL tables_list NEW_V tables_list FOR A32767;
764+
SET HEAD OFF;
765+
PRO
766+
PRO (owner, table) list
767+
PRO ~~~~~~~~~~~~~~~~~~~
752768
SELECT :tables_list tables_list FROM DUAL;
769+
SET HEAD ON;
753770
PRO
754771
PRO Tables Accessed
755772
PRO ~~~~~~~~~~~~~~~

0 commit comments

Comments
 (0)