Data Base/SQL 튜닝

Version Count_ 바인드 변수 size 설정

잇꼬 2024. 2. 5. 22:57
728x90
반응형
SMALL

■ 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));

728x90
반응형
LIST