Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
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
Setting
CURSOR_SPACE_FOR_TIME
parameter
Improves performance at the
expense of using more
memory
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
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
Resources
Session Environment
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
http://www.psoug.org/reference/tuning.html
Privacy Statement
14/9/2007