Vous êtes sur la page 1sur 10

VIEWS' PERFORMANCE

Author JP Vijaykumar
Date November 22 2014
/*
I tuned a sql query,which is performance poorly in our
datawarehouse environments.
To protect sensitive data, all column_names & table_names were masked.
The problematic query is accessing a view, and fetching about 3/4 of the total r
ows from that view.
This view's definition is :
*/
select text from dba_views where view_name='ORIGINAL_COL_VW'; --PROBLEMATIC/ORIG
INAL VIEW DEFINITION(VIEW 01):
-------------------------------------------------------------------------------------------SELECT "TBL1_ID",
"COL2",
"COL3",
"COL4",
"COL5",
"COL6",
"COL7",
"COL8",
"COL9",
"COL10",
"COL11",
"COL12",
"COL13",
"COL14",
"COL15",
"COL16",
"COL17",
"COL18",
"COL19",
"COL20",
"COL21",
"COL22",
"COL23",
"COL24",
"COL25"
FROM (SELECT PREF.TBL1_ID,
PREF.COL2,
PREF.COL3,
PREF.COL4,
(SELECT P.SHORT_NM
FROM SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
WHERE
PGA.TBL3_ID = PP.TBL3_ID
AND PP.PREDICATE_ID = 901
AND PP.TBL4_ID = P.TBL4_ID
AND P.COL3 = PREF.COL3
AND PGA.GROUP_ID = PREF.COL2)
COL5,

(SELECT P.LONG_NM
FROM SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
WHERE
PGA.TBL3_ID = PP.TBL3_ID
AND PP.PREDICATE_ID = 901
AND PP.TBL4_ID = P.TBL4_ID
AND P.COL3 = PREF.COL3
AND PGA.GROUP_ID = PREF.COL2)
COL6,
(SELECT P.SHORT_NM
FROM SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
WHERE
PGA.TBL3_ID = PP.TBL3_ID
AND PP.PREDICATE_ID = 902
AND PP.TBL4_ID = P.TBL4_ID
AND P.COL3 = PREF.COL3
AND PGA.GROUP_ID = PREF.COL2)
COL7,
(SELECT P.LONG_NM
FROM SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
WHERE
PGA.TBL3_ID = PP.TBL3_ID
AND PP.PREDICATE_ID = 902
AND PP.TBL4_ID = P.TBL4_ID
AND P.COL3 = PREF.COL3
AND PGA.GROUP_ID = PREF.COL2)
COL8,
(SELECT P.SHORT_NM
FROM SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
WHERE
PGA.TBL3_ID = PP.TBL3_ID
AND PP.PREDICATE_ID = 903
AND PP.TBL4_ID = P.TBL4_ID
AND P.COL3 = PREF.COL3
AND PGA.GROUP_ID = PREF.COL2)
COL9,
(SELECT P.LONG_NM
FROM SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
WHERE
PGA.TBL3_ID = PP.TBL3_ID
AND PP.PREDICATE_ID = 903
AND PP.TBL4_ID = P.TBL4_ID
AND P.COL3 = PREF.COL3
AND PGA.GROUP_ID = PREF.COL2)
COL10,
(SELECT P.SHORT_NM
FROM SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
WHERE
PGA.TBL3_ID = PP.TBL3_ID
AND PP.PREDICATE_ID = 904
AND PP.TBL4_ID = P.TBL4_ID
AND P.COL3 = PREF.COL3
AND PGA.GROUP_ID = PREF.COL2)
COL11,

(SELECT P.LONG_NM
FROM SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
WHERE
PGA.TBL3_ID = PP.TBL3_ID
AND PP.PREDICATE_ID = 904
AND PP.TBL4_ID = P.TBL4_ID
AND P.COL3 = PREF.COL3
AND PGA.GROUP_ID = PREF.COL2)
COL12,
(SELECT P.SHORT_NM
FROM SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
WHERE
PGA.TBL3_ID = PP.TBL3_ID
AND PP.PREDICATE_ID = 905
AND PP.TBL4_ID = P.TBL4_ID
AND P.COL3 = PREF.COL3
AND PGA.GROUP_ID = PREF.COL2)
COL13,
(SELECT P.LONG_NM
FROM SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
WHERE
PGA.TBL3_ID = PP.TBL3_ID
AND PP.PREDICATE_ID = 905
AND PP.TBL4_ID = P.TBL4_ID
AND P.COL3 = PREF.COL3
AND PGA.GROUP_ID = PREF.COL2)
COL14,
(SELECT P.SHORT_NM
FROM SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
WHERE
PGA.TBL3_ID = PP.TBL3_ID
AND PP.PREDICATE_ID = 906
AND PP.TBL4_ID = P.TBL4_ID
AND P.COL3 = PREF.COL3
AND PGA.GROUP_ID = PREF.COL2)
COL15,
(SELECT P.LONG_NM
FROM SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
WHERE
PGA.TBL3_ID = PP.TBL3_ID
AND PP.PREDICATE_ID = 906
AND PP.TBL4_ID = P.TBL4_ID
AND P.COL3 = PREF.COL3
AND PGA.GROUP_ID = PREF.COL2)
COL16,
(SELECT P.SHORT_NM
FROM SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
WHERE
PGA.TBL3_ID = PP.TBL3_ID
AND PP.PREDICATE_ID = 907
AND PP.TBL4_ID = P.TBL4_ID
AND P.COL3 = PREF.COL3
AND PGA.GROUP_ID = PREF.COL2)
COL17,

(SELECT P.LONG_NM
FROM SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
WHERE
PGA.TBL3_ID = PP.TBL3_ID
AND PP.PREDICATE_ID = 907
AND PP.TBL4_ID = P.TBL4_ID
AND P.COL3 = PREF.COL3
AND PGA.GROUP_ID = PREF.COL2)
COL18,
(SELECT P.SHORT_NM
FROM SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
WHERE
PGA.TBL3_ID = PP.TBL3_ID
AND PP.PREDICATE_ID = 908
AND PP.TBL4_ID = P.TBL4_ID
AND P.COL3 = PREF.COL3
AND PGA.GROUP_ID = PREF.COL2)
COL19,
(SELECT P.LONG_NM
FROM SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
WHERE
PGA.TBL3_ID = PP.TBL3_ID
AND PP.PREDICATE_ID = 908
AND PP.TBL4_ID = P.TBL4_ID
AND P.COL3 = PREF.COL3
AND PGA.GROUP_ID = PREF.COL2)
COL20,
(SELECT P.SHORT_NM
FROM SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
WHERE
PGA.TBL3_ID = PP.TBL3_ID
AND PP.PREDICATE_ID = 73
AND PP.TBL4_ID = P.TBL4_ID
AND P.COL3 = PREF.COL3
AND PGA.GROUP_ID = PREF.COL2)
COL21,
(SELECT P.LONG_NM
FROM SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
WHERE
PGA.TBL3_ID = PP.TBL3_ID
AND PP.PREDICATE_ID = 909
AND PP.TBL4_ID = P.TBL4_ID
AND P.COL3 = PREF.COL3
AND PGA.GROUP_ID = PREF.COL2)
COL22,
(SELECT P.LONG_NM
FROM SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
WHERE
PGA.TBL3_ID = PP.TBL3_ID
AND PP.PREDICATE_ID = 912
AND PP.TBL4_ID = P.TBL4_ID
AND P.COL3 = PREF.COL3
AND PGA.GROUP_ID = PREF.COL2)
COL23,

(SELECT P.LONG_NM
FROM SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
WHERE
PGA.TBL3_ID = PP.TBL3_ID
AND PP.PREDICATE_ID = 910
AND PP.TBL4_ID = P.TBL4_ID
AND P.COL3 = PREF.COL3
AND PGA.GROUP_ID = PREF.COL2)
COL24,
(SELECT P.LONG_NM
FROM SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
WHERE
PGA.TBL3_ID = PP.TBL3_ID
AND PP.PREDICATE_ID = 911
AND PP.TBL4_ID = P.TBL4_ID
AND P.COL3 = PREF.COL3
AND PGA.GROUP_ID = PREF.COL2)
COL25
FROM SCOTT.TBL1 PREF
)
/*
The above view is consuming high resources and performing very poorly.
I had re-written the view, with the following construct.
The PP.PREDICATE_ID column is having multiple values.
For different values of PP.PREDICATE_ID, the view should display all
the required values in separate aliased columns.
As such, the below view did not fetch the required values.
I need to modify the table_join method to display all required values.
*/
CREATE OR REPLACE VIEW MODIFIED_COL_VW_JP1 as
SELECT "TBL1_ID",
"COL2",
"COL3",
"COL4",
"COL5",
"COL6",
"COL7",
"COL8",
"COL9",
"COL10",
"COL11",
"COL12",
"COL13",
"COL14",
"COL15",
"COL16",
"COL17",
"COL18",
"COL19",
"COL20",
"COL21",
"COL22",

"COL23",
"COL24",
"COL25"
FROM (SELECT PREF.TBL1_ID,
PREF.COL2,
PREF.COL3,
PREF.COL4,
case when PP.PREDICATE_ID = 901 then P.SHORT_NM else '' end C
OL5,
case when PP.PREDICATE_ID = 901 then P.LONG_NM else '' end C
OL6,
case when PP.PREDICATE_ID = 902 then P.SHORT_NM else '' end C
OL7,
case when PP.PREDICATE_ID = 902 then P.LONG_NM else '' end C
OL8,
case when PP.PREDICATE_ID = 903 then P.SHORT_NM else '' end C
OL9,
case when PP.PREDICATE_ID = 903 then P.LONG_NM else '' end C
OL10,
case when PP.PREDICATE_ID = 904 then P.SHORT_NM else '' end C
OL11,
case when PP.PREDICATE_ID = 904 then P.LONG_NM else '' end C
OL12,
case when PP.PREDICATE_ID = 905 then P.SHORT_NM else '' end C
OL13,
case when PP.PREDICATE_ID = 905 then P.LONG_NM else '' end C
OL14,
case when PP.PREDICATE_ID = 906 then P.SHORT_NM else '' end C
OL15,
case when PP.PREDICATE_ID = 906 then P.LONG_NM else '' end C
OL16,
case when PP.PREDICATE_ID = 907 then P.SHORT_NM else '' end C
OL17,
case when PP.PREDICATE_ID = 907 then P.LONG_NM else '' end C
OL18,
case when PP.PREDICATE_ID = 908 then P.SHORT_NM else '' end C
OL19,
case when PP.PREDICATE_ID = 908 then P.LONG_NM else '' end C
OL20,
case when PP.PREDICATE_ID = 73 then P.SHORT_NM else '' end C
OL21,
case when PP.PREDICATE_ID = 909 then P.LONG_NM else '' end C
OL22,
case when PP.PREDICATE_ID = 912 then P.LONG_NM else '' end C
OL23,
case when PP.PREDICATE_ID = 910 then P.LONG_NM else '' end C
OL24,
case when PP.PREDICATE_ID = 911 then P.LONG_NM else '' end C
OL25
FROM SCOTT.TBL1 PREF,
SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
where PGA.TBL3_ID = PP.TBL3_ID
AND PP.TBL4_ID = P.TBL4_ID
and p.COL3 = PREF.COL3
AND pga.GROUP_ID = PREF.COL2
);
/*

Modified my approach and re-written the veiw with the following constuct.
Tested the view, all the required fileds are fetched.
*/
(VIEW 02)
CREATE OR REPLACE VIEW MODIFIED_COL_VW_JP2 AS
with t as (SELECT P.SHORT_NM,P.LONG_NM,P.COL3,PGA.GROUP_ID,PP.PREDICATE_ID
FROM SCOTT.TBL2 PGA,
SCOTT.TBL3 PP,
SCOTT.TBL4 P
WHERE
PGA.TBL3_ID = PP.TBL3_ID
AND PP.TBL4_ID = P.TBL4_ID order by PREDICATE_ID,COL3,
GROUP_ID)
select "TBL1_ID",
"COL2",
PREF."COL3",
"COL4",
a901.SHORT_NM COL5,
a901.LONG_NM
COL6,
a902.SHORT_NM
COL7,
a902.LONG_NM
COL8,
a903.SHORT_NM
COL9,
a903.LONG_NM
COL10,
a904.SHORT_NM
COL11,
a904.LONG_NM
COL12,
a905.SHORT_NM
COL13,
a905.LONG_NM
COL14,
a906.SHORT_NM
COL15,
a906.LONG_NM
COL16,
a907.SHORT_NM
COL17,
a907.LONG_NM
COL18,
a908.SHORT_NM
COL19,
a908.LONG_NM
COL20,
a73.SHORT_NM
COL21,
--a909.SHORT_NM,
a909.LONG_NM
COL22,
a912.LONG_NM
COL23,
--a910.SHORT_NM,
a910.LONG_NM
COL24,
--a911.SHORT_NM,
a911.LONG_NM
COL25
--a912.SHORT_NM,
--a73.LONG_NM
from SCOTT.TBL1 PREF,
(SELECT t.SHORT_NM,t.LONG_NM,t.COL3,t.GROUP_ID
FROM t
WHERE
t.PREDICATE_ID = 901) a901,
(SELECT t.SHORT_NM,t.LONG_NM,t.COL3,t.GROUP_ID
FROM t
WHERE
t.PREDICATE_ID = 902 ) a902,
(SELECT t.SHORT_NM,t.LONG_NM,t.COL3,t.GROUP_ID
FROM t
WHERE
t.PREDICATE_ID = 903) a903,
(SELECT t.SHORT_NM,t.LONG_NM,t.COL3,t.GROUP_ID
FROM t
WHERE
t.PREDICATE_ID =904) a904,
(SELECT t.SHORT_NM,t.LONG_NM,t.COL3,t.GROUP_ID
FROM t
WHERE
t.PREDICATE_ID = 905) a905,
(SELECT t.SHORT_NM,t.LONG_NM,t.COL3,t.GROUP_ID

(SELECT
(SELECT
(SELECT
(SELECT
(SELECT
(SELECT
(SELECT

FROM t
WHERE
t.PREDICATE_ID =906) a906,
t.SHORT_NM,t.LONG_NM,t.COL3,t.GROUP_ID
FROM t
WHERE
t.PREDICATE_ID =907) a907,
t.SHORT_NM,t.LONG_NM,t.COL3,t.GROUP_ID
FROM t
WHERE
t.PREDICATE_ID =908) a908,
t.SHORT_NM,t.LONG_NM,t.COL3,t.GROUP_ID
FROM t
WHERE
t.PREDICATE_ID =909) a909,
t.SHORT_NM,t.LONG_NM,t.COL3,t.GROUP_ID
FROM t
WHERE
t.PREDICATE_ID =910) a910,
t.SHORT_NM,t.LONG_NM,t.COL3,t.GROUP_ID
FROM t
WHERE
t.PREDICATE_ID =911) a911,
t.SHORT_NM,t.LONG_NM,t.COL3,t.GROUP_ID
FROM t
WHERE
t.PREDICATE_ID =912) a912,
t.SHORT_NM,t.LONG_NM,t.COL3,t.GROUP_ID
FROM t
WHERE
t.PREDICATE_ID =73) a73

where
PREF.COL3
and PREF.COL2
and PREF.COL3
and PREF.COL2
and PREF.COL3
and PREF.COL2
and PREF.COL3
and PREF.COL2
and PREF.COL3
and PREF.COL2
and PREF.COL3
and PREF.COL2
and PREF.COL3
and PREF.COL2
and PREF.COL3
and PREF.COL2
and PREF.COL3
and PREF.COL2
and PREF.COL3
and PREF.COL2
and PREF.COL3
and PREF.COL2
and PREF.COL3
and PREF.COL2
and PREF.COL3
and PREF.COL2

=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=

a901.COL3(+)
a901.GROUP_ID(+)
a902.COL3(+)
a902.GROUP_ID(+)
a903.COL3(+)
a903.GROUP_ID(+)
a904.COL3(+)
a904.GROUP_ID(+)
a905.COL3(+)
a905.GROUP_ID(+)
a906.COL3(+)
a906.GROUP_ID(+)
a907.COL3(+)
a907.GROUP_ID(+)
a908.COL3(+)
a908.GROUP_ID(+)
a909.COL3(+)
a909.GROUP_ID(+)
a910.COL3(+)
a910.GROUP_ID(+)
a911.COL3(+)
a911.GROUP_ID(+)
a912.COL3(+)
a912.GROUP_ID(+)
a73.COL3(+)
a73.GROUP_ID(+)

--Tested the query's performance on the original view & re-written view.
set autot on stat timing on echo on feedback on linesize 120 pagesize 0
--EXECUTION PLAN DETAILS WERE OMITTED.
--PLS NOTE ELAPSED TIME & VALUE FOR "consistent gets" FOR EXECUTING A QUERY AGAI
NST (ORIGINAL) VIEW 01.
SQL> select * from ORIGINAL_COL_VW;

...
...
...
1710238 rows selected.
Elapsed: 00:27:42.44
Statistics
---------------------------------------------------------546 recursive calls
0 db block gets
196754124 consistent gets
10335 physical reads
0 redo size
128500878 bytes sent via SQL*Net to client
1254688 bytes received via SQL*Net from client
114017 SQL*Net roundtrips to/from client
46 sorts (memory)
0 sorts (disk)
1710238 rows processed

SQL> set autot on stat timing on echo on feedback on linesize 120 pagesize 0
--EXECUTION PLAN DETAILS WERE OMITTED.
--NOTE THE TIME TAKEN FOR EXECUTING A SELECT COUNT(*) QUERY ON OUR PROBLEMATIC V
IEW
--WITH STATISTICS DETAILS.
SQL> select count(*) from ORIGINAL_COL_VW;
1797087
1 row selected.
Elapsed: 00:00:00.52
Statistics
---------------------------------------------------------406 recursive calls
2 db block gets
2388 consistent gets
1910 physical reads
1608 redo size
529 bytes sent via SQL*Net to client
524 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
30 sorts (memory)
0 sorts (disk)
1 rows processed
--EXECUTION PLAN DETAILS WERE OMITTED.
--PLS NOTE ELAPSED TIME & VALUE FOR "consistent gets" FOR EXECUTING A QUERY AGAI
NST (RE-WRITTEN) VIEW 02.
SQL> select * from MODIFIED_COL_VW_JP2;
...
...
...

1710238 rows selected.


Elapsed: 00:10:31.55
Statistics
---------------------------------------------------------564 recursive calls
789 db block gets
134042 consistent gets
11051 physical reads
884 redo size
128500878 bytes sent via SQL*Net to client
1254688 bytes received via SQL*Net from client
114017 SQL*Net roundtrips to/from client
48 sorts (memory)
0 sorts (disk)
1710238 rows processed
SQL> select count(*) from MODIFIED_COL_VW_JP2;
1797087
1 row selected.
Elapsed: 00:00:09.56
Statistics
---------------------------------------------------------504 recursive calls
817 db block gets
22211 consistent gets
12120 physical reads
884 redo size
529 bytes sent via SQL*Net to client
524 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
64 sorts (memory)
0 sorts (disk)
1 rows processed
Further, new indexes were added on the base tables, to fine tune the MODIFIED_CO
L_VW_JP2 performance.

Vous aimerez peut-être aussi