Você está na página 1de 8

Oracle Tuning

Pgina 1 de 8

Oracle Tuning
Version 10.2
General
Question:
How does the latch process in the shared pool work?
Answer:

1.
2.
3.
4.
5.
6.

Compute the hash value of the statement


Use the hash value to determine the part of the shared pool to be latched (locked)
Find the statement (if already in the Shared Pool)
If not present hard-parse the statement (syntax and lexical check, privilege check,
optimize)
If it is present skip the syntax and lexical check. Perform the privilege check and optimize
Release the latch

Hinting
Full Hinting Demo

CREATE TABLE t1 AS
SELECT * FROM all_objects
WHERE ROWNUM = 1;
ALTER TABLE t1
ADD CONSTRAINT pk_t1
PRIMARY KEY(object_id)
USING INDEX;
CREATE TABLE t2 AS
SELECT * FROM all_objects;
ALTER TABLE t2
ADD CONSTRAINT pk_t2
PRIMARY KEY(object_id)
USING INDEX;
exec dbms_stats.gather_table_stats
('UWCLASS', 'T1', CASCADE=>TRUE);
exec dbms_stats.gather_table_stats
('UWCLASS', 'T2', CASCADE => TRUE);
ALTER SESSION SET
tracefile_identifier='base plan';
ALTER SESSION SET EVENTS '10053 trace
name context forever,level 1';
ALTER SESSION SET EVENTS '10046 trace
name context forever,level 1';
SELECT COUNT(*)
FROM t2, t1
WHERE t1.object_id = t2.object_id
AND t2.owner='UWCLASS';

http://www.psoug.org/reference/tuning.html

14/9/2007

Oracle Tuning

Pgina 2 de 8

ALTER SESSION SET


tracefile_identifier='hinted plan';
SELECT /*+ use_nl(hint2 hint1) */ COUNT
(*)
FROM t2, t1
WHERE t1.object_id = t2.object_id
AND t2.owner='UWCLASS';
ALTER SESSION SET
tracefile_identifier='fully hinted
plan';
SELECT /*+ ordered use_nl(hint2 hint1)
*/ COUNT(*)
FROM t2, t1
WHERE t1.object_id = t2.object_id
AND t2.owner='UWCLASS';
ALTER SESSION SET EVENTS '10053 trace
name context off';
Memory Optimization
set linesize 121
col name format a30
col value format a30

Setting
CURSOR_SPACE_FOR_TIME
parameter
Improves performance at the
expense of using more
memory

SELECT name, value


FROM gv$parameter
WHERE name LIKE '%cursor%';
ALTER SYSTEM SET cursor_space_for_time
= TRUE SCOPE=SPFILE;
shutdown immediate
startup
SELECT name, value
FROM gv$parameter
WHERE name LIKE '%cursor%';

NULL and the CBO


The CBO makes different
decisions based on whether it
is possible for a column to
contains NULLs

CREATE TABLE t (
rid NUMBER(12),
col1 VARCHAR2(30),
col2 VARCHAR2(300));
ALTER TABLE t
ADD CONSTRAINT pk_t

http://www.psoug.org/reference/tuning.html

14/9/2007

Oracle Tuning

Pgina 3 de 8

PRIMARY KEY(rid)
USING INDEX
PCTFREE 0;
CREATE INDEX ix_t_col1
ON t(col1)
PCTFREE 0;
CREATE SEQUENCE seq_t_rid;
INSERT INTO t
SELECT seq_t_rid.NEXTVAL,
dbms_crypto.randombytes(15),
dbms_crypto.randombytes(150)
FROM dual
CONNECT BY LEVEL<=100000;
COMMIT;
SELECT *
FROM t
WHERE rownum < 11;
exec dbms_stats.gather_table_stats
(USER, 'T', CASCADE=>TRUE);
EXPLAIN PLAN FOR
SELECT DISTINCT rid FROM t;
set linesize 121
SELECT * FROM TABLE
(dbms_xplan.display);
EXPLAIN PLAN FOR
SELECT DISTINCT col1 FROM t;
SELECT * FROM TABLE
(dbms_xplan.display);
ALTER TABLE t
MODIFY col1 NOT NULL;
EXPLAIN PLAN FOR
SELECT DISTINCT col1 FROM t;
SELECT * FROM TABLE
(dbms_xplan.display);
NULL Pruning
NULL Pruning

CREATE TABLE parent (


parent_id NUMBER(10),

http://www.psoug.org/reference/tuning.html

14/9/2007

Oracle Tuning

Pgina 4 de 8

first_name VARCHAR2(20),
last_name VARCHAR2(20));
CREATE TABLE child (
child_id NUMBER(10),
parent_id NUMBER(10),
birth_date DATE);
BEGIN
FOR i IN 1..500000
LOOP
INSERT INTO parent VALUES (i,
'Daniel', 'Morgan');
INSERT INTO child VALUES (i*2, i,
SYSDATE);
INSERT INTO child VALUES (i*3, i,
SYSDATE);
INSERT INTO child VALUES (i*4, i,
SYSDATE);
END LOOP;
COMMIT;
END;
/
UPDATE child
SET birth_date = NULL
WHERE TO_CHAR(child_id) LIKE '%2';
UPDATE child
SET birth_date = NULL
WHERE TO_CHAR(child_id) LIKE '%6';
COMMIT;
SELECT 'Is Not Null', COUNT(*)
FROM child
WHERE birth_date IS NOT NULL
UNION
SELECT 'Is Null', COUNT(*)
FROM child
WHERE birth_date IS NULL;
SELECT birth_date, COUNT(*)
FROM child
GROUP BY birth_date;
CREATE INDEX ix_child_dob
ON child(birth_date)
PCTFREE 0;
exec dbms_stats.gather_table_stats
('UWCLASS', 'PARENT');
exec dbms_stats.gather_table_stats

http://www.psoug.org/reference/tuning.html

14/9/2007

Oracle Tuning

Pgina 5 de 8

('UWCLASS', 'CHILD');
set timing on
SELECT COUNT(*)
FROM parent p, child c
WHERE p.parent_id = c.parent_id;
SELECT COUNT(*)
FROM parent p, child c
WHERE p.parent_id = c.parent_id
AND birth_date is NOT NULL;
Optimizing Joins
Some joins are better than
others

conn scott/tiger
exec dbms_stats.gather_schema_stats
(USER, cascade=>TRUE);
set autotrace on
SELECT DISTINCT d.deptno, d.dname
FROM dept d, emp e
WHERE e.deptno = d.deptno
ORDER BY 1;
SELECT d.deptno, d.dname
FROM dept d
WHERE EXISTS (
SELECT NULL
FROM emp e
WHERE e.deptno = d.deptno)
ORDER BY 1;
CREATE INDEX ix_emp_deptno
ON emp(deptno);
exec dbms_stats.set_table_stats(USER,
'EMP', numrows=>1000000,
numblks=>10000, avgrlen=>74);
exec dbms_stats.set_index_stats(USER,
'ix_emp_deptno', numrows=>1000000,
numlblks=>1000, numdist=>10000,
clstfct=>1);
exec dbms_stats.set_column_stats(USER,
'emp', 'deptno', distcnt=>10000);
exec dbms_stats.set_table_stats(USER,
'dept', numrows=>100, numblks=>100);

http://www.psoug.org/reference/tuning.html

14/9/2007

Oracle Tuning

Pgina 6 de 8

-- repeat queries
exec dbms_stats.set_table_stats(USER,
'dept', numrows=>100000,
numblks=>10000);
-- again repeat queries
Parsing
Parsing Efficiency

CREATE TABLE t (
mycol NUMBER(5));
set timing on
BEGIN
FOR i IN 1 .. 10000
LOOP
EXECUTE IMMEDIATE 'INSERT INTO t
VALUES (:x)'
USING i;
END LOOP;
END;
/
DECLARE
cur
PLS_INTEGER :=
dbms_sql.open_cursor;
str
VARCHAR2(200);
retval NUMBER;
BEGIN
FOR i IN 10001 .. 20000
LOOP
str := 'INSERT INTO t VALUES (' ||
TO_CHAR(i) || ')';
dbms_sql.parse(cur, str,
dbms_sql.native);
RetVal := dbms_sql.execute(cur);
END LOOP;
dbms_sql.close_cursor(cur);
END;
/
DECLARE
cur
PLS_INTEGER :=
dbms_sql.open_cursor;
str
VARCHAR2(200);
retval NUMBER;
BEGIN
str := 'INSERT INTO t VALUES (:x)';
dbms_sql.parse(cur, str,
dbms_sql.native);
FOR i IN 20001 .. 30000

http://www.psoug.org/reference/tuning.html

14/9/2007

Oracle Tuning

Pgina 7 de 8

LOOP
dbms_sql.bind_variable(cur,':x',
i);
RetVal := dbms_sql.execute(cur);
END LOOP;
dbms_sql.close_cursor(cur);
END;
/
BEGIN
FOR i IN 30001..40000
LOOP
INSERT INTO t VALUES (i);
END LOOP;
END;
/
-- 0.35 seconds
set timing off
SQL Statements
set
col
col
col
col
col

linesize 131
object format a20
object_type format a11
owner format a20
username format a10
osuser format a25

Access Objects

SELECT a.object, a.type OBJECT_TYPE ,


a.owner, s.username, s.osuser,
s.status, s.type USER_TYPE
FROM gv$access a, gv$session s
WHERE a.sid = s.sid
ORDER BY 2,1;
desc gv$resource_limit

Resources

set linesize 121


col event format a30
SELECT *
FROM gv$resource_limit
ORDER BY 2, 1;
desc gv$ses_optimizer_env

Session Environment

set linesize 121


col event format a30
SELECT s.inst_id, oe.sid, id, name,
isdefault, value
FROM gv$ses_optimizer_env oe,

http://www.psoug.org/reference/tuning.html

14/9/2007

Oracle Tuning

Pgina 8 de 8

gv$session s
WHERE oe.sid = s.sid
AND s.service_name <> 'SYS$BACKGROUND';
SELECT sid, schemaname
FROM gv$session
ORDER BY 2;

Wait Times

set linesize 121


col event format a30
SELECT inst_id, seq#, event, p1, p2,
p3, wait_time
FROM gv$session_wait_history
WHERE sid = 158;
set linesize 121
col username format a8
col name format a60

What happened during the


execution of a SQL statement

SELECT s.sid, s.serial#, s.username,


sn.name, ms.value
FROM gv$statname sn, gv$mystat ms,
gv$session s
WHERE MS.SID = s.sid
AND ms.statistic# = sn.statistic#
ORDER BY 4;
-- run your SQL statement here
SELECT s.sid, s.serial#, s.username,
sn.name, ms.value
FROM gv$statname sn, gv$mystat ms,
gv$session s
WHERE MS.SID = s.sid
AND ms.statistic# = sn.statistic#
ORDER BY 4;
Related Topics
Bind Variables
Clustering Factor
Cursor Sharing
DBMS_PROFILER
DBMS_SQLTUNE
DBMS_STATS
Explain Plan
Hints
Histograms
Indexes
TKPROF & Tracing
Contact Us

http://www.psoug.org/reference/tuning.html

Legal Notices and Terms of Use

Privacy Statement

14/9/2007

Você também pode gostar