[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);
'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 |