-- 1. 오라클 버전 확인
SELECT *
FROM V$VERSION
;
BANNER
-------------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit
PL/SQL Release 10.2.0.3.0 - Production
-- 2. 테이블 생성
DROP TABLE EMP;
CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7, 2),
COMM NUMBER(7, 2),
DEPTNO NUMBER(2));
INSERT INTO EMP VALUES (7788, 'SCOTT', 'ANALYST', 7566, TO_DATE('09-DEC-1982', 'DD-MON-YYYY'), 3000, NULL, 20);
COMMIT;
-- 3. 라이브러리 캐시 비움
ALTER SYSTEM FLUSH SHARED_POOL;
-- 4. 1회 조회
SELECT /* CURSOR_TEST */
EMPNO,
ENAME,
JOB,
SAL,
DEPTNO
FROM EMP
WHERE EMPNO = 7788
;
EMPNO ENAME JOB SAL DEPTNO
---------- -------------------- ------------------ ---------- ----------
7788 SCOTT ANALYST 3000 20
1 row selected.
-- 5. V$SQL 조회
SELECT SQL_ID,
PARSE_CALLS,
LOADS,
EXECUTIONS,
INVALIDATIONS,
DECODE(SIGN(INVALIDATIONS), 1, (LOADS - INVALIDATIONS), 0) RELOADS
FROM V$SQL
WHERE SQL_TEXT LIKE '%CURSOR_TEST%'
AND SQL_TEXT NOT LIKE '%V$SQL%'
;
SQL_ID PARSE_CALLS LOADS EXECUTIONS INVALIDATIONS RELOADS
-------------------------- ----------- ---------- ---------- ------------- ----------
6gyd34836phnb 1 1 1 0 0
1 row selected.
-- 6. 2회 조회
SELECT /* CURSOR_TEST */
EMPNO,
ENAME,
JOB,
SAL,
DEPTNO
FROM EMP
WHERE EMPNO = 7788
;
EMPNO ENAME JOB SAL DEPTNO
---------- -------------------- ------------------ ---------- ----------
7788 SCOTT ANALYST 3000 20
1 row selected.
-- 7. 3회 조회
SELECT /* CURSOR_TEST */
EMPNO,
ENAME,
JOB,
SAL,
DEPTNO
FROM EMP
WHERE EMPNO = 7788
;
EMPNO ENAME JOB SAL DEPTNO
---------- -------------------- ------------------ ---------- ----------
7788 SCOTT ANALYST 3000 20
1 row selected.
-- 8. V$SQL 조회
SELECT SQL_ID,
PARSE_CALLS,
LOADS,
EXECUTIONS,
INVALIDATIONS,
DECODE(SIGN(INVALIDATIONS), 1, (LOADS - INVALIDATIONS), 0) RELOADS
FROM V$SQL
WHERE SQL_TEXT LIKE '%CURSOR_TEST%'
AND SQL_TEXT NOT LIKE '%V$SQL%'
;
SQL_ID PARSE_CALLS LOADS EXECUTIONS INVALIDATIONS RELOADS
-------------------------- ----------- ---------- ---------- ------------- ----------
6gyd34836phnb 3 1 3 0 0
1 row selected.
PARSE_CALLS | 라이브러리 캐시에서 SQL 커서를 찾으려는 요청 횟수 |
LOADS | 하드파싱을 거친 SQL 실행계획을 라이브러리 캐시에 적재한 횟수 |
EXECUTIONS | SQL을 수행한 횟수 |
INVALIDATIONS | 커서가 무효화된 횟수. 커서가 참조하고 있는 오브젝트에 중요한 변화가 일어났음을 의미함. |
-- 1. 새로 연결
conn user/password@instance
Connected.
-- 2. 4회 조회
SELECT /* CURSOR_TEST */
EMPNO,
ENAME,
JOB,
SAL,
DEPTNO
FROM EMP
WHERE EMPNO = 7788
;
EMPNO ENAME JOB SAL DEPTNO
---------- -------------------- ------------------ ---------- ----------
7788 SCOTT ANALYST 3000 20
1 row selected.
-- 3. V$SQL 조회
SELECT SQL_ID,
PARSE_CALLS,
LOADS,
EXECUTIONS,
INVALIDATIONS,
DECODE(SIGN(INVALIDATIONS), 1, (LOADS - INVALIDATIONS), 0) RELOADS
FROM V$SQL
WHERE SQL_TEXT LIKE '%CURSOR_TEST%'
AND SQL_TEXT NOT LIKE '%V$SQL%'
;
SQL_ID PARSE_CALLS LOADS EXECUTIONS INVALIDATIONS RELOADS
-------------------------- ----------- ---------- ---------- ------------- ----------
6gyd34836phnb 4 1 4 0 0
-- 1. 통계정보 생성
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(USER,
'EMP',
CASCADE => TRUE,
NO_INVALIDATE => FALSE
);
END;
/
PL/SQL procedure successfully completed.
-- 2. 5회 조회
SELECT /* CURSOR_TEST */
EMPNO,
ENAME,
JOB,
SAL,
DEPTNO
FROM EMP
WHERE EMPNO = 7788
;
EMPNO ENAME JOB SAL DEPTNO
---------- -------------------- ------------------ ---------- ----------
7788 SCOTT ANALYST 3000 20
1 row selected.
;
-- 3. V$SQL 조회
SELECT SQL_ID,
PARSE_CALLS,
LOADS,
EXECUTIONS,
INVALIDATIONS,
DECODE(SIGN(INVALIDATIONS), 1, (LOADS - INVALIDATIONS), 0) RELOADS
FROM V$SQL
WHERE SQL_TEXT LIKE '%CURSOR_TEST%'
AND SQL_TEXT NOT LIKE '%V$SQL%'
;
SQL_ID PARSE_CALLS LOADS EXECUTIONS INVALIDATIONS RELOADS
-------------------------- ----------- ---------- ---------- ------------- ----------
6gyd34836phnb 1 2 1 1 1
1 row selected.
-- 1. 옵티마이저 모드 ALL_ROWS 활성화
ALTER SESSION SET OPTIMIZER_MODE='ALL_ROWS';
-- 2. EMP 테이블 조회
SELECT * FROM EMP;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- ------------ ---------- ---------- ----------
7788 SCOTT ANALYST 7566 09-DEC-82 3000 20
1 row selected.
-- 3. 옵티마이저 모드 FIRST_ROWS 활성화
ALTER SESSION SET OPTIMIZER_MODE='FIRST_ROWS';
-- 4. EMP 테이블 조회
SELECT * FROM EMP;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- ------------ ---------- ---------- ----------
7788 SCOTT ANALYST 7566 09-DEC-82 3000 20
1 row selected.
-- 5. V$SQL 조회
SELECT SQL_ID,
CHILD_NUMBER,
OPTIMIZER_MODE,
ADDRESS,
HASH_VALUE,
PARSING_USER_ID
FROM V$SQL
WHERE SQL_TEXT LIKE '%SELECT * FROM EMP%'
AND SQL_TEXT NOT LIKE '%V$SQL%'
;
SQL_ID CHILD_NUMBER OPTIMIZER_MODE ADDRESS HASH_VALUE PARSING_USER_ID
-------------------------- ------------ -------------------- ---------------- ---------- ---------------
4ttqgu8uu8fus 0 ALL_ROWS 070000010BC93AB8 899955544 44
4ttqgu8uu8fus 1 FIRST_ROWS 070000010BC93AB8 899955544 44
-- 6. V$SQLAREA 조회
SELECT SQL_ID,
VERSION_COUNT,
OPTIMIZER_MODE,
ADDRESS,
HASH_VALUE
FROM V$SQLAREA
WHERE SQL_TEXT LIKE '%SELECT * FROM EMP%'
AND SQL_TEXT NOT LIKE '%V$SQL%'
;
SQL_ID VERSION_COUNT OPTIMIZER_MODE ADDRESS HASH_VALUE
-------------------------- ------------- -------------------- ---------------- ----------
4ttqgu8uu8fus 2 FIRST_ROWS 070000010BC93AB8 899955544
-- 1. 테이블 생성
CREATE TABLE T(C VARCHAR2(4000));
-- 2. 라이브러리 캐시 비움
ALTER SYSTEM FLUSH SHARED_POOL;
-- 3. BYTE 생성 이미지
WITH TAB AS (SELECT LPAD('A', LEVEL, '0') VAL
FROM DUAL
CONNECT BY LEVEL <= 4000)
SELECT VAL,
LENGTHB(VAL) BITE
FROM TAB
;
A 1
0A 2
00A 3
000A 4
0000A 5
00000A 6
........
-- 4. PL/SQL 스크립트
DECLARE
l_cnt NUMBER;
l_child_cnt NUMBER;
l_prev_child_cnt NUMBER;
l_bind_value VARCHAR2(4000);
l_sql_id VARCHAR2(13);
BEGIN
l_prev_child_cnt := 0;
FOR c IN 1..4000 LOOP
l_bind_value := LPAD('A', c, '0');
SELECT COUNT(*)
INTO l_cnt
FROM T
WHERE C = l_bind_value;
-- 맨 처음에만 sql_id를 찾아 출력
IF c = 1 THEN
SELECT PREV_SQL_ID
INTO l_sql_id
FROM V$SESSION
WHERE SID = USERENV('SID')
AND USERNAME IS NOT NULL
AND PREV_HASH_VALUE <> 0;
DBMS_OUTPUT.PUT_LINE('SQL_ID --> ' || l_sql_id);
END IF;
SELECT COUNT(*)
INTO l_child_cnt
FROM V$SQL
WHERE SQL_ID = l_sql_id;
IF l_prev_child_cnt < l_child_cnt THEN -- 새 Child 커서가 생길 때마다
DBMS_OUTPUT.PUT_LINE(c);
l_prev_child_cnt := l_child_cnt;
END IF;
END LOOP;
END;
/
SQL_ID --> f6qwn8zavty07
1
33
129
2001
-- 5. V$SQL_SHARED_CURSOR 조회
SELECT CHILD_NUMBER,
BIND_MISMATCH
FROM V$SQL_SHARED_CURSOR
WHERE SQL_ID = 'f6qwn8zavty07'
ORDER BY CHILD_NUMBER
;
CHILD_NUMBER BI
------------ --
0 N
1 Y
2 Y
3 Y
4 rows selected.
SELECT * FROM CUSTOMER;
SELECT * FROM CUSTOMER;
SELECT * FROM CUSTOMER;
SELECT * FROM Customer;
SELECT * FROM CUSTOMER;
SELECT * FROM HR.CUSTOMER;
SELECT * FROM CUSTOMER;
SELECT /* 주석문 */ * FROM CUSTOMER;
SELECT * FROM CUSTOMER;
SELECT /*+ ALL_ROWS */ * FROM CUSTOMER;
SELECT * FROM CUSTOMER WHERE CUST_ID = '0000001';
SELECT * FROM CUSTOMER WHERE CUST_ID = '0000002';
- 강좌 URL : http://www.gurubee.net/lecture/3035
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.