#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)탑크리에듀(구로디지털단지역3번출구 2분거리)탑크리에듀교육센터(topcredu.co.kr)제공
1-1. 오라클, 데이터베이스관련 용어, 1-2. 오라클 에디션(ORACLE EDITION), 1-3. 오라클 버전 변화 등.. 개요 및 실습데이터 설치에 관련하여 설명 한 자료입니다. 많은 도움 되시길 바랍니다.^^
2.1 optimizer mode를 변경하는 힌트(rule)탑크리에듀(구로디지털단지역3번출구 2분거리)규칙 기반 옵티마이저(Rule-Based Optimizer)로 동작하여 실행 계획을 세우도록 하는 힌트인데 이 경우 테이블이나 인덱스의 통계 정보가 있다고 하더라도 무시하고 사용하지 않으며 규칙에 기반한 실행 계획을 세우게 된다.
옵티마이저는 순위가 매겨진 오퍼레이션에 근거하여 실행 계획을 세우며 순위가 높은 것이 우선 적용된다.
만약 SQL 문장에서 /*+ RULE INDEX(emp idx_ename) */ 와 같이 RULE 힌트와 다른 힌트가 같이 사용된다면 RULE 힌트만 적용되므로 주의하자.
#25.SQL초보에서 Schema Objects까지_구로IT학원/국비지원IT학원추천/구로디지털단지IT학원/재직자환급교육추천탑크리에듀(구로디지털단지역3번출구 2분거리)탑크리에듀교육센터(topcredu.co.kr)에서 제공하는 자료입니다.
SQL초보에서 Schema Objects까지 25번째 자료입니다.
단일/복합(결합) 인덱스(Single Column/Composite Index),고유/비고유 인덱스(Unique/Non Unique Index), Descending Index, 함수기반 인덱스(Function Based Index), 인덱스 재구성 및 삭제, 인덱스 숨기기(Index Invisible)에 대하여 설명한 자료이오니 확인 후 많은 도움 되셨길 바랍니다^^.
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)탑크리에듀(구로디지털단지역3번출구 2분거리)탑크리에듀교육센터(topcredu.co.kr)제공
1-1. 오라클, 데이터베이스관련 용어, 1-2. 오라클 에디션(ORACLE EDITION), 1-3. 오라클 버전 변화 등.. 개요 및 실습데이터 설치에 관련하여 설명 한 자료입니다. 많은 도움 되시길 바랍니다.^^
2.1 optimizer mode를 변경하는 힌트(rule)탑크리에듀(구로디지털단지역3번출구 2분거리)규칙 기반 옵티마이저(Rule-Based Optimizer)로 동작하여 실행 계획을 세우도록 하는 힌트인데 이 경우 테이블이나 인덱스의 통계 정보가 있다고 하더라도 무시하고 사용하지 않으며 규칙에 기반한 실행 계획을 세우게 된다.
옵티마이저는 순위가 매겨진 오퍼레이션에 근거하여 실행 계획을 세우며 순위가 높은 것이 우선 적용된다.
만약 SQL 문장에서 /*+ RULE INDEX(emp idx_ename) */ 와 같이 RULE 힌트와 다른 힌트가 같이 사용된다면 RULE 힌트만 적용되므로 주의하자.
#25.SQL초보에서 Schema Objects까지_구로IT학원/국비지원IT학원추천/구로디지털단지IT학원/재직자환급교육추천탑크리에듀(구로디지털단지역3번출구 2분거리)탑크리에듀교육센터(topcredu.co.kr)에서 제공하는 자료입니다.
SQL초보에서 Schema Objects까지 25번째 자료입니다.
단일/복합(결합) 인덱스(Single Column/Composite Index),고유/비고유 인덱스(Unique/Non Unique Index), Descending Index, 함수기반 인덱스(Function Based Index), 인덱스 재구성 및 삭제, 인덱스 숨기기(Index Invisible)에 대하여 설명한 자료이오니 확인 후 많은 도움 되셨길 바랍니다^^.
3.4 실행계획 SQL 연산 (Hash Anti-Join)탑크리에듀(구로디지털단지역3번출구 2분거리)ANTI 조인은 조인의 대상이 되는 테이블과 일치하지 않는 데이터를 추출하는 연산으로 SQL연산에서 NOT IN, NOT EXISTS, MINUS 등이 있을 때 나타나는 실행계획 연산자이다. 안티 조인은 NESTED LOOP ANTI-JOIN, MERGE ANTI-JOIN 또는 HASH ANTI_JOIN으로 풀리도록 할 수 있는데 대체로 HASH ANTI_JOIN이 성능상 좋다.
1.7 튜닝의도구 sql autorace탑크리에듀(구로디지털단지역3번출구 2분거리)SQL*Plus에서 사용자는 자동으로 Optimizer가 만드는 실행계획과 통계정보를 얻을 수 있다. 이런 경우 AUTOTRACE를 사용하며 DML문을 성공적으로 수행 시 실행계획과 통계정보가 만들어지며 DML문의 성능 튜닝을 위한 방법으로 자주 이용된다.
SET AUTOTRACE를 사용하기 위해선 실행 계획용 테이블(PLAN_TABLE)이 존재해야 하며 구문을 활성화하기 위해 SET AUTOTRACE ON, 비활성화 하기 위해 SET AUTOTRACE OFF하면 된다. 참고로 SET AUTOTRACE에서 사용할 수 있는 옵션은 다음과 같다.
3.2 실행계획 sql 연산 (concatenation)탑크리에듀(구로디지털단지역3번출구 2분거리)-- 먼저 EMP에 테이블에 생성되어 있는 인덱스 및 칼럼을 확인하자.
SQL> SELECT a.index_name, a.column_name, b.visibility
FROM user_ind_columns a, user_indexes b
WHERE a.table_name = 'EMP'
AND a.index_name = b.index_name ;
-- 인덱스가 없다면 생성, 있으면 SKIP
SQL> CREATE INDEX idx_emp_job ON EMP(job);
SQL> CREATE INDEX idx_emp_deptno ON EMP(deptno);
1.8 튜닝의도구 dbms xplan탑크리에듀(구로디지털단지역3번출구 2분거리) 오라클9i 이후 사용가능한 DBMS_XPLAN 패키지는 실행계획을 DISPLAY하고, 포맷을 주기 위해 사용된다.
DBMS_XPLAN을 사용하기 위해서는 PLAN_TABLE이 존재해야 한다.
3.3 실행계획 SQL 연산 (Count,Count Stopkey/Filter)탑크리에듀(구로디지털단지역3번출구 2분거리)FILTER 연산은 데이터 추출 시 필터링이 일어나고 있음을 알려주는 SQL ROW 연산인데 WHERE 조건 절에서 인덱스를 사용하지 못할 때 발생한다. NESTED LOOP 방식으로 해석할 수 있는데 서브쿼리라면 메인쿼리 로우를 하나씩 읽을때 마다 서브쿼리를 한 번씩 실행하는 형태이다.
FILTER OPERATION은 IN, NOT IN, EXISTS, NOT EXISTS 를 사용하는 경우 발견할 수 있는 OPERATION이며 중첩 루프조인(Nedted Loop Join)과 유사하게 움직인다. 메인쿼리의 결과에 대해 서브쿼리의 결과값을 버퍼에 임시저장해 같거나 다른 것을 찾아 나가는 방식이다. 이러한 과정이 드라이빙되는 테이블의 각 로우에 대해 일어나기 때문에 NESTED LOOP JOIN과 유사하다고 볼 수있다.
6.4 hints for access paths(index)탑크리에듀(구로디지털단지역3번출구 2분거리) INDEX 힌트는 테이블의 칼럼에 대해 생성되어 있는 인덱스를 사용할 수 있도록 해주는 힌트 구문으로 비트맵 인덱스에 대해서도 사용이 가능하지만 Bitmap Index는 INDEX_COMBINE 사용하는 것이 원칙이다.
인덱스 영역에서 인덱스가 생성된 형태대로 순방향 스캐닝 하므로 INDEX_ASC와 동일하다.
대량의 데이터라면 ORDER BY의 사용을 자제하고 인덱스를 적절히 이용하자.
3.5 실행계획 SQL 연산 (HASH SEMI-JOIN)탑크리에듀(구로디지털단지역3번출구 2분거리)세미 조인은 보통 EXISTS를 사용하는 서브쿼리의 형태로 나타나며 이러한 경우 서브 쿼리에 인덱스가 존재하지 않는다면 상당히 비효율적인데 SEMI-JOIN이 일어나도록 유도한다면 성능의 향상을 꽤 할 수 있다. 즉 인덱스 없이 EXISTS를 사용하는 쿼리라면 HASH_SJ or MERGE_SJ or NL_SJ 힌트를 이용해서 세미조인이 일어나도록 푸는 것이 좋다.
1.11 실행계획 해석 predicate탑크리에듀(구로디지털단지역3번출구 2분거리)predicate란 인덱스 접근시의 컬럼 액세스 정보, 조인 정보, filter 정보를 각 Opreation 단위로 나타낸 것이다.
access predicate : 데이터 블록을 어떤 방식으로 Access해서 읽었는지를 나타내는 것이다.
filter predicate : 데이터 블록을 읽고 나서 데이터를 어떻게 필터링 했는지를 나타낸다.
MySQL Performance Tuning (In Korean)OracleMySQL이번 웨비나에서는 여러분에게 MySQL 성능 튜닝에 대한 깊이 있는 소개를 통해 많은 경험과 전문지식을 배울 수 있는 기회를 제공할 것입니다. 모범 사례를 검토하고 가장 중요한 설정, 초기 MySQL 설정파일, 모니터링 및 그 밖의 것을 다룰 것입니다.
MySQL Workbench, MySQL Enterprise Monitor, 또는 sys schema에서 제공하는 성능 리포트를 이용하여 최적화가 필요한 쿼리를 어떻게 찾는지 배워봅시다.
Amazon Redshift Deep Dive - Serverless, Streaming, ML, Auto Copy (New feature...Amazon Web Services Korea이 세션에 참여하여 Amazon Redshift의 새로운 기능을 자세히 살펴보십시오. Amazon Data Sharing, Amazon Redshift Serverless, Redshift Streaming, Redshift ML 및 자동 복사 등에 대한 자세한 내용과 데모를 통해 Amazon Redshift의 새로운 기능을 알고 싶은 사용자에게 적합합니다.
What's New of MBD for ANSYS 18.2Sangtae (김상태) KimThis document shows the new features of MBD for ANSYS 18.2
MBD for ANSYS is an add-on module of ANSYS workbench for multi-body dynamics.
Sql기초강좌2_SET AUTOTRACE_SQL교육탑크리에듀(구로디지털단지역3번출구 2분거리)SQL*Plus에서 사용자는 자동으로 Optimizer에서 실행계획과 통계정보를 얻을 수 있다. AUTOTRACE를 사용하며 DML문을 성공적으로 수행 시 만들어지며 DML문의 성능 튜닝을 위한 방법으로 자주 이용 된다.
SET AUTOTRACE를 사용하기 위해선 실행 계획용 테이블(PLAN_TABLE)이 존재해야 하며 구문을 활성화 하기 위해 SET AUTOTRACE ON, 비활성화 하기위해 SET AUTOTRACE OFF하고 하면 됩니다. 참고로 SET AUTOTRACE에서 사용 할 수 있는 옵션은 다음과 같다.
System Capa Planning_DBA oracle edu엑셈This document provides recommendations for system capacity planning for an Oracle database:
- Plan for 1 CPU per 200 concurrent users and prefer medium speed CPUs over fewer faster CPUs.
- Reserve 10% of memory for the operating system and allocate 220 MB for the Oracle SGA and 3 MB per user process.
- Use striped and mirrored or striped with parity RAID for disks. Consider raw devices or SANs if possible.
- Ensure the network capacity is adequate based on site size.
Bind Peeking 한계에 따른 Adaptive Cursor Sharing 등장_Wh oracle
1. 124│2013 기술백서 White Paper
Bind Peeking 한계에 따른 Adaptive Cursor Sharing
등장
㈜엑셈 컨설팅본부/DB컨설팅팀 김 철환
Bind Peeking 의 한계
SQL 이 최초 실행되면 3 단계의 과정을 거치게 되는데 Parsing 단계를 거쳐 Execute 하고
Fetch 의 과정을 통해 데이터를 사용자에게 전송하게 되며 Parsing 단계에서 실행계획이 생성
된다. Bind 변수를 사용하는 SQL 에서 실행계획이 생성될 때 실제로 사용 되는 변수 값을 모르
기 때문에 성능에 문제를 발생 시킬 수 있는 실행계획이 세워질 수 있다.
이런 Bind 변수의 단점을 보완하기 위해 10g 에서 Bind Peeking 이라는 기능이 소개되었는데
Bind 변수를 사용하는 SQL 에서 최초 실행 되는 시점의 실제 Bind 값이 무엇이냐에 따라 실행
계획이 결정 되는 것을 말한다. 이렇게 되면 실제 사용되는 Bind 변수의 값을 이용해 실행계획
을 세울 수 있어 보다 성능에 유리한 실행계획을 세울 수 있을 것이라 생각 되지만 Bind
Peeking 또한 한계를 가지고 있다.
최초에 Bind 변수 값에 따라서 실행계획이 고정 되기 때문에 최초 값이 SQL 의 성능을 결정하게
되어 Table Full Scan 으로 실행 계획이 생성 되었다면 이 SQL 은 새로운 실행계획이 생성되기
전까지 Table Full Scan 이 발생하게 된다. 이러한 문제로 이 기능은 전혀 사용하지 못하는 기능
이 되어 버렸다. 결국 Bind 변수의 단점을 보완 하기 위해 Bind Peeking 이라는 기능이 소개되
었지만 여전히 이 기능도 한계를 가지고 있다.
진화된 Cursor Sharing 필요
이러한 Bind Peeking 기능의 한계를 보완하기 위해서 Oracle 11g 에서는 Adaptive Cursor
Sharing (적응적 커서 공유) 이라는 기능이 소개 되었는데 Adaptive Cursor Sharing 뜻은 상
황에 맞게 유연하게 Cursor Share 하겠다는 의미이다. 기능을 사용하게 되면 여러 개의 실행계
2. Part 1 ORACLE │125
획을 관리 할 수 있는데 최초 입력된 값에 의해 실행계획이 결정 되더라고 이후에 새로운 Bind
변수 값이 사용되면 이에 맞게 적절한 실행계획을 선택하여 SQL 을 실행 하게 된다. 즉 Bind
Peeking 의 한계를 보완한 것이다.
Cursor Sharing 동작 원리
이 기능이 동작하려면 기본적으로 조건 Column 에 히스토그램이 생성되어 있어야 한다. 그 상
태에서 Bind 변수가 포함된 쿼리를 실행하였을 때, 옵티마이저가 히스토그램 분포도에 따라 실
행 계획이 크게 달라질 것이라 판단한다면, 해당 커서를 Bind Sensitive 커서라는 상태로 두게
된다. 이러한 Bind Sensitive 커서에 해당하는 구문이 재차 실행되었을 때에, 특정 변수 값에서
성능이 크게 저하되었다고 판단되면 해당 커서를 Bind Aware 커서 상태로 바꾼다. 이 상태가
되면, 종전의 성능 저하된다 판단된 커서에 대해서는 기존의 실행 계획을 사용하지 않고, child
커서를 생성하고 새로운 실행 계획을 생성하여 저장하게 되고 새로운 실행 계획을 생성해낸 뒤
에는 선택도가 비슷한 것으로 판단되는 Cursor 는 같은 실행 계획을 사용하게 된다.
Adaptive Cursor Sharing 설정 방법
Adaptive Cursor Sharing 기능을 설정하는 방법을 알아 보자.
Parameter 을 이용한 Adaptive Cursor Sharing 설정
Adaptive Cursor Sharing 기능을 사용할 지의 여부를 지정하며 기본값은 True 이다.
Alter [ System |Session ] Set "_optimizer_adaptive_cursor_sharing" = TRUE;
통계정보 수집을 하여 Histogram을 사용 할 수 있어야 함.
Adaptive Cursor Sharing 기능을 사용하기 위해서는 입력 되는 변수들의 분포도를 알아야 하
는데 그 정보는 Histogram 을 통해 알 수 있다.
3. 126│2013 기술백서 White Paper
EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, TABLE , ESTIMATE_PERCENT=>100,
METHOD_OPT=>'FOR COLUMNS SIZE ');
Adaptive Cursor Sharing 고려사항
Adaptive Cursor Sharing 을 사용하지 않을 경우에는 쿼리가 실행될 때마다 캐시에 저장된 실
행 계획을 실행하게 되지만 Adaptive Cursor Sharing 을 사용하게 되면 Bind 변수의 값이 변경
되었을 때 실행 계획을 재 작성 해야 하는지의 여부를 판단 하게 된다. 이 기능을 모든 SQL 이
사용하게 된다면 시스템에 많은 과부하가 발생하게 된다. 따라서 모든 SQL 에 대해서 이 기능을
사용하기 보다는 Parameter 을 False 적용한 후에 이 기능이 꼭 필요한 SQL 에서 세션 단위로
Parameter 을 True 로 변경하여 사용하는 것이 좋다.
Adaptive Cursor Sharing 활용 방안
조회하는 SQL 에서 조회 조건의 Column 의 중복 값의 분포가 고르지 못하여 실행 계획을 분리
해야 하는 경우가 있는데 같은 SQL 에서 입력 값에 따라 Index Scan 이나 Full Table Scan 을
배타적으로 실행해야 성능에 유리한 경우가 있다. 이러한 경우 Adaptive Cursor Sharing 기능
을 사용하게 되면 입력 값에 따라 최적에 실행 계획을 생성 하여 SQL 의 성능을 향상 시킬 수 있
다.
테스트 데이터 생성
ACCT_NO 값이 각각 10 만 건과 10 건으로 데이터를 생성해 보았다.
CREATE TABLE TB_DPS_TRSC_BASE AS
SELECT 1 ACCT_NO, 'BANK' CUST_NO , ROUND(DBMS_RANDOM.VALUE(10,100)) AMT
FROM DUAL
CONNECT BY LEVEL <= 100000;
INSERT INTO TB_DPS_TRSC_BASE SELECT 99,'NAME',ROUND(DBMS_RANDOM.VALUE(10,100) FROM
ALL_OBJECTS WHERE ROWNUM <= 10;
COMMIT;
인덱스 생성
CREATE INDEX TB_DPS_TRSC_BASE_1IX ON TB_DPS_TRSC_BASE (ACCT_NO) ;
Parameter 설정
4. Part 1 ORACLE │127
Alter Session Set "_optimizer_adaptive_cursor_sharing" = TRUE ;
통계정보를 생성하지 않고 10 만 건의 경우와 10 건의 경우를 테스트
SELECT TABLE_NAME,COLUMN_NAME,HISTOGRAM FROM DBA_TAB_COLS WHERE
TABLE_NAME='TB_DPS_TRSC_BASE';
TABLE_NAME COLUMN_NAME HISTOGRAM
------------------------- ------------------------- ---------------
TB_DPS_TRSC_BASE ACCT_NO NONE
TB_DPS_TRSC_BASE CUST_NO NONE
TB_DPS_TRSC_BASE AMT NONE
-- 테스트를 위해 Shared pool 을 Flush 한다.
ALTER SYSTEM FLUSH SHARED_POOL;
EXEC :A1 := 99;
SELECT *
FROM TB_DPS_TRSC_BASE A
WHERE ACCT_NO = :A1
----------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
----------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 10 |00:00:00.01 | 3 |
| 1 | TABLE ACCESS BY INDEX ROWID| TB_DPS_TRSC_BASE | 1 | 33467 | 10 |00:00:00.01 | 3 |
|* 2 | INDEX RANGE SCAN | IND_01 | 1 | 33467 | 10 |00:00:00.01 | 2 |
----------------------------------------------------------------------------------------------------------
-- SQL 의 실행계획이 변경될 수 없어 "N" 값으로 표시 됨.
SELECT CHILD_NUMBER, EXECUTIONS, BUFFER_GETS, IS_BIND_SENSITIVE, IS_BIND_AWARE
FROM V$SQL
WHERE SQL_ID = '%48barbrzj2a30';
CHILD_NUMBER EXECUTIONS BUFFER_GETS IS_BIND_SENSITIVE IS_BIND_AWARE
------------ ---------- ----------- ----------------- -------------
0 1 3 N N
EXEC :A1 := 1;
SELECT *
FROM TB_DPS_TRSC_BASE A
WHERE ACCT_NO = :A1
5. 128│2013 기술백서 White Paper
----------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
----------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 100K |00:00:00.01 | 34454 |
| 1 | TABLE ACCESS BY INDEX ROWID| TB_DPS_TRSC_BASE | 1 | 33467 | 100K |00:00:00.01 | 34454 |
|* 2 | INDEX RANGE SCAN | IND_01 | 1 | 33467 | 100K |00:00:00.01 | 32 |
----------------------------------------------------------------------------------------------------------
SELECT CHILD_NUMBER, EXECUTIONS, BUFFER_GETS, IS_BIND_SENSITIVE, IS_BIND_AWARE
FROM V$SQL
WHERE SQL_ID = '%48barbrzj2a30';
CHILD_NUMBER EXECUTIONS BUFFER_GETS IS_BIND_SENSITIVE IS_BIND_AWARE
------------ ---------- ----------- ----------------- -------------
0 1 34454 N N
EXEC :A1 := 1;
SELECT *
FROM TB_DPS_TRSC_BASE A
WHERE ACCT_NO = :A1
----------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
----------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 100K |00:00:00.01 | 34454 |
| 1 | TABLE ACCESS BY INDEX ROWID| TB_DPS_TRSC_BASE | 1 | 33467 | 100K |00:00:00.01 | 34454 |
|* 2 | INDEX RANGE SCAN | IND_01 | 1 | 33467 | 100K |00:00:00.01 | 32 |
----------------------------------------------------------------------------------------------------------
SELECT CHILD_NUMBER, EXECUTIONS, BUFFER_GETS, IS_BIND_SENSITIVE, IS_BIND_AWARE
FROM V$SQL
WHERE SQL_ID = '%48barbrzj2a30';
CHILD_NUMBER EXECUTIONS BUFFER_GETS IS_BIND_SENSITIVE IS_BIND_AWARE
------------ ---------- ----------- ----------------- -------------
0 1 34454 N N
통계정보가 존재 하지 않기 때문에 Adaptive Cursor Sharing 기능을 사용 할 수 없어 동일한 실행
계획이 수립되어 실행 된다.(Index Rang Scan )
통계정보 생성하여 10 만 건의 경우와 10 건의 경우를 테스트
EXEC DBMS_STATS.GATHER_TABLE_STATS('SYSTEM','TB_DPS_TRSC_BASE', ESTIMATE_PERCENT=>100,
METHOD_OPT=>'FOR COLUMNS SIZE 2 ACCT_NO');
SELECT TABLE_NAME,COLUMN_NAME,HISTOGRAM FROM DBA_TAB_COLS WHERE
TABLE_NAME='TB_DPS_TRSC_BASE';
6. Part 1 ORACLE │129
TABLE_NAME COLUMN_NAME HISTOGRAM
------------------------- ------------------------- ---------------
TB_DPS_TRSC_BASE ACCT_NO HEIGHT BALANCED
TB_DPS_TRSC_BASE CUST_NO NONE
TB_DPS_TRSC_BASE AMT NONE
ALTER SYSTEM FLUSH SHARED_POOL;
EXEC :A1 := 99;
SELECT *
FROM TB_DPS_TRSC_BASE A
WHERE ACCT_NO = :A1
----------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
----------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 10 |00:00:00.01 | 3 |
| 1 | TABLE ACCESS BY INDEX ROWID| TB_DPS_TRSC_BASE | 1 | 33467 | 10 |00:00:00.01 | 3 |
|* 2 | INDEX RANGE SCAN | IND_01 | 1 | 33467 | 10 |00:00:00.01 | 2 |
----------------------------------------------------------------------------------------------------------
-- SQL 의 실행계획이 변경될 수 있다면 IS_BIND_SENSITIVE 값이 "Y" 로 나타난다.(Bind 변수 값이
있으면 "Y" 로 표시됨.)
SELECT CHILD_NUMBER, EXECUTIONS, BUFFER_GETS, IS_BIND_SENSITIVE, IS_BIND_AWARE
FROM V$SQL
WHERE SQL_ID = '%48barbrzj2a30';
CHILD_NUMBER EXECUTIONS BUFFER_GETS IS_BIND_SENSITIVE IS_BIND_AWARE
------------ ---------- ----------- ----------------- -------------
0 1 3 Y N
EXEC :A1 := 1;
SELECT *
FROM TB_DPS_TRSC_BASE A
WHERE ACCT_NO = :A1
----------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
----------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 100K |00:00:00.01 | 34454 |
| 1 | TABLE ACCESS BY INDEX ROWID| TB_DPS_TRSC_BASE | 1 | 33467 | 100K |00:00:00.01 | 34454 |
|* 2 | INDEX RANGE SCAN | IND_01 | 1 | 33467 | 100K |00:00:00.01 | 32 |
----------------------------------------------------------------------------------------------------------
SELECT CHILD_NUMBER, EXECUTIONS, BUFFER_GETS, IS_BIND_SENSITIVE, IS_BIND_AWARE
FROM V$SQL
WHERE SQL_ID = '%48barbrzj2a30';
7. 130│2013 기술백서 White Paper
CHILD_NUMBER EXECUTIONS BUFFER_GETS IS_BIND_SENSITIVE IS_BIND_AWARE
------------ ---------- ----------- ----------------- -------------
0 1 34454 Y N
EXEC :A1 := 1;
SELECT *
FROM TB_DPS_TRSC_BASE A
WHERE ACCT_NO = :A1
------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 100K|00:00:00.06 | 6887 |
|* 1 | TABLE ACCESS FULL| TB_DPS_TRSC_BASE | 1 | 33467 | 100K|00:00:00.06 | 6887 |
------------------------------------------------------------------------------------------------
--Bind 변수 값에 따라 실행계획이 변경되어야 하는지 결정하고 실행계획이 변경되어야 한다면
IS_BIND_AWARE 값이 "Y" 로 표시됨.
SELECT CHILD_NUMBER, EXECUTIONS, BUFFER_GETS, IS_BIND_SENSITIVE, IS_BIND_AWARE
FROM V$SQL
WHERE SQL_ID = '%48barbrzj2a30';
CHILD_NUMBER EXECUTIONS BUFFER_GETS IS_BIND_SENSITIVE IS_BIND_AWARE
------------ ---------- ----------- ----------------- -------------
0 2 34454 Y N
1 1 6687 Y Y
EXEC :A1 := 99;
SELECT *
FROM TB_DPS_TRSC_BASE A
WHERE ACCT_NO = :A1
----------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
----------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 10 |00:00:00.01 | 3 |
| 1 | TABLE ACCESS BY INDEX ROWID| TB_DPS_TRSC_BASE | 1 | 33467 | 10 |00:00:00.01 | 3 |
|* 2 | INDEX RANGE SCAN | IND_01 | 1 | 33467 | 10 |00:00:00.01 | 2 |
----------------------------------------------------------------------------------------------------------
SELECT CHILD_NUMBER, EXECUTIONS, BUFFER_GETS, IS_BIND_SENSITIVE, IS_BIND_AWARE
FROM V$SQL
WHERE SQL_ID = '%48barbrzj2a30';
CHILD_NUMBER EXECUTIONS BUFFER_GETS IS_B_SENS IS_B_AWAR IS_SHAR
------------ ---------- ----------- --------- --------- ----------
0 2 3454 Y N N
1 1 6687 Y Y Y
8. Part 1 ORACLE │131
2 2 32 Y Y Y
결론
Bind 변수를 사용하는 SQL 에서 처음 사용되는 변수 값으로 실행계획을 세우게 되어 그 실행계
획이 SQL 의 성능에 문제를 발생 시킬 수 있어 Bind Peeking 기능은 사용하지 못하는 기능이
되어 버렸다. 하지만 이 기능의 개선으로 Adaptive Cursor Sharing 기능을 사용하게 되면 이
문제를 해결 할 수 있다. 하지만 그 기능의 장점과 단점을 잘 알고 사용해야만 시스템을 안정적
으로 사용할 수 있을 것이다. 또한 운영하고 있는 시스템을 Adaptive Cursor Sharing 기능을
사용할 수 있는 부분이 있을 것이다. 이 기능을 활용해서 SQL 의 성능을 개선 시킨다면 더욱 안
정화되고 최적화된 시스템으로 발전하게 될 것이다.