Data Base/SQL 튜닝

FLM(FreeList Management) & ASSM(Auto Segment Space Management)

잇꼬 2024. 2. 6. 23:04
728x90
반응형
SMALL

[FLM(FreeList Management)] : 테이블 및 인덱스의 블록 내에서 여유 공간을 관리하는 기술

1. Free List 

2. 리스트 형태의 공간 관리

3. Hot 및 Cold Region 


< sys_1 >

#) tablespace 생성 , management manual 로 생성

create tablespace flm_tbs
datafile '/u01/app/oracle/oradata/ora11g/flm_tbs01.dbf' size 100m autoextend on
extent management local uniform size 1m
segment space management manual;


----------------
HR sess_1
----------------
=> storage(freelists 1) : 설정시 buffer busy wait 빈번히 발생 가능성이 높다. 

create table flm_t (id char(1000)) storage(freelists 1) tablespace flm_tbs;
exec dbms_application_info.set_client_info('sess_1')


-------------
HR sess_2
-------------

exec dbms_application_info.set_client_info('sess_2')


-------------
sys_1
-------------

select client_info, sid from v$session where client_info in ('sess_1', 'sess_2');


CLIENT_INFO            SID
------------------------------ ----------
sess_1                               10
sess_2                               23

----------------
sess_1
----------------
#1) 1부터 10,000 의 무한 루프문 + for문 밖의 commit 

begin
    for i in 1..10000 loop
        insert into flm_t values(' ');
    end loop;
    commit;
end;
/


-------------
sess_2
-------------
#1) 1부터 10,000 의 무한 루프문 + for문 밖의 commit

begin
    for i in 1..10000 loop
        insert into flm_t values(' ');
    end loop;
    commit;
end;
/

 

----------------
sess_1, sess_2
----------------
#2) 1부터 100,000 의 무한 루프문 + for문 밖의 commit

begin
    for i in 1..100000 loop
        insert into flm_t values(' ');
    end loop;
    commit;
end;
/

 

----------------
sess_1, sess_2
----------------
#3) 1 부터 10,000 의 무한 루프문 + for문 안에 commit

begin
    for i in 1..10000 loop
        insert into flm_t values(' ');
        commit;
    end loop;
end;
/


-------------
sys_1
-------------

#) session별로 대기 이벤트 확인

select sid, event, wait_class, wait_time, seconds_in_wait, state 
from v$session_wait 
where sid in (10, 23);


-------------
sys_2
-------------
#1) 1부터 10,000 의 무한 루프문 + for문 밖의 commit

select sid, event, total_waits, time_waited from v$session_event where sid in (10, 23);


#2) 1부터 100,000 의 무한 루프문 + for문 밖의 commit

1#) enq: HW - contention : 대량의 data을 insert문 실행 시의 wait event 발생.

2#) cursor: pin S : LCO/shared pin 

3#) cursor: pin S wait on X  : LCO/exclusive mode 로 되어 있어 접근 불가.

select sid, event, total_waits, time_waited from v$session_event where sid in (10, 23);


-------------
sys_1
-------------

select sid, prev_sql_id from v$session where sid in (10, 23);

 

#) 실행 계획 확인

select * from table(dbms_xplan.display_cursor('fp6146x56b2g6',0));




[ASSM(Auto Segment Space Management)] : 세그먼트의 여유 공간을 더 효과적으로 관리

1. 트랜잭션 할당 및 해제

2. 트랜잭션 할당 공간의 통합

3. 공간 분할

4. 읽기 일관성 및 다중 버전 관리 

 

-------------
sys_1
-------------

#) 기존에 있는 tablespace 삭제 

drop tablespace flm_tbs including contents and datafiles;
alter system flush shared_pool;
alter system flush shared_pool;
alter system flush buffer_cache;
alter system flush buffer_cache;

 

#) tablespace 생성 

create tablespace flm_tbs
datafile '/u01/app/oracle/oradata/ora11g/flm_tbs01.dbf' size 100m autoextend on
extent management local uniform size 1m
segment space management auto;


----------------
HR sess_1
----------------

#) 구분하기 위함

exec dbms_application_info.set_client_info('sess_1')


-------------
HR sess_2
-------------

#) 구분하기 위함

exec dbms_application_info.set_client_info('sess_2')


-------------
sys_1
-------------

#) sessoion생성 확인 

select client_info, sid from v$session where client_info in ('sess_1', 'sess_2');


-------------
HR sess_1 
-------------

#) table 생성  

create table flm_t (id char(1000)) tablespace flm_tbs;

#1) 1부터 10,000 의 무한 루프문 

BEGIN
    FOR i IN 1..10000 LOOP
        INSERT INTO flm_t VALUES ( ' ' );
    END LOOP;
    COMMIT;
END;
/

-------------
HR sess_2
-------------

BEGIN
    FOR i IN 1..10000 LOOP
        INSERT INTO flm_t VALUES ( ' ' );
    END LOOP;
    COMMIT;
END;
/

------------- -------------
HR sess_1, sess_2
------------- -------------
#2) 1부터 100,000 의 무한 루프문 

BEGIN
    FOR i IN 1..100000 LOOP
        INSERT INTO flm_t VALUES ( ' ' );
    END LOOP;
    COMMIT;
END;
/


-------------
sys_1
-------------

#) session별로 대기 이벤트 확인 

select sid, event, wait_class, wait_time, seconds_in_wait, state 
from v$session_wait 
where sid in (10, 23);

 

#) session별로 prev_sql_id 확인

select sid, prev_sql_id from v$session where sid in (10, 23);


-------------
sys_2
-------------
#1) 1부터 10,000일 경우

select sid, event, total_waits, time_waited 
from v$session_event 
where sid in (10, 23);


#2) 1부터 1000,000 일경우 

select sid, event, total_waits, time_waited from v$session_event where sid in (10, 23);

 

728x90
반응형
LIST

'Data Base > SQL 튜닝' 카테고리의 다른 글

Redo 기능, logging mode & nologging mode  (2) 2024.02.07
Transaction 처리 순서  (1) 2024.02.07
Buffer Busy Wait, LRU LIST, LRUW LIST  (1) 2024.02.06
Row Cache Lock  (0) 2024.02.05
Version Count_ 바인드 변수 size 설정  (0) 2024.02.05