[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๊ณผ ์ธ๋ฑ์ค์ ๋ฐ๋ผ ๋ฐ์ดํฐ ์ฐพ๋ ๊ณผ์ ์ ์์ฝ๊ฒ ๋ถ๋ถ ์ฒ๋ฆฌํ ์๋ ์๋ค.
'๐พ ๋ฐ์ดํฐ๋ฒ ์ด์ค > SQL BOOSTER' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SQL BOOSTER] 6-2. ๋จ์ผ ์ธ๋ฑ์ค (1) | 2024.06.09 |
---|---|
[SQL BOOSTER] 6-1. INDEX์ ๊ธฐ๋ณธ ๊ฐ๋ (0) | 2024.06.08 |
[SQL BOOSTER] 5-1. ์คํ๊ณํ (0) | 2024.03.19 |
[SQL BOOSTER] 3-2. OUTER JOIN (0) | 2024.03.19 |
[SQL BOOSTER] 3-1. INNER JOIN (0) | 2024.03.19 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Claire's Study Note
Hi.Claire