์˜ค๋ผํด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์šด์˜ํ•˜๊ฑฐ๋‚˜ ํŠœ๋‹ํ•  ๋•Œ ๊ผญ ์•Œ์•„์•ผ ํ•  ํ•ต์‹ฌ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐ”๋กœ ํ†ต๊ณ„ ์ •๋ณด ์ˆ˜์ง‘์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ณ„ํš์„ ์ œ๋Œ€๋กœ ์ˆ˜๋ฆฝํ•˜๋ ค๋ฉด ์ตœ์‹  ํ†ต๊ณ„๊ฐ€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” DBMS_STATS.GATHER_TABLE_STATS ํ”„๋กœ์‹œ์ €๋ฅผ ์ด์šฉํ•ด ์˜ค๋ผํด ํ…Œ์ด๋ธ” ํ†ต๊ณ„ ์ˆ˜์ง‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž์„ธํžˆ ์„ค๋ช…๋“œ๋ฆด๊ฒŒ์š”.

✅ DBMS_STATS.GATHER_TABLE_STATS๋ž€?

DBMS_STATS.GATHER_TABLE_STATS๋Š” Oracle์—์„œ ํ…Œ์ด๋ธ” ๋ฐ ์ธ๋ฑ์Šค ํ†ต๊ณ„ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๊ณต์‹ API์ž…๋‹ˆ๋‹ค.
์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

๐Ÿงฑ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

EXEC DBMS_STATS.GATHER_TABLE_STATS( ownname => '์Šคํ‚ค๋งˆ์ด๋ฆ„', 
     tabname => 'ํ…Œ์ด๋ธ”์ด๋ฆ„', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, 
     cascade => TRUE, method_opt => 'FOR ALL COLUMNS SIZE AUTO' );

์ฃผ์š” ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค๋ช…
ํŒŒ๋ผ๋ฏธํ„ฐ์„ค๋ช…
ownnameํ†ต๊ณ„๋ฅผ ์ˆ˜์ง‘ํ•  ์Šคํ‚ค๋งˆ ์ด๋ฆ„
tabname๋Œ€์ƒ ํ…Œ์ด๋ธ” ์ด๋ฆ„
estimate_percent์ƒ˜ํ”Œ๋ง ๋น„์œจ (100=์ „์ฒด, 10=10%, AUTO_SAMPLE_SIZE ๊ถŒ์žฅ)
cascade๊ด€๋ จ ์ธ๋ฑ์Šค๋„ ํ•จ๊ป˜ ์ˆ˜์ง‘ํ• ์ง€ ์—ฌ๋ถ€
method_optํžˆ์Šคํ† ๊ทธ๋žจ ์ˆ˜์ง‘ ๋ฐฉ์‹ (์ž๋™ ์„ค์ • ๊ถŒ์žฅ)

๐Ÿ’ก ์‹ค๋ฌด ์˜ˆ์ œ

1. ์ „์ฒด ํ†ต๊ณ„ ์ˆ˜์ง‘

EXEC DBMS_STATS.GATHER_TABLE_STATS('HR', 'EMPLOYEES', estimate_percent => 100, 
   cascade => TRUE);

2. ์ž๋™ ์ƒ˜ํ”Œ๋ง ๋ฐฉ์‹ (๊ถŒ์žฅ)

EXEC DBMS_STATS.GATHER_TABLE_STATS( ownname => 'HR', tabname => 'EMPLOYEES',
  estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, cascade => TRUE );


3. ํžˆ์Šคํ† ๊ทธ๋žจ ํฌํ•จ

EXEC DBMS_STATS.GATHER_TABLE_STATS( ownname => 'HR', tabname => 'EMPLOYEES',
    method_opt => 'FOR ALL COLUMNS SIZE AUTO', cascade => TRUE );

๐Ÿ” ํ…Œ์ด๋ธ” ํ†ต๊ณ„ ์กฐํšŒ ๋ฐฉ๋ฒ•

SELECT table_name, num_rows, blocks, last_analyzed 
  FROM dba_tables 
 WHERE owner = 'HR' AND table_name = 'EMPLOYEES';


์ด ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋งˆ์ง€๋ง‰ ํ†ต๊ณ„ ์ˆ˜์ง‘ ์‹œ์ ๊ณผ ํ–‰ ์ˆ˜ ๋“ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ์–ธ์ œ ํ†ต๊ณ„๋ฅผ ์ˆ˜์ง‘ํ•ด์•ผ ํ• ๊นŒ?

  • ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ INSERT, UPDATE, DELETE ์ดํ›„
  • ์‹ ๊ทœ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ํ›„
  • ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์˜์‹ฌ๋  ๋•Œ
  • ์ธ๋ฑ์Šค ์ƒ์„ฑ/์‚ญ์ œ ํ›„


๐Ÿ“Ž ์ฐธ๊ณ : ์ž๋™ ํ†ต๊ณ„ ์ˆ˜์ง‘์ด ์•ˆ ๋  ๋•Œ

Oracle์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋™ ํ†ต๊ณ„ ์ˆ˜์ง‘ ์ž‘์—…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค (AUTO_STATS_JOB). ํ•˜์ง€๋งŒ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ ์ˆ˜๋™ ์ˆ˜์ง‘์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  • ์ˆ˜์ง‘ ์ฃผ๊ธฐ ์ „์— ๋ฐ์ดํ„ฐ๊ฐ€ ๊ธ‰๋ณ€ํ–ˆ์„ ๊ฒฝ์šฐ
  • ์ž๋™ ์ˆ˜์ง‘์ด ๋น„ํ™œ์„ฑํ™” ๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ
  • ๋น„์ฆˆ๋‹ˆ์Šค์ƒ ๋ฏผ๊ฐํ•œ ์‹œ์ ์— ์„ฑ๋Šฅ ํŠœ๋‹์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ

✅ ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ

ํ•ญ๋ชฉ์„ค๋ช…
ํ•ต์‹ฌ ๊ธฐ๋Šฅ์˜ตํ‹ฐ๋งˆ์ด์ € ํ†ต๊ณ„ ์ˆ˜์ง‘
์‚ฌ์šฉ ํƒ€์ด๋ฐ๋Œ€๋Ÿ‰ DML ์ดํ›„, ์‹ ๊ทœ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ํ›„
์ถ”์ฒœ ์˜ต์…˜AUTO_SAMPLE_SIZE, cascade => TRUE
ํ™•์ธ ๋ฐฉ๋ฒ•DBA_TABLES ์กฐํšŒ

ํ†ต๊ณ„ ์ •๋ณด๋Š” ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.
์šด์˜ํ™˜๊ฒฝ์—์„œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ์ •๊ธฐ์ ์œผ๋กœ DBMS_STATS.GATHER_TABLE_STATS๋ฅผ ํ™œ์šฉํ•ด ํ…Œ์ด๋ธ” ํ†ต๊ณ„๋ฅผ ์ˆ˜์ง‘ํ•ด ์ฃผ์„ธ์š”.