1. ๋ฌธ์„œ์˜ ๋ชฉ์ 

์ด ๋ฌธ์„œ๋Š” 2016๋…„ S๊ณ ๊ฐ์‚ฌ ERP ํ”„๋กœ์ ํŠธ์—์„œ ์ˆ˜ํ–‰ํ•œ ์ฃผ์š” ์„ฑ๋Šฅ ๊ฐœ์„  ํ™œ๋™ ๋‚ด์šฉ์— ๋Œ€ํ•ด ๊ธฐ์ˆ ํ•˜์˜€๋‹ค.
๋‹น์‹œ S๊ณ ๊ฐ์‚ฌ ERP ํ”„๋กœ์ ํŠธ๋Š” pureScale ํ™˜๊ฒฝ์„ ์ฒ˜์Œ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด์„œ Migration ์„ฑ๋Šฅ ์ด์Šˆ๋กœ ํฐ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์—ˆ๋‹ค. ์ˆ˜๊ฐœ์›” ๊ฐ„์˜ ๋…ธ๋ ฅ ๋์— ์„ฑ๋Šฅ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์•ˆ์„ ์ฐพ์•„๋‚ด์—ˆ๊ณ , ๊ทธ ๋‚ด์šฉ์„ ๋ณธ ๋ฌธ์„œ๋กœ ์ •๋ฆฌํ•˜์˜€๋‹ค.
ํ–ฅํ›„ ๋น„์Šทํ•œ DB2 purescale ํ™˜๊ฒฝ์—์„œ ์„ฑ๋Šฅ ์ €ํ•˜ ๋“ฑ์˜ ์ด์Šˆ ๋ฐœ์ƒ ์‹œ ์ด ๋ฌธ์„œ์˜ ๋‚ด์šฉ์„ ํ†ตํ•ด ์„ฑ๋Šฅ ์ด์Šˆ๋ฅผ ์กฐ๊ธฐ์— ํ•ด๊ฒฐํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ์•ˆ์ •์  ์šด์˜์— ๋„์›€์ด ๋˜๋Š” ๊ฒƒ์ด ์ด ๋ฌธ์„œ์˜ ๋ชฉ์ ์ด๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ 3ํšŒ์— ๊ฑธ์ณ SAP on DB2 pureScale ํ™˜๊ฒฝ์—์„œ DB ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•œ ์‚ฌ๋ก€๋ฅผ ๊ณต์œ ํ•˜๊ณ ์ž ํ•œ๋‹ค.

1) DB2 purescale ์„ฑ๋Šฅ ๊ฐœ์„  ์‚ฌ๋ก€ ๊ณต์œ  – 1. ํ…Œ์ด๋ธ” ํŒŒํ‹ฐ์…˜

2) DB2 purescale ์„ฑ๋Šฅ ๊ฐœ์„  ์‚ฌ๋ก€ ๊ณต์œ  – 2. LOB Inline, Extent Size, Append Mode

3) DB2 purescale ์„ฑ๋Šฅ ๊ฐœ์„  ์‚ฌ๋ก€ ๊ณต์œ  – 3. CF ์„ฑ๋Šฅ๊ฐœ์„ , ์œ ํ‹ธ๋ฆฌํ‹ฐ

 

3. CF ์„ฑ๋Šฅ ๊ฐœ์„ 

 

3.1 SMT (Simultaneous Multi Threading)

SMT (Simultaneous Multi Threading)๋Š” CPU ์ž์›์˜ ํ™œ์šฉ๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•˜์—ฌ Hardware Execution stream์„ ๋ณ‘๋ ฌํ™” ํ•˜๋Š” ๊ธฐ์ˆ ๋กœ ์„œ๋ฒ„ ์šฉ๋Ÿ‰ ์ฆ๋Œ€ ํšจ๊ณผ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ฃผ๋กœ ๋™์‹œ ์ฒ˜๋ฆฌ ํŠธ๋žœ์žญ์…˜์˜ ์ˆ˜๊ฐ€ ๊ฐœ๋ณ„ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ์†๋„๋ณด๋‹ค ๋” ์ค‘์š”ํ•œ ์ƒ์šฉ ์—…๋ฌด ํ™˜๊ฒฝ์—์„œ ์ ์šฉ์ด ์ ์ ˆํ•˜๋‹ค๊ณ  ์•Œ๋ ค์ ธ ์žˆ๋‹ค.

Power8 ์‹œ์Šคํ…œ์˜ ๊ฒฝ์šฐ SMT8 (8๊ฐœ Thread, 8๊ฐœ logical cpu) ๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋™์  ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

ECC, FS-PM, FS-QUO๋Š” dedicated CF ๋กœ ๊ตฌ์„ฑํ•˜์˜€๊ณ , ๊ทธ ์™ธ pureScale ์€ ๋ชจ๋‘ co-located CF ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. AIX์˜ SMT-8 ํ™˜๊ฒฝ์—์„œ๋Š” ๋‹ค์ˆ˜์˜ logical cpu ๊ฐ€ ์ธ์‹๋˜์–ด cf_num_workers ๊ฐ’์ด ํฌ๊ฒŒ ์„ค์ •๋˜๋ฏ€๋กœ ๊ณผ๋„ํ•œ thread ๋ฐœ์ƒ์œผ๋กœ ์ธํ•ด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋œ๋‹ค. Dedicated CF ํ™˜๊ฒฝ์˜ ๊ฒฝ์šฐ ์ง์ ‘ ๋‚ฎ์€ ๊ฐ’์œผ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, SMT-4 ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ž๋™์œผ๋กœ ๋‚ฎ์€ ๊ฐ’์ด ์„ค์ •๋˜๋„๋ก ํ•œ๋‹ค.

pureScale ์—์„œ๋Š”(ํŠนํžˆ CF ์˜ ๊ฒฝ์šฐ) SMT-8 ๋ณด๋‹ค SMT-4 ์—์„œ ๋” ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ ์ค€๋‹ค.

 

smt ์„ค์ •์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

# smtctl

 

This system is SMT capable.

This system supports up to 8 SMT threads per processor.

SMT is currently enabled.

SMT boot mode is set to enabled.

SMT threads are bound to the same physical processor.

 

proc0 has 4 SMT threads.

Bind processor 0 is bound with proc0

Bind processor 1 is bound with proc0

Bind processor 2 is bound with proc0

Bind processor 3 is bound with proc0

 

proc8 has 4 SMT threads.

Bind processor 4 is bound with proc8

Bind processor 5 is bound with proc8

Bind processor 6 is bound with proc8

Bind processor 7 is bound with proc8

… ์ค‘๋žต

proc32 has 4 SMT threads.

Bind processor 16 is bound with proc32

Bind processor 17 is bound with proc32

Bind processor 18 is bound with proc32

Bind processor 19 is bound with proc32

<๊ทธ๋ฆผ 3-1. SMT ํ™•์ธ ๋ฐฉ๋ฒ•>

 

3.2 CF_NUM_WORKERS

CF ๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” Worker ์˜ ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์ด๋‹ค.

 

์ด ๊ฐ’์ด ๋„ˆ๋ฌด ์ž‘์œผ๋ฉด, CF Wait Time ์ด ๊ธธ์–ด์ ธ์„œ SQL์˜ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜๊ณ , ๋„ˆ๋ฌด ํฌ๋ฉด CF Worker ๊ฐ„์˜ ๊ฒฝํ•ฉ์œผ๋กœ ์„ฑ๋Šฅ์ด ๋‚˜๋น ์ง€๊ฒŒ ๋œ๋‹ค.

 

์ด ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ ์ • ๊ฐ’์œผ๋กœ๋Š” physical core * 2 ๋˜๋Š” physical core * 2 + 1 ์ •๋„๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ตœ์†Œํ•œ CF ์— ํ• ๋‹น๋œ interconnect port ์ˆ˜๋งŒํผ์€ ์„ค์ •ํ•ด ์ฃผ๋„๋ก ํ•œ๋‹ค.

 

์„ค์ • ๋‚ด์šฉ์€ ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ํ™•์ธํ•œ๋‹ค.

$ db2 get dbm cfg | grep CF_NUM_WORKERS

Number of worker threadsย ย ย ย ย ย ย ย ย ย ย ย  (CF_NUM_WORKERS) = 2

<๊ทธ๋ฆผ 3-2. CF_NUM_WORKERS ํŒŒ๋ผ๋ฏธํ„ฐ ํ™•์ธ>

 

 

4. Utility

 

4.1 Table Partition & Parallel Load

ORACLE์˜ Parallel Insert์™€ ๊ฐ™์ด ํ…Œ์ด๋ธ” ์ด๊ด€ ์‹œ ์„ฑ๋Šฅ์„ ๋‚ด๊ธฐ ์œ„ํ•ด์„œ, Partition Table์˜ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

63๊ฐœ ํŒŒํ‹ฐ์…˜์„ ์žฌ ์กฐํ•ฉํ•ด 16๊ฐœ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ , 16๊ฐœ ๋™์‹œ ๋กœ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ ์žฌํ•œ๋‹ค. ๋กœ๋“œ๊ฐ€ ๋๋‚˜๋ฉด ๋‹ค์‹œ 63๊ฐœ ํŒŒํ‹ฐ์…˜์„ ์žฌ ์กฐํ•ฉํ•ด ๋‹จ์ผ ํ…Œ์ด๋ธ”๋กœ ํ•ฉ์น˜๊ณ  ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•ด ์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ๋งˆ๋ฌด๋ฆฌ ํ•œ๋‹ค.

 

ํŒŒํ‹ฐ์…˜์„ ํ•ฉ์นœ ํ›„ ๋ฐ˜๋“œ์‹œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” SET INTEGRITY ์ž‘์—…์˜ ์†Œ์š”์‹œ๊ฐ„๋„ ๋Œ€์šฉ๋Ÿ‰ ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ 1์‹œ๊ฐ„ ์ด์ƒ์œผ๋กœ ์˜ค๋ž˜ ์†Œ์š”๋˜์–ด, ์ด๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” SET INTEGRITY UNCHECKED ๋ฐฉ๋ฒ•์„ IBM Toronto Lab ์— ์š”์ฒญํ•˜์—ฌ, Special Build ํ˜•์‹์œผ๋กœ ์ œ๊ณต๋ฐ›์•„ ์‚ฌ์šฉ ์ค‘์ด๋‹ค.

 

<๊ทธ๋ฆผ 3-3. ํŒŒํ‹ฐ์…˜ ํ…Œ์ด๋ธ” ๋ณ‘๋ ฌ ๋กœ๋“œ ๋ฐฉ์‹>

 

DB2์˜ Partition ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•œ Parallel Load ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

2) ํƒ€๊ฒŸ ํ…Œ์ด๋ธ” ๋ฐ 16๊ฐœ ๋ณ‘๋ ฌ ๋กœ๋“œ ๋Œ€์ƒ ํ…Œ์ด๋ธ” ์ƒ์„ฑ.

  • ์ตœ์ข…์ ์œผ๋กœ ๋ชจ๋“  ํŒŒํ‹ฐ์…˜์„ ATTACH ํ•˜๊ธฐ ์œ„ํ•œ ํƒ€๊ฒŸ ํ…Œ์ด๋ธ” ์ƒ์„ฑ (DUMMY ํŒŒํ‹ฐ์…˜ ํ•œ ๊ฐœ๋กœ ๊ตฌ์„ฑ)
  • 16๊ฐœ ๋ณ‘๋ ฌ ๋กœ๋“œ๋ฅผ ์œ„ํ•œ 16๊ฐœ ํ…Œ์ด๋ธ” ์ƒ์„ฑ.
    • P0~P14 ๊ฐ 4๊ฐœ ํŒŒํ‹ฐ์…˜ P15 3๊ฐœ ํŒŒํ‹ฐ์…˜์œผ๋กœ ๊ตฌ์„ฑ
    • ์ด 63๊ฐœ ํŒŒํ‹ฐ์…˜์œผ๋กœ ๊ตฌ์„ฑ

<๊ทธ๋ฆผ 3-4. ํƒ€๊ฒŸ ํ…Œ์ด๋ธ” ๋ฐ 16๊ฐœ ๋ณ‘๋ ฌ ๋กœ๋“œ ๋Œ€์ƒ ํ…Œ์ด๋ธ” ์ƒ์„ฑ>

 

2) ๊ฐ ํŒŒํ‹ฐ์…˜ ๋ณ„ ์กฐํšŒ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜์—ฌ 16๊ฐœ ๋ณ‘๋ ฌ ๋กœ๋“œ ์ˆ˜ํ–‰

  • ํŒŒํ‹ฐ์…˜ ์กฐ๊ฑด์ธ MOD(HASH4(RTRIM(<Partition Key Column>),1),23)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ํ…Œ์ด๋ธ” ๋ณ„ ๋ณ‘๋ ฌ ๋กœ๋“œ ์ˆ˜ํ–‰
  • ํŒŒํ‹ฐ์…˜ TO ํŒŒํ‹ฐ์…˜ ๋กœ๋“œ์˜ ๊ฒฝ์šฐ์—๋Š” SAPDB6_GC Partition Column์„ ์กฐํšŒ ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ‘๋ ฌ ๋กœ๋“œ ์ˆ˜ํ–‰

<๊ทธ๋ฆผ 3-5. ๊ฐ ํŒŒํ‹ฐ์…˜ ๋ณ„ ์กฐํšŒ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜์—ฌ 16๊ฐœ ๋ณ‘๋ ฌ ๋กœ๋“œ ์ˆ˜ํ–‰>

 

3) ATTACH DUMMY ํŒŒํ‹ฐ์…˜ ์ˆ˜ํ–‰

  • 16๊ฐœ ๋กœ๋“œ ๋Œ€์ƒ ํ…Œ์ด๋ธ” DETACH ์ˆ˜ํ–‰ ์ „ DUMMY ํŒŒํ‹ฐ์…˜ ์ถ”๊ฐ€
  • ๋ชจ๋“  ํŒŒํ‹ฐ์…˜์„ DETACH ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ตœ์†Œํ•œ ํ•˜๋‚˜์˜ ํŒŒํ‹ฐ์…˜์ด ๋‚จ์•„ ์žˆ์–ด์•ผ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ DUMMY ํŒŒํ‹ฐ์…˜์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ํŒŒํ‹ฐ์…˜ DETACH ๋ถˆ๊ฐ€๋Šฅ.

<๊ทธ๋ฆผ 3-6. ATTACH DUMMY ํŒŒํ‹ฐ์…˜ ์ถ”๊ฐ€ ์ˆ˜ํ–‰>

 

4) DETACH ๋ชจ๋“  ํŒŒํ‹ฐ์…˜ ์ˆ˜ํ–‰

  • 63๊ฐœ ํŒŒํ‹ฐ์…˜ ๋ชจ๋‘ DETACH ์ˆ˜ํ–‰ํ•˜์—ฌ 63๊ฐœ ํ…Œ์ด๋ธ”๋กœ ๋ณ€๊ฒฝ.

<๊ทธ๋ฆผ 3-7. DETACH ALL ํŒŒํ‹ฐ์…˜ ์ˆ˜ํ–‰>

 

5) ํƒ€๊ฒŸ ํ…Œ์ด๋ธ”์— 63๊ฐœ ํ…Œ์ด๋ธ” ATTACH ์ˆ˜ํ–‰

  • 63๊ฐœ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ํƒ€๊ฒŸ ํ…Œ์ด๋ธ”์— ATTACH๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ DUMMY ํŒŒํ‹ฐ์…˜ ํฌํ•จ 64๊ฐœ ํŒŒํ‹ฐ์…˜์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํƒ€๊ฒŸ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑ

<๊ทธ๋ฆผ 3-8. ํƒ€๊ฒŸ ํ…Œ์ด๋ธ”์— 63๊ฐœ ํ…Œ์ด๋ธ” ATTACH ์ˆ˜ํ–‰>

 

6) ํƒ€๊ฒŸ ํ…Œ์ด๋ธ” SET INTEGRITY ALL IMMEIDATE UNCHECKED ์ˆ˜ํ–‰

  • ์›๋ž˜๋Š” pureScale ํ™˜๊ฒฝ์—์„œ ํŒŒํ‹ฐ์…˜ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ INTEGRITY PENDING์— ๋Œ€ํ•˜์—ฌ UNCHECKED๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋‚˜ LAB์—์„œ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ Speacial Build๋ฅผ ์ ์šฉํ•˜์—ฌ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋จ.
  • SET INTEGIRITY UNCHECKED๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ ๋Œ€์‹ ์— ์ˆ˜๋™์œผ๋กœ ๊ฒ€์ฆํ•˜๋Š” ๊ณผ์ •์ด ์ถ”๊ฐ€์ ์œผ๋กœ ํ•„์š”. (๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ ์ด์ƒ ์—†์Œ์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ฒดํฌํ•ด์•ผ ํ•จ.)

 

7) ํƒ€๊ฒŸ ํ…Œ์ด๋ธ”์˜ DUMMY ํŒŒํ‹ฐ์…˜ ์ œ๊ฑฐ

  • DETACH DUMMY ํŒŒํ‹ฐ์…˜ ์ดํ›„ DROP DUMMY ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด์„œ ์ถ”๊ฐ€ํ•˜์˜€๋˜ DUMMY ํŒŒํ‹ฐ์…˜์„ ์ œ๊ฑฐํ•˜์—ฌ ์›๋ณธ ํ…Œ์ด๋ธ”์˜ DDL๊ณผ ๊ฐ™์€ ํ˜•์ƒ์œผ๋กœ ๋ณ€๊ฒฝํ•จ.

 

4.2 Compression

๋Œ€์šฉ๋Ÿ‰ ํ…Œ์ด๋ธ” ์ด๊ด€ ์‹œ ํ…Œ์ด๋ธ”์— ์••์ถ• ์˜ต์…˜์„ ๋ฐ˜๋“œ์‹œ ์ง€์ •ํ•˜๋„๋ก ํ•œ๋‹ค. ์••์ถ• ์˜ต์…˜ ๋ˆ„๋ฝ ์‹œ IO ์˜ค๋ฒ„ํ—ค๋“œ ๊ณผ๋‹ค๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ํฌ๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค.

Compression ์ด ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ, ์ ์žฌ ๋ฐ ์ธ๋ฑ์Šค ์ƒ์„ฑ์‹œ๊ฐ„์ด 5๋ฐฐ์ •๋„ ๋” ์†Œ์š”๋œ ์‚ฌ๋ก€๊ฐ€ ์žˆ๋‹ค.

ํ…Œ์ด๋ธ” ์ƒ์„ฑ์‹œ COMPRESSION ์˜ต์…˜์„ ๋ฐ˜๋“œ์‹œ ์ง€์ •ํ•˜๋„๋ก ํ•˜์ž. ํ˜„์žฌ SAP ์‹œ์Šคํ…œ์— ์„ค์ •๋œ COMPRESSION ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

# COMPRESSION ์˜ต์…˜ ์ง€์ •

CREATE TABLE โ€œ์Šคํ‚ค๋งˆโ€œ.โ€ํ…Œ์ด๋ธ”๋ช…โ€ย ย  (

โ€ฆโ€ฆ

โ€œITEMS_Tโ€ BLOB(1G) INLINE LENGTH 14000 LOGGED NOT COMPACT NOT NULL,

โ€ฆโ€ฆ

COMPRESS YES ADAPTIVE

VALUE COMPRESSION

โ€ฆ.

<๊ทธ๋ฆผ 3-9. SAP์‹œ์Šคํ…œ ๊ธฐ์ค€ยญ – TABLE COMPRESS ์˜ต์…˜>

 

์•„์šธ๋Ÿฌ TABLE PARTITION ์ ์šฉ ์‹œ 4๊ฐœ ํŒŒํ‹ฐ์…˜์„ ํ•œ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด ๊ทธ๋ฃน๋ณ„๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ” ์ŠคํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•ด์„œ Load Utility๋ฅผ ์‚ฌ์šฉํ•œ Data ์ด๊ด€ ์‹œ ํ…Œ์ด๋ธ” ์ŠคํŽ˜์ด์Šค ๊ฒฝํ•ฉ์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ด์Šˆ๋„ ํ”ผํ•˜๋„๋ก ํ•œ๋‹ค.

 

4.3 ADMIN_MOVE_TABLE

ADMIN_MOVE_TABLE ๋ฃจํ‹ด์€ DB2 v9.7์—์„œ ๋ถ€ํ„ฐ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ์ž๋™์œผ๋กœ ํ…Œ์ด๋ธ”์„ ํ˜„์žฌ ์‚ฌ์šฉ์ค‘์ธ ํ…Œ์ด๋ธ”์ŠคํŽ˜์ด์Šค์—์„œ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์ŠคํŽ˜์ด์Šค๋กœ ์†์‰ฝ๊ฒŒ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

ADMIN_MOVE_TABLE ๋ฃจํ‹ด์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ”์„ ์ด๋™ ํ•  ๊ฒฝ์šฐ ์ด๋™ํ•˜๋Š” ๋™์•ˆ ์‚ฌ์šฉ์ž๋Š” ํ…Œ์ด๋ธ”์— ์ด์ƒ ์—†์ด Accessํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

 

ADMIN_MOVE_TABLE ๋ฃจํ‹ด์˜ ๋™์ž‘ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๋‚ด๋ถ€์ ์œผ๋กœ ADMIN_MOVE_TABLE ๋ฃจํ‹ด์€ ์›๋ณธ ํ…Œ์ด๋ธ”์˜ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” INSERT FROM CURSOR๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋™์‹œํ‚ค๋ฉฐ, LOAD ๋“ฑ์˜ ์ง€์ •๋˜๋Š” ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•œ๋‹ค.
  • ํ…Œ์ด๋ธ”์ด ์ด๋™๋˜๋Š” ๋™์•ˆ ADMIN_MOVE_TABLE์€ ์†Œ์Šค ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๋Š” ์Šคํ…Œ์ด์ง€ ํ…Œ์ด๋ธ”๋„ ์ž‘์„ฑํ•œ๋‹ค. ๋ณ€๊ฒฝ๋˜๋Š” ์‚ฌํ•ญ์€ ์†Œ์Šค ํ…Œ์ด๋ธ”์— ์ž‘์„ฑ๋œ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ํ†ตํ•ด ์ถ”์ ํ•œ๋‹ค.
  • ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ์ด๋™ ์กฐ์ž‘์ด ๋๋‚˜๋ฉด ADMIN_MOVE_TABLE์€ ์†Œ์Šค ํ…Œ์ด๋ธ”์— Exclusive ๋ชจ๋“œ๋กœ Lock๋ฅผ ๊ฑธ๊ณ  ๋ฐ์ดํ„ฐ ์ด๋™๊ฐ„ ๋ฐœ์ƒํ•œ ๋ชจ๋“  ์†Œ์Šค ํ…Œ์ด๋ธ”์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํƒ€๊ฒŸ ํ…Œ์ด๋ธ”์— ์ ์šฉํ•œ๋‹ค.
  • ์ž‘์—…์ด ๋๋‚œ ํ›„ ์†Œ์Šค ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด์„œ๋Š” ADMIN_MOVE_TABLE ๋ฃจํ‹ด์— ์˜ต์…˜์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ํ…Œ์ด๋ธ” ์‚ญ์ œ ํ˜น์€ ์œ ์ง€๋ฅผ ํ•œ๋‹ค.

 

ADMIN_MOVE_TABLE ๋ฃจํ‹ด์€ ํ…Œ์ด๋ธ”์ŠคํŽ˜์ด์Šค์˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ ๋‹ค์ฐจ์› ํด๋Ÿฌ์Šคํ„ฐ๋ง, ํŒŒํ‹ฐ์…˜ ํ‚ค, Range ํŒŒํ‹ฐ์…˜ ๋ฐ ์ปฌ๋Ÿผ ๋ฐ์ดํ„ฐ ์œ ํ˜• ๋“ฑ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์†Œ์Šค ํ…Œ์ด๋ธ”์— ์ •์˜๋œ ํŠธ๋ฆฌ๊ฑฐ ๋ฐ View ๋˜ํ•œ ํƒ€๊ฒŸ ํ…Œ์ด๋ธ”๋กœ ์ด๋™ ์‹œ์ผœ์ค€๋‹ค.

ํ•˜์ง€๋งŒ ๋ถ€๋ชจ ํ˜น์€ ์ž์‹์˜ ์™ธ๋ž˜ํ‚ค ๋ณต์ œ๋Š” ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•ด๋‹น ์™ธ๋ž˜ํ‚ค์˜ DDL์„ ์ •์˜ํ•ด ๋†“๊ณ  ADMIN_MOVE_TABLE ์ž‘์—… ์ดํ›„ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ณผ์ •์ด ์ถ”๊ฐ€์ ์œผ๋กœ ํ•„์š”ํ•˜๋‹ค.

 

ํ…Œ์ด๋ธ”์ŠคํŽ˜์ด์Šค ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ADMIN_MOVE_TABLE ์‚ฌ์šฉ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

# ํ…Œ์ด๋ธ”์ŠคํŽ˜์ด์Šค ์ด๋™์„ ์œ„ํ•œ ADMIN_MOVE_TABLE ์˜ต์…˜ ์ง€์ •.

CALL SYSPROC.ADMIN_MOVE_TABLE(โ€˜<์Šคํ‚ค๋งˆ๋ช…>โ€™,โ€™<ํ…Œ์ด๋ธ”๋ช…>โ€™,โ€™<์ด๋™ํ•  ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์ŠคํŽ˜์ด์Šค>โ€™,โ€™<์ด๋™ํ•  ์ธ๋ฑ์Šค ํ…Œ์ด๋ธ”์ŠคํŽ˜์ด์Šค>โ€™,โ€™<์ด๋™ํ•  LONG ํ…Œ์ด๋ธ”์ŠคํŽ˜์ด์Šค>โ€™, ”,”,”,”,’COPY_USE_LOAD NONRECOVERABLE’,’MOVE’);

 

# ์‚ฌ์šฉ ์˜ˆ

# SAPTOOLS. ‘COMPRESSION_IDX ํ…Œ์ด๋ธ”์„ SAPTOOLS2 ํ…Œ์ด๋ธ”์ŠคํŽ˜์ด์Šค๋กœ ์ด๋™

call sysproc.admin_move_table(‘SAPTOOLS’,’COMPRESSION_IDX’,’SAPTOOLS2′,’SAPTOOLS2′,’SAPTOOLS2′,”,”,”,”,’COPY_USE_LOAD NONRECOVERABLE’,’MOVE’);

 

# ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ

Result set 1
————–

KEYย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  VALUE
——————————– ——————————————————————————————————————————–
AUTHIDย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  DB2LFP
CLEANUP_ENDย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  2017-01-16-10.54.32.608054
CLEANUP_STARTย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  2017-01-16-10.54.32.247073
COPY_ENDย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  2017-01-16-10.54.31.816221
COPY_OPTSย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  OVER_INDEX,LOAD NONRECOVERABLE,NON_CLUSTER
COPY_STARTย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  2017-01-16-10.54.29.779102
COPY_TOTAL_ROWSย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  0
DICTIONARY_CREATION_TOTAL_TIMEย ย  2
INDEXNAMEย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  COMPRESSION_IDX~0
INDEXSCHEMAย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  SAPTOOLS
INDEX_CREATION_TOTAL_TIMEย ย ย ย ย ย ย  0
INIT_ENDย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  2017-01-16-10.54.29.760134
INIT_STARTย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  2017-01-16-10.54.29.561989
ORIGINAL_TBLSIZEย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  160
REPLAY_ENDย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  2017-01-16-10.54.32.097910
REPLAY_STARTย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  2017-01-16-10.54.31.816591
REPLAY_TOTAL_ROWSย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  0
REPLAY_TOTAL_TIMEย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  0
STATUSย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  COMPLETE
SWAP_ENDย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  2017-01-16-10.54.32.231381
SWAP_RETRIESย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  0
SWAP_STARTย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  2017-01-16-10.54.32.103316
UTILITY_INVOCATION_IDย ย ย ย ย ย ย ย ย ย ย  0000000100131742000000080000000000002017011610542976049900000000
VERSIONย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  10.05.0007

24 record(s) selected.

Return Status = 0

<๊ทธ๋ฆผ 3-10. ADMIN_MOVE_TABLE ์‚ฌ์šฉ ์˜ˆ์‹œ>

 

4.4 RUNSTATS ์ž๋™ํ™”

๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์œผ๋กœ ์ธํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œ ์ž‘์—…์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚จ์— ๋”ฐ๋ผ ์ž˜๋ชป๋œ Access Plan์œผ๋กœ ์ธํ•œ SQL ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ๋‹ค. ์ด๋ฅผ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•˜์—ฌ 2์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ํ•ด๋‹น ํ…Œ์ด๋ธ”์˜ ๋ณ€๊ฒฝ ๊ฑด์ˆ˜๋ฅผ ์ฒดํฌํ•˜์—ฌ 10%์ด์ƒ ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋œ ํ…Œ์ด๋ธ”์— ํ•œํ•ด์„œ ํ†ต๊ณ„์ •๋ณด ๊ฐฑ์‹ ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ๋ฅผ Crontab์— ๋“ฑ๋กํ•˜์˜€๋‹ค.

 

1) ํ†ต๊ณ„์ •๋ณด ์ˆ˜์ง‘ ์ž๋™ํ™” ๋Œ€์ƒ

ํ†ต๊ณ„์ •๋ณด ์ˆ˜์ง‘ ์ž๋™ํ™” ๋Œ€์ƒ์€ ํ†ต๊ณ„์ •๋ณด๊ฐ€ ์—†๋Š” ํ…Œ์ด๋ธ”๊ณผ ์ตœ๊ทผ ์ˆ˜์ง‘๋œ ํ†ต๊ณ„์ •๋ณด ์ดํ›„ ํ…Œ์ด๋ธ” ๊ฑด์ˆ˜(CARD)์˜ 10% ์ด์ƒ ๋ณ€๊ฒฝ ์ด๋ ฅ์ด ์žˆ๋Š” Table์„ ๋Œ€์ƒ์œผ๋กœ ํ•œ๋‹ค.

 

2) ํ†ต๊ณ„์ •๋ณด ์ž๋™ํ™” ๋Œ€์ƒ ํ…Œ์ด๋ธ” ์ถ”์ถœ ์กฐ๊ฑด

  • TABLES catalog view ์™€ MON_GET_TABLES table function ์กฐ์ธ์œผ๋กœ ์ถ”์ถœ
  • ๊ฐ ๋ชจ๋“ˆ ๋ณ„๋กœ ๋‹ค๋ฅธ schema ์กฐ๊ฑด์œผ๋กœ ํ…Œ์ด๋ธ” ๋ชฉ๋ก ์ˆ˜์ง‘
  • ํ˜„์žฌ CARD๊ฐ’์˜ 10% ์ด์ƒ ๋ณ€๊ฒฝ์ด ์žˆ์„ ๊ฒฝ์šฐ ํ†ต๊ณ„์ •๋ณด ์ˆ˜์ง‘ ๋Œ€์ƒ.(MON_GET_TABLE์˜ STATS_ROWS_MODIFIED ์ปฌ๋Ÿผ ์‚ฌ์šฉ)
  • ํ˜„์žฌ Runstats๊ฐ€ ์ˆ˜ํ–‰ ์ค‘์ธ ํ…Œ์ด๋ธ” ์ œ์™ธ

 

3) ์ž๋™ํ™” ๋ฐฉ์•ˆ

  • Crontab์— ๋งค์ผ 2์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ ์ˆ˜ํ–‰, ์ˆ˜ํ–‰ ์ดํ›„ 1์‹œ๊ฐ„ 30๋ถ„ ์ดํ›„์—๋Š” ์ถ”๊ฐ€๋กœ Runstats๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Œ.
  • ํ†ต๊ณ„์ •๋ณด ์ˆ˜์ง‘ ์ „ ๊ธฐ์กด ํ†ต๊ณ„์ •๋ณด Backup
  • ์ž‘์—… ํžˆ์Šคํ† ๋ฆฌ ๋ณด๊ด€ (์ตœ์ข… ํ†ต๊ณ„ ์ˆ˜์ง‘ ์‹œ๊ฐ, ์†Œ์š” ์‹œ๊ฐ„, ํ…Œ์ด๋ธ” ๋ช…)

 

ํ•ด๋‹น Runstats ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

#!/bin/ksh
. ~/sqllib/db2profile
# VARIABLE
case `hostname` in
ํ˜ธ์ŠคํŠธ๋ช…1|ํ˜ธ์ŠคํŠธ๋ช…2) SID=DB๋ช…
SCHEMA=”‘์Šคํ‚ค๋งˆ'”;;
*)ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  exit -1;;
esac
WORKDIR=/DBAWORK/SCRIPT/CRON/DAILY/RUNSTATS
DATE=`date +%Y%m%d`
TABLIST_DATE=`date +%H%M`
TIME=`date +%H%M%S`# TARGET TABLE LIST
db2 +o connect to ${SID}
mkdir -p ${WORKDIR}/MIMIC_${DATE}/
EXCEPTION_LIST=”‘ ‘”
EXCEPTION_CUR_RUN=”‘ ‘”
CURRENT_RUNSTATS_TABLE_LIST=”‘ ‘”
CHK_STOP_TIME=`db2 -x “select hex(current time + 90 minute) from sysibm.sysdummy1″`# Exception Table List (EXCEPTION_LIST) #
cat exception_update_stats.lst | while read EXCEPTION
do
EXCEPTION_LIST=${EXCEPTION_LIST}”,'”${EXCEPTION}”‘”
done# Exception Table CURRENT_RUNSTATS_TABLE
db2 list utilities | grep -p RUNSTATS | grep Description | awk -F. ‘{print $2}’ >> ${WORKDIR}/CURRENT_RUNSTATS_TABLE.list 2>&1
if [ -e ${WORKDIR}/CURRENT_RUNSTATS_TABLE.list ]; then
cat CURRENT_RUNSTATS_TABLE.listย  | while read EXCEPTION_CUR_RUN
do
CURRENT_RUNSTATS_TABLE_LIST=${CURRENT_RUNSTATS_TABLE_LIST}”,'”${EXCEPTION_CUR_RUN}”‘”
done
fidb2 -x “select tabschema, tabname from (
select a.tabschema, a.tabname, a.card, a.stats_time, b.STATS_ROWS_MODIFIED from syscat.tables a, (select tabschema, tabname, sum(stats_rows_modified) as stats_rows_modified from table(mon_get_table(null,”,-1)) as t group by tabschema, tabname ) as b
where a.tabschema = b.tabschema
and a.tabname = b.tabname
and a.tabschema=${SCHEMA}
and type=’T’
and a.tabname not like ‘%DBA_2016%’
and a.tabname not like ‘%CTS_2016%’
and a.tabname not like ‘%TARGET_P%’
and b.stats_rows_modified > a.card * 0.15
and a.tabname not in ( ${EXCEPTION_LIST},${CURRENT_RUNSTATS_TABLE_LIST} )
order by b.stats_rows_modified desc, stats_time asc)
with ur” > /${WORKDIR}/tablist_${TABLIST_DATE} 2>&1# IF RESULT IS 0 THEN EXIT
LINE=`cat ${WORKDIR}/tablist_${TABLIST_DATE}ย  | wc -l`
if [ $LINE -eq 0 ] then
rm ${WORKDIR}/tablist_${TABLIST_DATE}
exit 0
fi#READ TABLIST
cat ${WORKDIR}/tablist_${TABLIST_DATE}ย  | while read TABSCHEMA TABNAME
do
STOP_TIME=`date +%H%M`
CUERRENT_TIME=`date +%H%M%S`
CHK_START_TIME=`db2 -x “select hex(current time) from sysibm.sysdummy1″`
#Time Limit
if [ ${CHK_START_TIME} -ge ${CHK_STOP_TIME} ] then
##ย ย  END_TIME=`date +%H%M%S`
echo ${CURRENT_TIME}” END” >> ${WORKDIR}/runstats_final_${DATE}.out
db2 +o terminate
rm ${WORKDIR}/tablist_${TABLIST_DATE}
exit 0
fi# MAIN ()
# MIMIC
echo ${TABNAME} > tmp_final${TABLIST_DATE}
sed ‘s/\//_/g’ tmp_final${TABLIST_DATE} > tmp_final2_${TABLIST_DATE}
MIMIC_OUTPUT=`cat tmp_final2_${TABLIST_DATE}`db2look -d ${SID} -z ${TABSCHEMA} -t “${TABNAME}” -m -r -o ${WORKDIR}/MIMIC_${DATE}/${MIMIC_OUTPUT}_final_${DATE}.ddl > /dev/null 2>&1
# Runstats
db2 -x “runstats on table ${TABSCHEMA}.\”${TABNAME}\” with distribution and indexes all tablesample system (5) indexsample system (5)” > /dev/null 2>&1
echo ${CUERRENT_TIME} ${TABSCHEMA}.\”${TABNAME}\” >> ${WORKDIR}/runstats_final_${DATE}.out
sleep 1
done# END out
END_TIME=`date +%H%M%S`
echo ${END_TIME}” END” >> $WORKDIR/runstats_final_${DATE}.out
rm ${WORKDIR}/tablist_${TABLIST_DATE}
rm tmp*
db2 +o terminate

<๊ทธ๋ฆผ 3-11. S๊ณ ๊ฐ์‚ฌ DB2 ํ†ต๊ณ„์ •๋ณด ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ>

 

์ด๊ฒƒ์œผ๋กœ ์ด 3ํšŒ์˜ ๊ฑธ์นœ ์—ฐ์žฌ๋ฅผ ๋งˆ์นฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ ํ•˜์—ฌ ๋” ๋ฐœ์ „ํ•ด๋‚˜๊ฐ”์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ•จ๊ป˜ ํ”„๋กœ์ ํŠธ ํ–ˆ๋˜ ๋ถ„๋“ค ๊ณ ์ƒํ•˜์…จ์Šต๋‹ˆ๋‹ค.

 

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

์ž‘์„ฑ์ž : ์ด๋•ํ˜ธ ๊ทธ๋ฃน์žฅ, ์กฐํ˜„๋‘ ์„ ์ž„, ๊น€๊ทผ์˜ ์„ ์ž„ (S์‚ฌ)

๊น€๊ธฐํ™” ๋ถ€์žฅ, ์ด์žฌํ˜ ๊ณผ์žฅ (IBM)

์กฐ์šฉํฌ ๋ถ€์žฅ, ๊น€์ผ๋ž€ ๊ณผ์žฅ (๊ณ ์›์‹œ์Šคํ…œ)