■ version count (child LCO 많이 생성된다.)
1. 테이블이나 인덱스의 구조 변경 : DDL 문을 통해 구조가 변경되는 경우
2. 버전 관리 동시성 제어 : 멀티 버전 동시에 제어 지원.
- 트랜잭션의 시작 시검에 따라 특정 데이터의 이전 버전에 접근할 수 있다.
3. DBMS_REDEFINITION 패키지 : 테이블이나 인덱스의 구조 변경
예제1)
<system session>
alter system flush shared_pool;
# varchar2 size(32, 128, 2000, 4000) 4가지 크기로 결정된다.
(참고)
# 바인드변수 사용 #
1#) 익명블록, 트리거에서 바인드 변수(글로벌 변수로 사용하기 위함) 생성 가능.
2#) 패키지, 프로시저, 함수 : 글로벌 변수_ 패키지 스펙+body
-- 패키지 스펙
CREATE OR REPLACE PACKAGE my_package AS
g_variable NUMBER;
END my_package;
-- 패키지 body
CREATE OR REPLACE PACKAGE BODY my_package AS
g_variable NUMBER := 0;
PROCEDURE my_procedure IS
BEGIN
-- g_variable 사용 가능
DBMS_OUTPUT.PUT_LINE('Value of g_variable: ' || g_variable);
END my_procedure;
END my_package;
-- 바인드 변수를 사용하는 트리거 생성
CREATE OR REPLACE TRIGGER my_trigger
BEFORE INSERT ON your_table
FOR EACH ROW
DECLARE
v_value NUMBER := 100; -- 바인드 변수 선언 및 초기화
BEGIN
-- 바인드 변수 사용
IF :NEW.column_name = v_value THEN
-- 특정 조건에 따른 동작 수행
DBMS_OUTPUT.PUT_LINE('Value is equal to ' || v_value);
END IF;
END my_trigger;
/
#) :OLD, :NEW 활용한 트리거
-- :OLD, :NEW를 사용하는 트리거 생성
CREATE OR REPLACE TRIGGER my_trigger
BEFORE UPDATE ON your_table
FOR EACH ROW
BEGIN
-- 이전 값과 새로운 값 비교
IF :OLD.column_name IS NOT NULL AND :NEW.column_name IS NOT NULL THEN
-- 이전 값과 새로운 값이 다르면 동작 수행
IF :OLD.column_name <> :NEW.column_name THEN
-- 특정 동작 수행
DBMS_OUTPUT.PUT_LINE('Value changed from ' || :OLD.column_name || ' to ' || :NEW.column_name);
END IF;
END IF;
END my_trigger;
/
<HR session>
#) 바인드 변수 생성 및 실행
var name varchar2(10)
exec :name := 'King'
print name
SELECT last_name, salary FROM hr.employees WHERE last_name = :name;
#) 동일한 바인드 변수 선언 (+ 동일한 session에서 실행)
=> 바인드 변수의 length 믹스 매치 발생
#) 실수! 바인드 변수는 한 session에서 한번만!
var name varchar2(100)
exec :name := 'Grant'
print name
SELECT last_name, salary FROM hr.employees WHERE last_name = :name;
<system session>
=> version child LCO 확인 : version_count
SELECT sql_id, sql_text, version_count
FROM v$sqlarea
WHERE sql_text LIKE '%hr.employees%'
AND sql_text NOT LIKE '%v$sqlarea%';
#) v$sql_shared_cursor 을 통해 version count 높아지는 테이블 Y을 찾아서 체크
SELECT address, child_address, child_number, bind_length_upgradeable
FROM v$sql_shared_cursor
WHERE sql_id = '8r6armxb2z489';
#) 확인
desc v$sql_shared_cursor
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
SQL_ID VARCHAR2(13)
ADDRESS RAW(4)
CHILD_ADDRESS RAW(4)
CHILD_NUMBER NUMBER
/*★ 부터 57가지 version count 발생*/
UNBOUND_CURSOR VARCHAR2(1)
SQL_TYPE_MISMATCH VARCHAR2(1)
OPTIMIZER_MISMATCH VARCHAR2(1)
OUTLINE_MISMATCH VARCHAR2(1)
STATS_ROW_MISMATCH VARCHAR2(1)
LITERAL_MISMATCH VARCHAR2(1)
FORCE_HARD_PARSE VARCHAR2(1)
EXPLAIN_PLAN_CURSOR VARCHAR2(1)
BUFFERED_DML_MISMATCH VARCHAR2(1)
PDML_ENV_MISMATCH VARCHAR2(1)
INST_DRTLD_MISMATCH VARCHAR2(1)
SLAVE_QC_MISMATCH VARCHAR2(1)
TYPECHECK_MISMATCH VARCHAR2(1)
AUTH_CHECK_MISMATCH VARCHAR2(1)
BIND_MISMATCH VARCHAR2(1)
DESCRIBE_MISMATCH VARCHAR2(1)
LANGUAGE_MISMATCH VARCHAR2(1)
TRANSLATION_MISMATCH VARCHAR2(1)
BIND_EQUIV_FAILURE VARCHAR2(1)
INSUFF_PRIVS VARCHAR2(1)
INSUFF_PRIVS_REM VARCHAR2(1)
REMOTE_TRANS_MISMATCH VARCHAR2(1)
LOGMINER_SESSION_MISMATCH VARCHAR2(1)
INCOMP_LTRL_MISMATCH VARCHAR2(1)
OVERLAP_TIME_MISMATCH VARCHAR2(1)
EDITION_MISMATCH VARCHAR2(1)
MV_QUERY_GEN_MISMATCH VARCHAR2(1)
USER_BIND_PEEK_MISMATCH VARCHAR2(1)
TYPCHK_DEP_MISMATCH VARCHAR2(1)
NO_TRIGGER_MISMATCH VARCHAR2(1)
FLASHBACK_CURSOR VARCHAR2(1)
ANYDATA_TRANSFORMATION VARCHAR2(1)
PDDL_ENV_MISMATCH VARCHAR2(1)
TOP_LEVEL_RPI_CURSOR VARCHAR2(1)
DIFFERENT_LONG_LENGTH VARCHAR2(1)
LOGICAL_STANDBY_APPLY VARCHAR2(1)
DIFF_CALL_DURN VARCHAR2(1)
BIND_UACS_DIFF VARCHAR2(1)
PLSQL_CMP_SWITCHS_DIFF VARCHAR2(1)
CURSOR_PARTS_MISMATCH VARCHAR2(1)
STB_OBJECT_MISMATCH VARCHAR2(1)
CROSSEDITION_TRIGGER_MISMATCH VARCHAR2(1)
PQ_SLAVE_MISMATCH VARCHAR2(1)
TOP_LEVEL_DDL_MISMATCH VARCHAR2(1)
MULTI_PX_MISMATCH VARCHAR2(1)
BIND_PEEKED_PQ_MISMATCH VARCHAR2(1)
MV_REWRITE_MISMATCH VARCHAR2(1)
ROLL_INVALID_MISMATCH VARCHAR2(1)
OPTIMIZER_MODE_MISMATCH VARCHAR2(1)
PX_MISMATCH VARCHAR2(1)
MV_STALEOBJ_MISMATCH VARCHAR2(1)
FLASHBACK_TABLE_MISMATCH VARCHAR2(1)
LITREP_COMP_MISMATCH VARCHAR2(1)
PLSQL_DEBUG VARCHAR2(1)
LOAD_OPTIMIZER_STATS VARCHAR2(1)
ACL_MISMATCH VARCHAR2(1)
FLASHBACK_ARCHIVE_MISMATCH VARCHAR2(1)
LOCK_USER_SCHEMA_FAILED VARCHAR2(1)
REMOTE_MAPPING_MISMATCH VARCHAR2(1)
LOAD_RUNTIME_HEAP_FAILED VARCHAR2(1)
HASH_MATCH_FAILED VARCHAR2(1)
PURGED_CURSOR VARCHAR2(1)
BIND_LENGTH_UPGRADEABLE VARCHAR2(1)
USE_FEEDBACK_STATS VARCHAR2(1)
REASON CLOB
#) shared pool 실행계획 확인
select * from table(dbms_xplan.display_cursor('8r6armxb2z489',0));
select * from table(dbms_xplan.display_cursor('8r6armxb2z489',1));
#) 바인드변수 크기 확인
=> length의 믹스매치
select address, child_address, datatype_string, max_length, value_string
from v$sql_bind_capture
where sql_id = '8r6armxb2z489';
예제2)
<system session>
alter system flush shared_pool;
<HR session>
# varchar2 size(32, 128, 2000, 4000) 4가지 크기로 결정된다.
#) 바인드 변수 생성 및 실행
var name varchar2(1000)
exec :name := 'King'
print name
SELECT last_name, salary FROM hr.employees WHERE last_name = :name;
#) 동일한 바인드 변수 선언 (+ 동일한 session에서 실행)
=> 바인드 변수의 length 믹스 매치 발생
#) 또한번 실수상황. 바인드 변수 선언
var name varchar2(10)
exec :name := 'Grant'
print name
SELECT last_name, salary FROM hr.employees WHERE last_name = :name;
<system session>
=> version child LCO 확인 : version_count 2 로 확인. (버그 발생)
SELECT sql_id, sql_text, version_count
FROM v$sqlarea
WHERE sql_text LIKE '%hr.employees%'
AND sql_text NOT LIKE '%v$sqlarea%';
#) 큰 값만 생성되어야 한다.
select address, child_address, datatype_string, max_length, value_string
from v$sql_bind_capture
where sql_id = '8r6armxb2z489';
SELECT address, child_address, child_number, bind_length_upgradeable
FROM v$sql_shared_cursor
WHERE sql_id = '8r6armxb2z489';
예제2-1) 바인드 변수 b_name으로 변경
<system session>
alter system flush shared_pool;
<hr session>
var b_name varchar2(1000)
exec :b_name := 'King'
print b_name
SELECT last_name, salary FROM hr.employees WHERE last_name = :b_name;
#) 바인드변수 또다시 설정함.(+size 설정)
var b_name varchar2(10)
exec :b_name := 'Grant'
print b_name
SELECT last_name, salary FROM hr.employees WHERE last_name = :b_name;
<sys session>
SELECT sql_id, sql_text, version_count
FROM v$sqlarea
WHERE sql_text LIKE '%hr.employees%'
AND sql_text NOT LIKE '%v$sqlarea%';
select address, child_address, datatype_string, max_length, value_string
from v$sql_bind_capture
where sql_id = 'byp8xktt6sgwz';
#) 공유 커서에 관한 정보 확인
- 컬럼들 중의 'Y' 로 되어있는 컬럼 확인
select *
from v$sql_shared_cursor
where sql_id ='byp8xktt6sgwz';
#) 실행계획 확인
select * from table(dbms_xplan.display_cursor('byp8xktt6sgwz',0));
select * from table(dbms_xplan.display_cursor('byp8xktt6sgwz',1));
'Data Base > SQL 튜닝' 카테고리의 다른 글
Buffer Busy Wait, LRU LIST, LRUW LIST (1) | 2024.02.06 |
---|---|
Row Cache Lock (0) | 2024.02.05 |
Shared Pool Latch, library cache latch (1) | 2024.02.05 |
Library Cache Pin _ procedure 생성 후 library cache pin 확인 (0) | 2024.02.05 |
Library Cache Lock_table 생성, 대량의 Data (1) | 2024.02.05 |