Direct Path I/O
- ์ผ๋ฐ์ ์ธ ๋ธ๋ก I/O๋ DB ๋ฒํผ์บ์ ๊ฒฝ์
- ์ฝ๊ณ ์ ํ๋ ๋ธ๋ก์ ๋จผ์ ๋ฒํผ์บ์์์ ์ฐพ๊ณ , ์ฐพ์ง ๋ชปํ ๋๋ง ๋์คํฌ ์ฝ์
- ๋ฐ์ดํฐ ๋ณ๊ฒฝํ ๋๋ ๋จผ์ ๋ธ๋ก์ ๋ฒํผ์บ์์์ ์ฐพ๊ณ , ๋ฒํผ๋ธ๋ก์ ๋ณ๊ฒฝ์ ๊ฐํ๊ณ ๋๋ฉด DBWR ํ๋ก์ธ์ค๊ฐ ๋ณ๊ฒฝ๋ ๋ธ๋ก(Dirty ๋ธ๋ก)๋ค์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฐพ์ ๋ฐ์ดํฐํ์ผ์ ๋ฐ์
- ์์ฃผ ์ฝ๋ ๋ธ๋ก์ ๋ํ ๋ฐ๋ณต์ ์ธ I/O Call์ ์ค์์ผ๋ก์จ ์์คํ
์ฑ๋ฅ์ ๋์ด๋ ค๊ณ ๋ฒํผ ์บ์ ์ฌ์ฉ
- ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ธ ๋ ๊ฑด๊ฑด์ด ๋ฒํผ์บ์๋ฅผ ํ์ํ๋ค๋ฉด, ์ฑ๋ฅ์ ์ ์ํฅ(์บ์ ํํธ์จ์ด ๋ฎ๊ธฐ ๋๋ฌธ)
- ๋๋ ๋ธ๋ก์ ๊ฑด๊ฑด์ด ๋์คํฌ๋ก๋ถํฐ ๋ฒํผ์บ์์ ์ ์ฌํ๊ณ ์ ์ฝ๋ ๋ถ๋ด๋ ํผ
- Full Scan ์์ฃผ๋ก ๊ฐ๋ ์ํ๋๋ ๋์ฉ๋ ์ฒ๋ฆฌ ํ๋ก๊ทธ๋จ๋ค์ ๋ฐ์ดํฐ ์ฌ์ฌ์ฉ์ฑ๋ ๋ฎ์
- ๋ฒํผ์บ์๋ฅผ ๊ฒฝ์ ํ์ง ์๊ณ ๊ณง๋ฐ๋ก ๋ฐ์ดํฐ ๋ธ๋ก์ ์ฝ๊ณ ์ธ ์ ์๋ Direct Path I/O ๊ธฐ๋ฅ ์ ๊ณต
- Direct Path I/O๊ฐ ์๋ํ๋ ๊ฒฝ์ฐ
- ๋ณ๋ ฌ ์ฟผ๋ฆฌ๋ก Full Scan ์ํ
- ๋ณ๋ ฌ DML ์ํ
- Direct Path Insert ์ํ
- Temp ์ธ๊ทธ๋จผํธ ๋ธ๋ก์ ์ฝ๊ณ ์ธ ๋
- direct ์ต์ ์ ์ง์ ํ๊ณ export ์ํ
- nocache ์ต์ ์ ์ง์ ํ LOB ์ปฌ๋ผ ์ฝ์ ๋
- Direct Path I/O๊ฐ ์๋ํ๋ ๊ฒฝ์ฐ
๋ณ๋ ฌ ์ฟผ๋ฆฌ
- ์ฟผ๋ฆฌ์ parallel ๋๋ parallel_index ํํธ๋ฅผ ์ฌ์ฉํ๋ฉด, ์ง์ ํ ๋ณ๋ ฌ๋๋งํผ ๋ณ๋ ฌ ํ๋ก์ธ์ค๊ฐ ๋ ์ ๋์์ ์์ ์งํ
SELECT /*+ full(t) parallel(t 4) */ * FROM big_table t;
SELECT /*+ index_ffs(t big_table_x1) parallel_index(t big_table_x1 4) */ count(*)
FROM big_table t;
- ๋ณ๋ ฌ๋๊ฐ 4์ผ ๊ฒฝ์ฐ, ์ฑ๋ฅ์ด 4๋ฐฐ ๋นจ๋ผ์ง๋ ๊ฒ์ด ์๋ ์์ญ๋ฐฐ ๋นจ๋ผ์ง
- Direct Path I/O ๋๋ฌธ
- ๋ฒํผ์บ์ ํ์ํ์ง ์๊ณ ๋์คํฌ๋ก๋ถํฐ ๋ฒํผ์บ์์ ์ ์ฌํ๋ ๋ถ๋ด๋ ์์
- Order by, Group By, ํด์ ์กฐ์ธ, ์ํธ ๋จธ์ง ์กฐ์ธ ๋ฑ์ ์ฒ๋ฆฌํ ๋๋ ํํธ๋ก ์ง์ ํ ๋ณ๋ ฌ๋๋ณด๋ค 2๋ฐฐ ๋ง์ ํ๋ก์ธ์ค ์ฌ์ฉ
Direct Path Insert
- Insert๊ฐ ๋๋ฆฐ ์ด์
- ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ ๋ธ๋ก์ Freelist์์ ์ฐพ์
- Freelist๋ ํ ์ด๋ธ HWM(High-Water-Mark) ์๋์ชฝ์ ์๋ ๋ธ๋ก ์ค ๋ฐ์ดํฐ ์ ๋ ฅ์ด ๊ฐ๋ฅํ(์ฌ์ ๊ณต๊ฐ์ด ์๋) ๋ธ๋ก์ ๋ชฉ๋ก์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ
- Freelist์์ ํ ๋น๋ฐ์ ๋ธ๋ก์ ๋ฒํผ์บ์์์ ์ฐพ์
- ๋ฒํผ์บ์์ ์์ผ๋ฉด, ๋ฐ์ดํฐํ์ผ์์ ์ฝ์ด ๋ฒํผ์บ์์ ์ ์ฌ
- INSERT ๋ด์ฉ์ Undo ์ธ๊ทธ๋จผํธ์ ๊ธฐ๋ก
- INSERT ๋ด์ฉ์ Redo ๋ก๊ทธ์ ๊ธฐ๋ก
- ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ ๋ธ๋ก์ Freelist์์ ์ฐพ์
- Direct Path Insert ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด, ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ผ๋ฐ INSERT๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ฒ ์
๋ ฅ
- Direct Path Insert ๋ฐฉ์์ผ๋ก ์
๋ ฅํ๋ ๋ฐฉ๋ฒ
- INSERT ... SELECT ๋ฌธ์ append ํํธ
- parallel ํํธ๋ฅผ ์ด์ฉํด ๋ณ๋ ฌ ๋ชจ๋๋ก INSERT
- direct ์ต์ ์ ์ง์ ํ๊ณ SQL*Loader(sqlldr)๋ก ๋ฐ์ดํฐ ์ ์ฌ
- CTAS(create table ... as select)๋ฌธ ์ํ
- Direct Path Insert๊ฐ ๋น ๋ฅธ ์ด์
- Freelist๋ฅผ ์ฐธ์กฐํ์ง ์๊ณ HWM ๋ฐ๊นฅ ์์ญ์์ ๋ฐ์ดํฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ์ ๋ ฅ
- ๋ธ๋ก์ ๋ฒํผ์บ์์์ ํ์ํ์ง ์์
- ๋ฒํผ์บ์์ ์ ์ฌํ์ง ์๊ณ , ๋ฐ์ดํฐํ์ผ์ ์ง์ ๊ธฐ๋ก
- Undo ๋ก๊น ์ ์ ํจ
- Redo ๋ก๊น
์ ์ ํ๊ฒ ํ ์ ์์
- alter๋ฌธ์ผ๋ก ํ ์ด๋ธ์ nologging ๋ชจ๋๋ก ์ ํ ๊ฐ๋ฅ
- Direct path Insert๊ฐ ์๋ ์ผ๋ฐ INSERT ๋ฌธ์ ๋ก๊น ํ์ง ์๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด ์์
- Direct Path Insert ๋ฐฉ์์ผ๋ก ์
๋ ฅํ๋ ๋ฐฉ๋ฒ
- Array Processing๋ Direct Path Insert ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅ
-- append_values ํํธ ์ฌ์ฉ
procedure insert_target( p_source in typ_source) is
begin
forall i in p_source.first..p_source.last
insert /*+ append_values */ into target values p_source(i);
end insert_target;
Direct Path Insert ์ฃผ์์
- ์ฑ๋ฅ์ด ๋น๊ตํ ์ ์์ด ๋นจ๋ผ์ง์ง๋ง, Exclusive ๋ชจ๋ TM Lock์ด ๊ฑธ๋ฆผ
- ์ปค๋ฐํ๊ธฐ ์ ๊น์ง ๋ค๋ฅธ ํธ๋์ญ์ ์ ํด๋น ํ ์ด๋ธ์ DML ์ํ ๋ถ๊ฐ๋ฅ
- ํธ๋์ญ์ ์ด ๋น๋ฒํ ์ฃผ๊ฐ์ ์ด ์ต์ ์ฌ์ฉ์ ๊ธ๋ฌผ
- Freelist๋ฅผ ์กฐํํ์ง ์๊ณ HWM ๋ฐ๊นฅ ์์ญ์ ์ ๋ ฅํ๋ฏ๋ก ํ ์ด๋ธ์ ์ฌ์ ๊ณต๊ฐ์ด ์์ด๋ ์ฌํ์ฉํ์ง ์์

- ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก DELETE ํด์ ์ฌ์ ๊ณต๊ฐ์ด ์๊ฒจ๋, ์ด ๋ฐฉ์์ผ๋ก๋ง ๊ณ์ INSERTํ๋ ํ
์ด๋ธ์ ์ฌ์ด์ฆ๊ฐ ์ค์ง ์๊ณ ๊ณ์ ์ฆ๊ฐ
- Range ํํฐ์ ํ ์ด๋ธ์ด๋ฉด ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๋ฅผ DELETE๊ฐ ์๋ ํํฐ์ DROP์ผ๋ก ์ง์์ผ ๊ณต๊ฐ ๋ฐํ์ด ์ด๋ค์ง
- ๋นํํฐ์ ํ ์ด๋ธ์ด๋ฉด ์ฃผ๊ธฐ์ ์ผ๋ก Reorg ์์ ์ํ
- ์ฑ๋ฅ์ด ๋น๊ตํ ์ ์์ด ๋นจ๋ผ์ง์ง๋ง, Exclusive ๋ชจ๋ TM Lock์ด ๊ฑธ๋ฆผ
๋ณ๋ ฌ DML
- INSERT๋ append ํํธ๋ฅผ ์ด์ฉํด Direct Path Write ๋ฐฉ์์ผ๋ก ์ ๋ํ ์ ์์ง๋ง, UPDATE/DELETE๋ ๊ธฐ๋ณธ์ ์ผ๋ก Direct Path Write ๋ถ๊ฐ๋ฅ
- ์ ์ผํ ๋ฐฉ๋ฒ์ ๋ณ๋ ฌ DML๋ก ์ฒ๋ฆฌํ๋ ๊ฒ
- ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ ๋์ฉ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ ์ด๋ฏ๋ก, ์ค๋ผํด์ ๋ณ๋ ฌ DML์ ํญ์ Direct Path Write๋ก ์ฒ๋ฆฌ
-- 1. ์ธ์
๋ด Parallel DML ํ์ฑํ
alter session enable parallel dml;
insert /*+ parallel(c 4) */ into ๊ณ ๊ฐ c
select /*+ full(o) parallel(o 4) */ * from ์ธ๋ถ๊ฐ์
๊ณ ๊ฐ o;
update /*+ full(c) parallel(c 4) */ ๊ณ ๊ฐ c set ๊ณ ๊ฐ์ํ์ฝ๋ = 'WD'
where ์ต์ข
๊ฑฐ๋์ผ์ < '20100101';
delete /*+ full(c) parallel(c 4) */ from ๊ณ ๊ฐ c
where ํํด์ผ์ < '20100101';
- ํํธ๋ฅผ ์ ๋๋ก ๊ธฐ์ ํ๋๋ฐ, ๋ณ๋ ฌ DML๋ฅผ ํ์ฑํ์ง ์์ ๊ฒฝ์ฐ
- ๋์ ๋ ์ฝ๋๋ฅผ ์ฐพ๋ ์์ ์ ๋ณ๋ ฌ๋ก ์งํํ์ง๋ง, ์ถ๊ฐ/๋ณ๊ฒฝ/์ญ์ ๋ QC๊ฐ ํผ์ ๋ด๋นํด ๋ณ๋ชฉ ๋ฐ์
- ๋ณ๋ ฌ INSERT๋ append ํํธ๋ฅผ ์ง์ ํ์ง ์์๋ Direct Path Insert ์ฌ์ฉํ์ง๋ง, ๋ณ๋ ฌ DML์ด ์๋ํ์ง ์์ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด append ํํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์
- ๋ณ๋ ฌ DML์ด ์๋ํ์ง ์๋๋ผ๋, QC๊ฐ Direct Path Insert๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ ์ ๋ ์ฑ๋ฅ์ด ๋์ด
-- 1. ๊ธฐ๋ณธ Parallel Direct Path Insert
insert /*+ append parallel(c 4) */ into ๊ณ ๊ฐ c
select /*+ full(o) parallel(o 4) */ * from ์ธ๋ถ๊ฐ์
๊ณ ๊ฐ o;
-- 12c๋ถํฐ๋ ์ธ์
์ค์ (alter session) ์์ด๋ enable_parallel_dml ํํธ๋ฅผ ํตํด ์ง์ ๋ณ๋ ฌ DML ํ์ฑํ๊ฐ ๊ฐ๋ฅ
insert /*+ enable_parallel_dml parallel(c 4) */ into ๊ณ ๊ฐ c
select /*+ full(o) parallel(o 4) */ * from ์ธ๋ถ๊ฐ์
๊ณ ๊ฐ o;
update /*+ enable_parallel_dml full(c) parallel(c 4) */ ๊ณ ๊ฐ c
set ๊ณ ๊ฐ์ํ์ฝ๋ = 'WD'
where ์ต์ข
๊ฑฐ๋์ผ์ < '20100101';
delete /*+ enable_parallel_dml full(c) parallel(c 4) */ from ๊ณ ๊ฐ c
where ํํด์ผ์ < '20100101';
- ๋ณ๋ ฌ DML๋ Direct Path Write ๋ฐฉ์์ ์ฌ์ฉํ๋ฏ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅ/์์ /์ญ์ ํ ๋ Exclusive ๋ชจ๋ TM Lock์ด ๊ฑธ๋ฆผ
๋ณ๋ ฌ DML์ด ์ ์๋ํ๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ
-- UPDATE(๋๋ DELETE/INSERT)๊ฐ PX_COORDINATOR ์๋์ชฝ์ ๋ํ๋๋ฉด UPDATE๋ฅผ ๊ฐ ๋ณ๋ ฌ ํ๋ก์ธ์ค๊ฐ ์ฒ๋ฆฌ
-------------------------------------------------------------------------------------------
| Id | Operation | Name | Pstart| Pstop | TQ |IN-OUT| PQ Distrib |
-------------------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | | | | | |
| 1 | PX COORDINATOR | | | | | | |
| 2 | PX SEND QC (RANDOM) | :TQ10000 | | | Q1,00 | P->S | QC (RAND) |
| 3 | UPDATE | ๊ณ ๊ฐ | | | Q1,00 | PCWP | |
| 4 | PX BLOCK ITERATOR | | 1 | 4 | Q1,00 | PCWC | |
| 5 | TABLE ACCESS FULL | ๊ณ ๊ฐ | 1 | 4 | Q1,00 | PCWP | |
-------------------------------------------------------------------------------------------
-- UPDATE(๋๋ DELETE/INSERT)๊ฐ PX_COORDINATOR ์์ชฝ์ ๋ํ๋๋ฉด UPDATE๋ฅผ QC๊ฐ ์ฒ๋ฆฌ
-------------------------------------------------------------------------------------------
| Id | Operation | Name | Pstart| Pstop | TQ |IN-OUT| PQ Distrib |
-------------------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | | | | | |
| 1 | UPDATE | ๊ณ ๊ฐ | | | | | |
| 2 | PX COORDINATOR | | | | | | |
| 3 | PX SEND QC (RANDOM) | :TQ10000 | | | Q1,00 | P->S | QC (RAND) |
| 4 | PX BLOCK ITERATOR | | 1 | 4 | Q1,00 | PCWC | |
| 5 | TABLE ACCESS FULL | ๊ณ ๊ฐ | 1 | 4 | Q1,00 | PCWP | |
-------------------------------------------------------------------------------------------