Claire's Study Note

[SQL BOOSTER] 5-2. ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•œ ์ตœ์†Œํ•œ์˜ ์ง€์‹

by Hi.Claire
๋ฐ˜์‘ํ˜•

๐Ÿ“š SQL BOOSTER (์œ ์ผํ™˜, DBian)

 

CH5. ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•œ ๊ธฐ๋ณธ ์ง€์‹

5-2. ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•œ ์ตœ์†Œํ•œ์˜ ์ง€์‹

5-2-1. ์˜ตํ‹ฐ๋งˆ์ด์ ธ(Optimizer)

์˜ตํ‹ฐ๋งˆ์ด์ ธ๋ฅผ ํ•œ๊ธ€๋กœ ํ‘œํ˜„ํ•˜๋ฉด '์„ฑ๋Šฅ ์ตœ์ ํ™”๊ธฐ'๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ตํ‹ฐ๋งˆ์ด์ ธ๋Š” SQL์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์‹คํ–‰๊ณ„ํš์„ ๋งŒ๋“œ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

๋น„์šฉ ๊ธฐ๋ฐ˜ ์˜ตํ‹ฐ๋งˆ์ด์ ธ(CBO, Cost Based Optimizer)

SQL์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋น„์šฉ์— ๊ธฐ๋ฐ˜ํ•ด ์ตœ์†Œ์˜ ๋น„์šฉ์„ ๋ชฉํ‘œ๋กœ ์‹คํ–‰๊ณ„ํš์„ ๋งŒ๋“ ๋‹ค.

 

๊ทœ์น™ ๊ธฐ๋ฐ˜ ์˜ตํ‹ฐ๋งˆ์ด์ ธ(RBO, Rule Based Optimizer)

์ผ์ •ํ•œ ๊ทœ์น™์— ๋”ฐ๋ผ ์‹คํ–‰๊ณ„ํš์„ ๋งŒ๋“ ๋‹ค.

 

์˜ค๋ผํด์„ ํฌํ•จํ•œ ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ RDBMS๋Š” ๋น„์šฉ ๊ธฐ๋ฐ˜ ์˜ตํ‹ฐ๋งˆ์ด์ ธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ด๋•Œ์˜ ๋น„์šฉ์ด๋ž€ IO์˜ ํšŸ์ˆ˜, CPU Time, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์˜๋ฏธํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๋น„์šฉ์„ ์‚ฐ์ถœํ•  ๋•Œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์ด ํ…Œ์ด๋ธ”์˜ ํ†ต๊ณ„ ์ •๋ณด๋‹ค.

 

5-2-2. ์†Œํ”„ํŠธ ํŒŒ์‹ฑ, ํ•˜๋“œ ํŒŒ์‹ฑ

SQL์„ ์‹คํ–‰ํ•˜๋ฉด ์˜ค๋ผํด์€ ๊ฐ€์žฅ ๋จผ์ € ๊ตฌ๋ฌธ ๋ถ„์„์„ ํ•œ๋‹ค.

๊ตฌ๋ฌธ ๋ถ„์„ ๋‹จ๊ณ„์—์„œ๋Š” SQL์ด ๋ฌธ๋ฒ•์— ๋งž๋Š”์ง€, SQL์— ์‚ฌ์šฉํ•œ ์˜ค๋ธŒ์ ํŠธ(ํ…Œ์ด๋ธ”, ์ปฌ๋Ÿผ, ๋ทฐ ๋“ฑ)๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.

๊ตฌ๋ฌธ ๋ถ„์„์„ ํ†ต๊ณผํ•˜๋ฉด ์‹คํ–‰ํ•œ SQL์˜ ์‹คํ–‰๊ณ„ํš์ด ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š”์ง€ ๊ฒ€์ƒ‰ํ•œ๋‹ค.

์ด๋•Œ, ๋งŒ๋“ค์–ด ๋†“์€ ์‹คํ–‰๊ณ„ํš์ด ์žˆ์œผ๋ฉด ์ด๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ด๊ฒƒ์„ ์†Œํ”„ํŠธ ํŒŒ์‹ฑ์ด๋ผ๊ณ  ํ•œ๋‹ค.

๋ฐ˜๋ฉด ๊ตฌ๋ฌธ ๋ถ„์„์„ ํ†ต๊ณผํ•œ ํ›„ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์‹คํ–‰๊ณ„ํš์ด ๋ฉ”๋ชจ๋ฆฌ์— ์—†์œผ๋ฉด ์˜ตํ‹ฐ๋งˆ์ด์ ธ๊ฐ€ ์‹คํ–‰๊ณ„ํš์„ ์ƒˆ๋กœ ๋งŒ๋“œ๋Š”๋ฐ ์ด๊ฒƒ์„ ํ•˜๋“œ ํŒŒ์‹ฑ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

ํ•˜๋“œ ํŒŒ์‹ฑ์€ ์ œ๋ฒ• ํฐ ๋น„์šฉ์ด ์†Œ๋ชจ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„์˜ ์•ˆ์ •์ ์ธ ์„ฑ๋Šฅ์„ ์œ„ํ•ด์„œ๋Š” ์†Œํ”„ํŠธ ํŒŒ์‹ฑ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก SQL์„ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

 

์˜ˆ์‹œ1. ๊ฐ๊ฐ ํ•˜๋“œ ํŒŒ์‹ฑ์ด ์ˆ˜ํ–‰๋˜๋Š” SQL

SELECT * FROM t_ord WHERE cus_id = 'CUS_0001';
SELECT * FROM t_ord WHERE cus_id = 'CUS_9999';

 

์˜ˆ์‹œ2. ๋ฐ”์ธ๋“œ ๋ณ€์ˆ˜๋กœ ์ฒ˜๋ฆฌ๋œ SQL

SELECT * FROM t_ord WHERE cus_id = :cusId;

 

์˜ˆ์‹œ1์˜ ๋‘ SQL์€ cus_id์— ๋Œ€ํ•œ ์กฐ๊ฑด๊ฐ’ ์™ธ์—๋Š” ๊ฐ™์€ SQL์ด๋‹ค.

ํ•˜์ง€๋งŒ ์˜ค๋ผํด์€ ์œ„ ๋‘ SQL์„ ๋‹ค๋ฅธ SQL๋กœ ํŒ๋‹จํ•˜์—ฌ ๊ฐ SQL๋งˆ๋‹ค ์‹คํ–‰๊ณ„ํš์ด ํฌํ•จ๋œ ํ•˜๋“œ ํŒŒ์‹ฑ์„ ํ•œ๋‹ค.

์˜ˆ์‹œ2์ฒ˜๋Ÿผ ๋ฐ”์ธ๋“œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฒ˜์Œ SQL์„ ์‹คํ–‰ํ•  ๋•Œ๋งŒ ํ•˜๋“œ ํŒŒ์‹ฑ์ด ๋˜๊ณ , ์ดํ›„์—๋Š” ์†Œํ”„ํŠธ ํŒŒ์‹ฑ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

๋ฌผ๋ก  ๋ฐ”์ธ๋“œ ๋ณ€์ˆซ๊ฐ’์— ๋”ฐ๋ผ SQL ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ•˜๋“œ ํŒŒ์‹ฑ์€ ์ƒ๊ฐ๋ณด๋‹ค ๋งŽ์€ CPU ์ž์›์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— OLTP ์‹œ์Šคํ…œ์€ ์†Œํ”„ํŠธ ํŒŒ์‹ฑ์œผ๋กœ ๊ฐœ๋ฐœํ•ด์•ผ ํ•œ๋‹ค.

 

5-2-3. IO(Input, Output)

SQL ์„ฑ๋Šฅ ๊ฐœ์„ ์˜ ํ•ต์‹ฌ์€ IO๋‹ค.

IO๋ฅผ ์ค„์ด๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

IO๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์ฝ๋Š” ๋ฐฉ๋ฒ•์€ ์—†๊ธฐ ๋•Œ๋ฌธ์— IO๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š” ์ž‘์—…์ด๋‹ค.

๋”ฐ๋ผ์„œ ์„ฑ๋Šฅ ๋ฌธ์ œ๋„ IO์—์„œ ๋ฐœ์ƒํ•  ํ™•๋ฅ ์ด ๋†’๋‹ค.

 

SQL ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•ด์„œ๋Š” ๋ถˆํ•„์š”ํ•œ IO๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”์ง€ ์‚ดํŽด๋ด์•ผ ํ•œ๋‹ค.

๊ฐ€์žฅ ๋จผ์ € SQL์—์„œ ๋ถˆํ•„์š”ํ•œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ์‚ดํŽด๋ด์•ผ ํ•˜๊ณ , ๊ทธ ๋‹ค์Œ์€ ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜์ง€๋Š” ์•Š๋Š”์ง€๋„ ์‚ดํŽด๋ด์•ผ ํ•œ๋‹ค.

๋ถˆํ•„์š”ํ•œ ๋ถ€๋ถ„์€ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค.

์ธ๋ฑ์Šค๋Š” ๊ทธ ๋‹ค์Œ ๊ณ ๋ฏผํ•ด์•ผ ํ•  ๋ฌธ์ œ๋‹ค.

 

5-2-4. ๋ธ”๋ก(Block)

๋ธ”๋ก์€ ์˜ค๋ผํด์—์„œ IO๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ตœ์†Œ ๋‹จ์œ„๋‹ค.

MS-SQL์ด๋‚˜ My-SQL์—์„œ๋Š” ํŽ˜์ด์ง€(Page)๋ผ๋Š” ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

๋ฐ์ดํ„ฐ ํ•œ ๊ฑด์„ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•˜๋‚˜์˜ ๋ธ”๋ก์„ ์ฝ๊ฑฐ๋‚˜ ์จ์•ผ ํ•œ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ OLTP ์‹œ์Šคํ…œ์€ 8KB(8,192 Byte) ํฌ๊ธฐ์˜ ๋ธ”๋ก์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ด ํ•˜๋‚˜์˜ ๋ธ”๋ก์—๋Š” ์—ฌ๋Ÿฌ ๊ฑด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜๋„ ์žˆ๊ณ , ํ•œ ๊ฑด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ๋“ค์–ด๊ฐ€์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„์ดํ…œID์™€ ์•„์ดํ…œ๋ช…์œผ๋กœ ๊ตฌ์„ฑ๋œ ํ…Œ์ด๋ธ”์ด ์žˆ๊ณ , ๊ฐ ์ปฌ๋Ÿผ์ด 40 Byte๋ฅผ ์ฐจ์ง€ํ•  ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ ํ•œ ๊ฑด์—๋Š” ์ตœ๋Œ€ 80 Byte๊ฐ€ ํ•„์š”ํ•˜๋‹ค. 

๋ธ”๋ก ํฌ๊ธฐ๊ฐ€ 8KB๋ผ๋ฉด ํ•œ ๋ธ”๋ก์—๋Š” ์•ฝ 100๊ฑด ์ •๋„๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•œ ๋ธ”๋ก์„ ์ฝ์„ ๋•Œ๋งˆ๋‹ค 100๊ฑด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ์…ˆ์ด๋‹ค.

 

ํ…Œ์ด๋ธ”์„ ์„ค๊ณ„ํ•  ๋•Œ ์ตœ์†Œ ํฌ๊ธฐ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

ํ•˜๋‚˜์˜ ๋ธ”๋ก์— ๋งŽ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋„๋ก ํ…Œ์ด๋ธ”์„ ์„ค๊ณ„ํ•˜๋ฉด IO ํšŸ์ˆ˜๋ฅผ ์ค„์ด๋Š” IO ์ตœ์ ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

SQL์˜ ์‹ค์ œ ์‹คํ–‰๊ณ„ํš์—์„œ ๋ธ”๋ก IO ์ˆ˜์น˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ์‹œ1. ์‹ค์ œ ์‹คํ–‰๊ณ„ํš ๋งŒ๋“ค๊ธฐ

SELECT /*+ GATHER_PLAN_STATISTICS */
       COUNT(*)
FROM t_ord ord
WHERE ord.ord_dt >= to_date('20170101', 'yyyymmdd')
AND ord.ord_dt < to_date('20170201', 'yyyymmdd');

 

์˜ˆ์‹œ2. ์‹ค์ œ ์‹คํ–‰๊ณ„ํš์„ ๋งŒ๋“  SQL์˜ SQL_ID, CHILD_NUMBER ์ฐพ๊ธฐ

SELECT T1.sql_id, T1.child_number, t1.sql_text
FROM V$SQL T1
WHERE T1.sql_text LIKE '%GATHER_PLAN_STATISTICS%'
ORDER BY T1.last_active_time DESC;

 

 

์˜ˆ์‹œ3. ์‹ค์ œ ์‹คํ–‰๊ณ„ํš ์กฐํšŒํ•˜๊ธฐ

SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('33q18wn7kna1w',0,'ALLSTATS LAST'));

 

 

์‹ค์ œ ์‹คํ–‰๊ณ„ํš์„ ๋ณด๋ฉด Buffers ํ•ญ๋ชฉ์ด ์žˆ๋‹ค.

Buffers๋Š” ๋…ผ๋ฆฌ์  IO๊ณ , ์—ฌ๊ธฐ์—๋Š” ์—†์ง€๋งŒ Reads๋Š” ๋ฌผ๋ฆฌ์  IO๋‹ค.

๋…ผ๋ฆฌ์  IO๋Š” ์˜ค๋ผํด์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ธ ๋ฒ„ํผ์บ์‹œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์—ˆ์Œ์„ ๋œปํ•˜๊ณ , ๋ฌผ๋ฆฌ์  IO๋Š” ๋ฌผ๋ฆฌ์  ๋””์Šคํฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์—ˆ์Œ์„ ๋œปํ•œ๋‹ค.

 

์‹คํ–‰๊ณ„ํš์˜ Buffers์™€ Reads๋Š” ๋ˆ„์ ๋œ ๊ฐ’์ด๋‹ค.

์œ„ ์‹คํ–‰๊ณ„ํš์„ ๋ณด๋ฉด ์ „์ฒด ๋…ผ๋ฆฌ์  IO๋Š” 22๋ฒˆ์ด๋‹ค.

๋ธ”๋ก์œผ๋กœ ๋ฐ”๊ฟ” ํ‘œํ˜„ํ•˜๋ฉด ๋ฒ„ํผ์บ์‹œ์—์„œ ์ด 22๋ฒˆ ๋ธ”๋ก์„ ์ฝ์—ˆ๋‹ค๋Š” ๋œป์ด๋‹ค.

๋งŒ์•ฝ Reads ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋ฉด ๋ฌผ๋ฆฌ์  IO์˜ ํšŸ์ˆ˜, ์ฆ‰, ๋””์Šคํฌ์—์„œ ๋ธ”๋ก์„ ์ฝ์€ ์ด ํšŸ์ˆ˜๋„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

5-2-5. ๋…ผ๋ฆฌ์  IO์™€ ๋ฌผ๋ฆฌ์  IO

์‹คํ–‰๊ณ„ํš์—์„œ ๋…ผ๋ฆฌ์  IO๋Š” Buffers๋กœ, ๋ฌผ๋ฆฌ์  IO๋Š” Reads๋กœ ํ‘œ์‹œ๋œ๋‹ค.

๋…ผ๋ฆฌ์  IO๋Š” ์˜ค๋ผํด์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ์ž‘์—…์ด๊ณ , ๋ฌผ๋ฆฌ์  IO๋Š” ๋””์Šคํฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ์ž‘์—…์ด๋‹ค.

์ด๋•Œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋””์Šคํฌ๋ณด๋‹ค ๋น ๋ฅด๋‹ค.

 

์˜ค๋ผํด์—๋Š” ๋ฒ„ํผ์บ์‹œ(Buffer cache)๋ผ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด ์žˆ๋‹ค.

๋ฒ„ํผ์บ์‹œ์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ณผ์ •์„ ๋…ผ๋ฆฌ์  IO๋ผ๊ณ  ํ•œ๋‹ค.

์˜ค๋ผํด์€ SQL์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฒ„ํผ์บ์‹œ์— ์žˆ๋Š”์ง€ ๋จผ์ € ํ™•์ธํ•œ๋‹ค.

ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฒ„ํผ์บ์‹œ์— ๋ชจ๋‘ ์žˆ๋‹ค๋ฉด ๋…ผ๋ฆฌ์  IO๋งŒ์œผ๋กœ SQL์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฒ„ํผ์บ์‹œ์— ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ๋””์Šคํฌ๊นŒ์ง€ ๊ฐ€์„œ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์„ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค.

์ด๊ฒƒ์ด ๋ฌผ๋ฆฌ์  IO๋‹ค.

๋ฌผ๋ฆฌ์  IO๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ, ํ•œ ๋ฒˆ ์‚ฌ์šฉํ•œ ๋ธ”๋ก์€ ๋‹ค์‹œ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋ฏ€๋กœ ๋ฒ„ํผ์บ์‹œ์—๋„ ์ €์žฅํ•ด ๋†“๋Š”๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ๊ฐ™์€ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•ด์ง€๋ฉด ๋ฌผ๋ฆฌ์  IO๊ฐ€ ์•„๋‹Œ ๋…ผ๋ฆฌ์  IO๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

๋ฉ”๋ชจ๋ฆฌ(๋ฒ„ํผ์บ์‹œ)๋Š” ๋””์Šคํฌ๋ณด๋‹ค ์ œํ•œ์ ์ธ ์ž์›์ด๋‹ค.

๋ฒ„ํผ์บ์‹œ๊ฐ€ ๊ฝ‰ ์ฐจ ์žˆ๋Š” ์ƒํƒœ์—์„œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€์•ผ ํ•œ๋‹ค๋ฉด, ๋ฒ„ํผ์บ์‹œ์—์„œ ๊ฐ€์žฅ ์˜ค๋ž˜์ „์— ์‚ฌ์šฉ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์ถฉ๋ถ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์€ ์‚ฌ์‹ค์ด์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋Š˜๋ ค ๋ฒ„ํผ์บ์‹œ๋ฅผ ํฌ๊ฒŒ ์„ค์ •ํ•œ๋‹ค๊ณ  ํ•ด๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ฑ๋Šฅ์ด ์„ ํ˜•์ ์œผ๋กœ ์ข‹์•„์ง€๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

์ตœ์†Œํ•œ์˜ IO๋กœ SQL์ด ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๋„๋ก ์ ์ ˆํ•œ ์ธ๋ฑ์Šค ์ „๋žต๊ณผ ํ•จ๊ป˜ ์ ์ ˆํ•œ SQL์ด ์„ ํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค.

 

์‹คํ–‰๊ณ„ํš์—์„œ Buffers(๋…ผ๋ฆฌ์  IO) ํ•ญ๋ชฉ์„ ์ฃผ์˜ ๊นŠ๊ฒŒ ์‚ดํŽด๋ณด๋ฉด ์„ฑ๋Šฅ์ด ๋‚˜๋น ์ง„ ์ฆ๊ฑฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

 

5-2-6. ๋ถ€๋ถ„ ๋ฒ”์œ„ ์ฒ˜๋ฆฌ

๋ถ€๋ถ„ ๋ฒ”์œ„ ์ฒ˜๋ฆฌ๋Š” SQL์„ ์‹คํ–‰ํ•  ๋•Œ ์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ์ฐพ์•„์„œ ๋จผ์ € ๋‚ด๋ณด๋‚ด๋Š” ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, SQL ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์˜ ์ด ๊ฑด์ˆ˜๊ฐ€ 500๊ฑด์ด๊ณ  ํ™”๋ฉด์— ์šฐ์„  ๋ณด์—ฌ์ค„ ๊ฑด์ˆ˜๊ฐ€ 50๊ฑด์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ž.

๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”ํ•œ 50๊ฑด๋งŒ ๋จผ์ € ์ „์†กํ•˜๋Š” ๊ฒƒ์ด ๋ถ€๋ถ„ ๋ฒ”์œ„ ์ฒ˜๋ฆฌ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•ด์•ผ๋งŒ ๋‹ค์Œ 50๊ฑด์„ ์ „์†กํ•œ๋‹ค.

๋ถ€๋ถ„ ๋ฒ”์œ„ ์ฒ˜๋ฆฌ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋น ๋ฅธ ์‘๋‹ต ์‹œ๊ฐ„์„ ๋ณด์žฅํ•ด์ค€๋‹ค.

 

์˜ˆ์‹œ1. ์‹ค์ œ ์‹คํ–‰๊ณ„ํš ๋งŒ๋“ค๊ธฐ (SQL์„ ์‹คํ–‰ํ•˜์ž๋งˆ์ž ์‹คํ–‰๊ณ„ํš ํ™•์ธํ•˜๊ธฐ)

SELECT /*+ GATHER_PLAN_STATISTICS  */
       ord.*
FROM t_ord ord
WHERE ord.ord_dt >= to_date('20170301', 'yyyymmdd');

 

์˜ˆ์‹œ2. ์‹ค์ œ ์‹คํ–‰๊ณ„ํš์„ ๋งŒ๋“  SQL์˜ SQL_ID์™€ CHILD_NUMBER ์ฐพ๊ธฐ

SELECT /*+ GATHER_PLAN_STATISTICS  */
       ord.*
FROM t_ord ord
WHERE ord.ord_dt >= to_date('20170301', 'yyyymmdd');

 

 

์˜ˆ์‹œ3. ์‹ค์ œ ์‹คํ–‰๊ณ„ํš ์กฐํšŒํ•˜๊ธฐ

SELECT *
FROM TABLE (dbms_xplan.DISPLAY_CURSOR('4ytgj6pxmdmhd',0,'ALLSTATS LAST'));

 

 

๋‚ด ํ™˜๊ฒฝ์—์„œ A-Rows๋Š” 501์ด ๋‚˜์™”๋‹ค.

๋‚ด ํ™˜๊ฒฝ์—์„œ ์šฐ์„  ์š”์ฒญํ•œ ๊ฑด์ˆ˜๊ฐ€ 501์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์ด๋ฒˆ์—๋Š” ๊ฐ™์€ SQL์„ ์žฌ์‹คํ–‰ํ•œ ํ›„์—, ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ ๋๊นŒ์ง€ ์กฐํšŒํ•œ ํ›„ ์‹คํ–‰๊ณ„ํš์„ ํ™•์ธํ•ด๋ณด์ž.

 

์˜ˆ์‹œ4. ์‹ค์ œ ์‹คํ–‰๊ณ„ํš ๋งŒ๋“ค๊ธฐ (๊ฒฐ๊ณผ๋ฅผ ๋๊นŒ์ง€ ์กฐํšŒํ•œ ํ›„ ์‹คํ–‰๊ณ„ํš ํ™•์ธํ•˜๊ธฐ)

SELECT /*+ GATHER_PLAN_STATISTICS  */
       ord.*
FROM t_ord ord
WHERE ord.ord_dt >= to_date('20170301', 'yyyymmdd');

 

์˜ˆ์‹œ5. ์‹ค์ œ ์‹คํ–‰๊ณ„ํš์„ ๋งŒ๋“  SQL์˜ SQL_ID์™€ CHILD_NUMBER ์ฐพ๊ธฐ

SELECT T1.sql_id, T1.child_number, T1.sql_text
FROM v$sql T1
WHERE T1.sql_text LIKE '%GATHER_PLAN_STATISTICS%'
ORDER BY T1.last_active_time DESC;

 

 

์˜ˆ์‹œ6. ์‹ค์ œ ์‹คํ–‰๊ณ„ํš ์กฐํšŒํ•˜๊ธฐ

SELECT *
FROM TABLE (dbms_xplan.DISPLAY_CURSOR('4ytgj6pxmdmhd',0,'ALLSTATS LAST'));

 

 

์ด๋ฒˆ์—๋Š” ์‹คํ–‰๊ณ„ํš์— A-Rows๊ฐ€ 2,606์ด ๋‚˜์™”๋‹ค.

์ฆ‰, ์Šคํฌ๋กค ๋ฐ”๋ฅผ ๋๊นŒ์ง€ ๋‚ด๋ฆฌ๊ฑฐ๋‚˜ Last Page ์กฐํšŒ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด์„œ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•ด์•ผ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์„ฑ๋Šฅ์ด ์ตœ์ ํ™”๋œ ๋ถ€๋ถ„ ๋ฒ”์œ„ ์ฒ˜๋ฆฌ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๊ณผ์ •๋ฟ ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ณผ์ •๋„ ๋ถ€๋ถ„ ๋ฒ”์œ„ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ๋ชจ๋“  SQL์„ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

'GROUP BY'๋‚˜ 'SUM', 'AVG'์™€ ๊ฐ™์€ ์ง‘๊ณ„ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋œ SQL์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์„ ๋ถ€๋ถ„ ๋ฒ”์œ„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์‰ฝ์ง€ ์•Š๋‹ค.

๋ฐ์ดํ„ฐ ์ผ๋ถ€๋ถ„๋งŒ ์ฝ์–ด์„œ๋Š” ์ง‘๊ณ„ํ•จ์ˆ˜๋‚˜ ๋ถ„์„ํ•จ์ˆ˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์—†๋‹ค.

 

์˜ˆ์‹œ7. GROUP BY๊ฐ€ ํฌํ•จ๋œ SQL์˜ ์‹ค์ œ ์‹คํ–‰๊ณ„ํš ํ™•์ธํ•˜๊ธฐ

SELECT /*+ GATHER_PLAN_STATISTICS*/
       to_char(ord.ord_dt, 'yyyymmdd') ord_ymd
       , ord.cus_id
       , sum(ord.ord_amt) ord_amt
FROM t_ord ord
WHERE ord.ord_dt >= to_date('20170301', 'yyyymmdd')
GROUP BY to_char(ord.ord_dt, 'yyyymmdd')
         , ord.cus_id;

 

(V$SQL, DBMS_XPLAN.DISPLAY_CURSOR ์ƒ๋žต)

 

 

์‹คํ–‰๊ณ„ํš ๊ฐ ๋‹จ๊ณ„์˜ A-Rows๋ฅผ ์‚ดํŽด๋ณด์ž.

2๋ฒˆ TABLE ACCESS FULL ๋‹จ๊ณ„์˜ A-Rows๋Š” 2,606์ด๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„์ธ HASH GROUP BY์˜ A-Rows๋Š” 501์ด๋‹ค.

2,606๊ฑด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„๋‚ด 'GROUP BY' ์ฒ˜๋ฆฌํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์—์„œ ์šฐ์„  ์š”์ฒญํ•œ ๊ฑด์ˆ˜ 501๊ฑด๋งŒํผ๋งŒ ๊ฒฐ๊ณผ๋กœ ๋‚ด๋ณด๋‚ด๊ณ  ์žˆ๋‹ค.

์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋ณด๋‚ผ ๋•Œ ์šฐ์„  ํ•„์š”ํ•œ ๊ฑด์ˆ˜๋งŒํผ๋งŒ ์ฒ˜๋ฆฌํ–ˆ์œผ๋ฏ€๋กœ ๋ถ€๋ถ„ ๋ฒ”์œ„ ์ฒ˜๋ฆฌ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ TABLE ACCESS FULL ๋‹จ๊ณ„์—์„œ ๊ฒฐ๊ณผ์— ํ•„์š”ํ•œ 2,606๊ฑด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์ฝ์€ ์ƒํƒœ์ด๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์—์„œ๋Š” ๋ถ€๋ถ„ ๋ฒ”์œ„์ฒ˜๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ๋ชปํ–ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

'ORDER BY'๊ฐ€ ํฌํ•จ๋œ SQL๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค.

์ •๋ ฌ๋œ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ์–ป์œผ๋ ค๋ฉด ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์•ผ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ 'ORDER BY'๋Š” SQL๊ณผ ์ธ๋ฑ์Šค์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ ์ฐพ๋Š” ๊ณผ์ •์„ ์†์‰ฝ๊ฒŒ ๋ถ€๋ถ„ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๋ฐ˜์‘ํ˜•

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Claire's Study Note

Hi.Claire

ํ™œ๋™ํ•˜๊ธฐ