January 11, 2021
๋ชจ๋ ์์ง๋์ด ๋๋ ํ๋ก๊ทธ๋๋จธ๋ ๊ณตํต์ ์ธ ๋ณ์ ๊ฐ์ง๊ณ ์๋ค ์กฐ๊ธ์ ๊ณผ์ฅ๋ ํํ์ด์ง๋ง ๋ชจ๋ ์ต์ํ ํ ๋ฒ์ ๋ฐ๋ณต๋ฌธ ์์กด์ฆ์ด๋ผ๋ ๋ณ์ ๊ฒฝํํ ์ ์ด ์๋ค. ํ์ง๋ง SQL์๋ ๋ฐ๋ณต๋ฌธ์ด ์๋ค. SQL์ ์ผ๋ถ๋ฌ ๋ฐ๋ณต๋ฌธ์ ์ธ์ด ์ค๊ณ์์ ์ ์ธ ํ์๋ค. ์๋ํ๋ฉด โ๋ฐ๋ณต๋ฌธ์ ํ์ ์๋คโ๋ผ๋ ์๊ฐ ๋๋ฌธ์ด๋ค.
RDB๋ฅผ ์ฒ์ ์๊ฐํด๋๋ Edgar F. Codd๋ ์ ์ Relational Database : a practical foundation for productivity (1989)์์ ๋ค์๊ณผ ๊ฐ์ด ๋งํ๋ค.
๐ก ๊ด๊ณ ์กฐ์์ ๊ด๊ณ ์ ์ฒด๋ฅผ ๋ชจ๋ ์กฐ์์ ๋์์ผ๋ก ์ผ๋๋ค. ์ด๋ฌํ ๊ฒ์ ๋ชฉ์ ์ ๋ฐ๋ณต์ ์ ์ธํ๋ ๊ฒ์ด๋ค. ์ต์ข ์ฌ์ฉ์์ ์์ฐ์ฑ์ ์๊ฐํ๋ฉด ์ด๋ฌํ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค. ๊ทธ๋์ผ๋ง ์์ฉ ํ๋ก๊ทธ๋๋จธ์ ์์ฐ์ฑ์๋ ๊ธฐ์ฌํ ์ ์์ ๊ฒ์ด๋ค.
โ๊ด๊ณ ์กฐ์โ์ด๋ผ๋ ๊ฒ์ SQL์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. ๋ฐ๋ผ์ SQL์ ์ฒ์๋ถํฐ โ๋ฐ๋ณต๋ฌธ์ ์ ์ธโํ๊ณ ๋ง๋ค์ด์ง ์ธ์ด๋ผ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ Codd๋ ์ด๋ฌํ ์ด์ ๋ฅผ โ๊ทธ๊ฒ ํธํ๋๊นโ๋ผ๊ณ ์ค๋ช ํ๋ค.
์ ๊ณ์ ์ข ์ฌํ๊ณ ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ๊ฐ์ง ์์คํ ์ ๋ณด์์ ๊ฒ์ด๋ค.
SELECT
๊ตฌ๋ฌธ์ ๋ฐ๋ณต ์ฌ์ฉ์ ์ฌ์ ์๋ผ๋ ๋ง์ฒ๋ผ SQL์ ์ ์ฉํ๊ธฐ ํ๋ ์์ ์ ๋ฌด๋ฆฌํ๊ฒ SQL์ ์ฌ์ฉํ ํ์๋ ์๋ค. ๋ํ ๋ฏธ๋ค์จ์ด ๋๋ ORM๋ฑ์ ํ๋ ์์ํฌ๊ฐ ๋ด๋ถ์ ์ผ๋ก ๋ฐ๋ณต๊ณ ์ฝ๋๋ฅผ ์ฌ์ฉํด์, ์ฌ์ฉ์์๊ฒ ๋ฐ๋ก ์ ํ์ ์ฌ์ง๊ฐ ์๋ ๊ฒฝ์ฐ๋ ์๋ค.
๊ทธ๋ฐ๋ฐ ์ฌ์ค ๋ฐ๋ณต์ด ์์ผ๋ฉด ํ๋ก๊ทธ๋จ์ ์์ฐ์ฑ ํฅ์ ์ธ์๋ Codd๊ฐ ์ธ๊ธํ์ง ์์ ํฐ ์ฅ์ ์ด ์๊ธด๋ค. ๋ฐ๋๋ก ๋งํ๋ฉด ๋ฐ๋ณต๊ณ ์ฝ๋์์ ๋ฐ์ํ๋ ํฐ ๋จ์ ์ด๋ค.
๋จผ์ ๋ค์๊ณผ ๊ฐ์ 2๊ฐ์ ํ ์ด๋ธ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด์
Sales
Sales2
Sales ํ
์ด๋ธ์ ๊ฐ ๊ธฐ์
์ ํ๊ณ์ฐ๋๋ณ ๋งค์ถ์ ๊ธฐ๋กํ๋ค. ๋ค๋ง ์ฐ๋๊ฐ ์ฐ์๋์ง๋ ์๋๋ค. ์ด์จ๊ฑฐ๋ ์ด๋ฌํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด ํน์ ๊ธฐ์
์ ๋งค์ถ ๋ณํ๋ฅผ ์กฐ์ฌํ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ณผ๋ var
ํ๋๋ฅผ ์ถ๊ฐํ Sales2 ํ
์ด๋ธ์ ๋ฑ๋กํ๋ค. ์ด๋ var
ํ๋๋ ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ค.
NULL
๋ฐ๋ผ์ ์ต์ข ์ ์ผ๋ก Sales2 ํ ์ด๋ธ์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๋ค.
์๋ ์ฝ๋๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ ํ์ ์ธ ๋ฐฉ๋ฒ ์ค ํ๋๋ก Oracle์ PL/SQL
์ฝ๋์ด๋ค.
CREATE OR REPLACE PROCEDURE PROC_INSERT_VAR
IS
/* ์ปค์ ์ ์ธ */
CURSOR c_sales IS
SELECT company, year, sale FROM Sales ORDER BY company, year;
/* ๋ ์ฝ๋ ํ์
์ ์ธ */
rec_sales c_sales %ROWTYPE;
/* ์นด์ดํฐ */
i_pre_sale INTEGER :=0;
c_company CHAR(1) :='*';
c_var CHAR(1) :='*';
BEGIN
OPEN c_sales;
LOOP
/* ๋ ์ฝ๋๋ฅผ ํจ์นํด์ ๋ณ์์ ๋์
*/
fetch c_sales into rec_sales;
/* ๋ ์ฝ๋๊ฐ ์๋ค๋ฉด ๋ฐ๋ณต์ ์ข
๋ฃ */
exit when c_sales%notfound;
IF (c_company = rec_sales.company) THEN
/* ์ง์ ๋ ์ฝ๋๊ฐ ๊ฐ์ ํ์ฌ์ ๋ ์ฝ๋ ์ผ ๋ */
/* ์ง์ ๋ ์ฝ๋์ ๋งค์์ ๋น๊ต */
IF (i_pre_sale < rec_sales.sale) THEN
c_var :='+';
ELSEIF(i_pre_sale > rec_sales.sale) THEN
c_var :='-';
ELSE
c_var :='=';
END IF;
ELSE
c_var :=NULL;
END IF;
/* ๋ฑ๋ก ๋์์ด ํ
์ด๋ธ์ ํ
์ด๋ธ์ ๋ฑ๋ก */
INSERT INTO Sales2 (company, year, sale, var)
VALUES (rec_sales.company, rec_sales.year, rec_sales.sale, c_var);
c_company := rec_sales.company;
i_pre_sale := rec_sales.sale;
END LOOP;
CLOSE c_sales;
commit;
END;
ํน์ ์ฐ๋์ ๋ ์ฝ๋์ ์ง์ ์ฐ๋์ ๋ ์ฝ๋๋ฅผ ๋น๊ตํ๋ ๋ก์ง์ ๋ฐ๋ณตํ๋ ๊ฒ์ ์ ํ์ ์ธ โrecord at a time (ํ ๋ฒ์ ํ ๋ ์ฝ๋)โ์ ์ฌ๊ณ ๋ฐฉ์์ด๋ค.
๋ฐ๋ฉด ์ฌ๋ฌ ํ์ ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํ๋ SQL์ ํฌ์ฅ๊ณ๋ผ๊ณ ๋ถ๋ฅธ๋ค. ํฌ์ฅ๊ณ SQL์ ๋น์ฆ๋์ค ๋ก์ง์ SQL์ ๋ฃ์ผ๋ ค๋ค ๋ณด๋ ๊ตฌ๋ฌธ์ด ๋ณต์กํด์ ธ์ ์ ์ง ๋ณด์์ฑ์ด ๋จ์ด์ง๋ SQL ๊ตฌ๋ฌธ์ด ๋ง๋ค์ด์ง๊ธฐ๋ ํ๋ค.
ํ ๋ง๋๋ก ์ค๋ช ํ๋ค๋ฉด โ์ฑ๋ฅโ์ด๋ค. ๋ฐ๋ณต๊ณ๋ก ๊ตฌํํ ์ฝ๋๋ ํฌ์ฅ๊ณ๋ก ๊ตฌํํ ์ฝ๋์ ์ฑ๋ฅ์ ์ผ๋ก ์ด๊ธธ ์ ์๋ค. ์ฒ๋ฆฌํ๋ ๋ ์ฝ๋ ์๊ฐ ์ ์ ๋๋ ๋ฐ๋ณต๊ณ์ ํฌ์ฅ๊ณ์ ํฐ ์ฐจ์ด๊ฐ ์๋ค. ๊ฒ๋ค๊ฐ ์คํ๋ ค ๋ฐ๋ณต๊ณ๊ฐ ๋น ๋ฅธ ๊ฒฝ์ฐ๋ ์๋ค. ํ์ง๋ง ์ฒ๋ฆฌํ๋ ๋ ์ฝ๋ ์๊ฐ ๋ง์์ง๋ฉด ๋ง์์ง์๋ก ์ฐจ์ด๋ ์ ์ ๋ ๋ฒ์ด์ง๋ค.
๋ฐ๋ณต๊ณ์ ์ฒ๋ฆฌ ์๊ฐ์ด ์ฒ๋ฆฌ ๋์ ๋ ์ฝ๋ ์์ ๋ํด ์ ํ์ผ๋ก ์ฆ๊ฐํ๋ ์ด์ ๋ ๊ฐ๋จํ๋ค. ๋ฐ๋ณต๊ณ์ ์ฒ๋ฆฌ ์๊ฐ์ <์ฒ๋ฆฌ ํ์> * <ํ ํ์ ๊ฑธ๋ฆฌ๋ ์ฒ๋ฆฌ ์๊ฐ>
์ด๋ฏ๋ก <ํ ํ์ ๊ฑธ๋ฆฌ๋ ์๊ฐ>
์ด ์ผ์ ํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ์ฒ๋ฆฌ ํ์ (์ฒ๋ฆฌ ๋์ ๋ ์ฝ๋ ์)์ ๋น๋กํ ๊ฒ์ด๋ค.
๋ฐ๋๋ก ํฌ์ฅ๊ณ์ ๊ฒฝ์ฐ, SQL ํจํด์ด ๋ค์ํ๋ฏ๋ก ์์ ํ ์ด๋ฌํ ๋์ ํจ์์ ๊ณก์ ์ด ๋๋ค๊ณ ๋จ์ธํ ์๋ ์๋ค. ๋ค๋ง ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ๊ทผ์ด๊ณ , ์คํ ๊ณํ ๋ณ๋์ด ์๋ค๊ณ ํ๋ค๋ฉด ๋๋ถ๋ถ ์ด๋ ๊ฒ ์๋งํ ์ปค๋ธ๋ฅผ ๊ทธ๋ฆฌ๊ฒ ๋๋ค.
SQL์ ์คํ ํ ๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๊ฑฐ๋ ์ฐ์ฐํ๋ ์ค์ ์ SQL ์ฒ๋ฆฌ ์ด์ธ์๋ ๋ค์ํ ์ฒ๋ฆฌ๊ฐ ์ด๋ฃจ์ด ์ง๋ค.
์ ์ฒ๋ฆฌ
1๏ธโฃ SQL ๊ตฌ๋ฌธ์ ๋คํธ์ํฌ๋ก ์ ์ก
2๏ธโฃ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ
3๏ธโฃ SQL ๊ตฌ๋ฌธ ํ์ค
4๏ธโฃ SQL ๊ตฌ๋ฌธ์ ์คํ ๊ณํ ์์ฑ ๋๋ ํ๊ฐ
ํ์ฒ๋ฆฌ
5๏ธโฃ ๊ฒฐ๊ณผ ์งํฉ์ ๋คํธ์ํฌ๋ก ์ ์ก
1๏ธโฃ ๊ณผ 5๏ธโฃ ๋ SQL์ ์คํํ๋ ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๊ฐ์ ๋ณธ์ฒด์ ์๋ค๋ฉด ๋ฐ์ํ์ง ์์ ๊ฒ์ด๋ค. ํ์ง๋ง ์ผ์ ๊ท๋ชจ ์ด์์ ์์คํ
์์๋ ๋ณดํต ์ ํ๋ฆฌ์ผ์ด์
์๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ๋ฅผ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ถ๋ฆฌํด์ ์ฌ์ฉํ๋ฏ๋ก SQL ๊ตฌ๋ฌธ ๋๋ ๊ฒฐ๊ณผ ์งํฉ์ ๋คํธ์ํฌ๋ก ์ ์กํด์ผ ํ๋ค. ๊ทธ๋ ๋ค๊ณ ํด๋ ์ผ๋ฐ์ ์ผ๋ก ๋ ๊ฐ์ง๋ ๊ฐ์ ๋ฐ์ดํฐ์ผํฐ ๋ด๋ถ์ ๋์ผ LAN์์ ์์ผ๋ฏ๋ก ์ ์ก ์๋ ์์ฒด๋ ๊ณ ์(๊ฑฐ์ ms
) ์ธ ๋งํผ ์ค๋ฒํค๋๊ฐ ๋ฑํ ์ผ์ด๋์ง ์๋๋ค.
2๏ธโฃ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ SQL ๊ตฌ๋ฌธ์ ์คํํ๊ธฐ ์ํ ์์ ์ด๋ค. ์ผ๋จ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํด์ ์ธ์ ์ ์ค์ ํด์ผ ํ๋ฏ๋ก ๋ฐ์ํ๋ ์ฒ๋ฆฌ์ด๋ค. ํ์ง๋ง ์ต๊ทผ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฏธ๋ฆฌ ์ฐ๊ฒฐ์ ์ผ์ ์ ํ๋ณดํด์ ์ด๋ฐ ์ค๋ฒํค๋๋ฅผ ๊ฐ์์ํค๋ ์ปค๋ฅ์ ํ(Connection Pool)์ด๋ผ๋ ๊ธฐ์ ์ ์ฌ์ฉํ๋ค. ๋ฐ๋ผ์ 2๏ธโฃ๋ ๊ฑฐ์ ๋ฌธ์ ๋์ง ์๋๋ค.
์ค๋ฒํค๋ ์ค์์๋ ๊ฐ์ฅ ์ํฅ์ด ํฐ ๊ฒ์ 3๏ธโฃ๋๋4๏ธโฃ์ด๋ค. ํนํ ์กฐ๊ธ ์ฑ๊ฐ์ ๊ฒ์ ๊ณ ๋ฅธ๋ค๋ฉด 3๏ธโฃ, SQL ํ์ค(๊ตฌ๋ฌธ ๋ถ์)์ด๋ค. ํ์ค๋ DBMS๋ง๋ค ํ๋ ๋ฐฉ๋ฒ๋ ๋ฏธ๋ฌํ๊ฒ ๋ค๋ฅด๊ณ ์ข ๋ฅ๋ ๊ต์ฅํ ๋ง๋ค. ํนํ ์ข ๋ฅ์ ๋ฐ๋ผ ๋๋ฆฐ ๋ถ๋ถ์ 0.1์ด ~ 1์ด ์ ๋ ๊ฑธ๋ฆฐ๋ค. ์ด๋ ๋ค๋ฅธ ์ค๋ฒํค๋๊ฐ ๋ฐ๋ฆฌ ์ด๋ก ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ ๋นํด ๊ต์ฅํ ํฌ๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ SQL์ ๋ฐ์ ๋๋ง๋ค ์คํ๋๋ฏ๋ก ์์ SQL์ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํ๋ ๋ฐ๋ณต๊ณ์์๋ ์ค๋ฒํค๋๊ฐ ๋์์ง ์ ๋ฐ์ ์๋ค.
๋ฐ๋ณต๊ณ๋ ๋ฐ๋ณต 1ํ ๋ง๋ค์ ์ฒ๋ฆฌ๋ฅผ ๊ต์ฅํ ๋จ์ํ ํ๋ค. ๋ฐ๋ผ์ ๋ฆฌ์์ค๋ฅผ ๋ถ์ฐํด์ ๋ณ๋ ฌ ์ฒ๋ฆฌํ๋ ์ต์ ํ๊ฐ ์๋๋ค. CPU์ ๋ฉํฐ ์ฝ์ด๋ก ๋ถ์ฐ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ ๊ฒ์ ๋ฌผ๋ก ์ ์ฅ์์ ๋ถ์ฐ ํจ์จ์ด ๋ฎ๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ ์ ์ฅ์๋ ๋๋ถ๋ถ RAID ๋์คํฌ๋ก ๊ตฌ์ฑ๋์ด I/O ๋ถํ๋ฅผ ๋ถ์ฐ ํ ์ ์๊ฒ ๋์ด ์๋ค. ํ์ง๋ง ๋ฐ๋ณต๊ณ์์ ์คํํ๋ SQL๊ตฌ๋ฌธ์ ๋๋ถ๋ถ ๋จ์ํด์ 1ํ์ SQL๊ตฌ๋ฌธ์ด ์ ๊ทผํ๋ ๋ฐ์ดํฐ์์ด ์ ๋ค. ๋ฐ๋ผ์ I/O๋ฅผ ๋ณ๋ ฌํ ํ๊ธฐ ํ๋ค๋ค๋ ๋จ์ ์ด ์๋ค.
DBMS๋ ๋จ์ํ SQL ๊ตฌ๋ฌธ๊ณผ ๊ฐ์ โ๊ฐ๋ฒผ์ดโ์ฒ๋ฆฌ๋ฅผ ๋น ๋ฅด๊ฒ ๋ง๋๋ ๊ฒ์ ์ฌ์ค ์์ค์๋ ์๋ค. ๋ฐ๋ผ์ ๋ฐ๋ณต๊ณ๋ ๋ฏธ๋ค์จ์ด ๋๋ ํ๋์จ์ด์ ์งํ์ ๋ฐ๋ฅธ ํํ์ ๊ฑฐ์ ๋ฐ์ ์ ์๋ค. ์ค์ ๋ก ๋ฐ๋ณต๊ณ์ ์ฒ๋ฆฌ๊ฐ ๋๋ ค์ ๋ฌธ์ ๊ฐ ๋๋ ๊ฒฝ์ฐ ๊ทธ๋ฅ ๋์ถฉ ์ค์ผ์ผ์ ์ ํ๋ ๊ฒฝ์ฐ๋ ์๋ค. ํ์ง๋ง ๋ฌผ๋ฆฌ ๋ฆฌ์์ค๊ฐ bottle neck์ด ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ์ค์ผ์ผ์ ์ ํด๋ ์๋๊ฐ ๋นจ๋ผ์ง์ง ์๋ ๊ฒฝ์ฐ๋ ๋ง๋ค.
์ ์ธ๊ฐ์ง ์ด์ ๋ก ๋ฐ๋ณต๊ณ๋ ํฌ์ฅ๊ณ์ ๋นํด ์ฑ๋ฅ์ ๊ด์ ์์ ๋น๊ต๊ฐ ๋ถ๊ฐ๋ฅํ๋ค. ๋ฌผ๋ก ์ด๋ฌํ ๋น๊ต๊ฐ ์ฑ๋ฆฝ๋๋ ค๋ฉด ํฌ์ฅ๊ณ์ SQL์ด ์ถฉ๋ถํ ํ๋๋์ด ์๋ค๋ ๊ฒ์ด ์ ์ ๋์ด์ผ ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ํฌ์ฅ๊ณ์ SQL์ ๋ฐ๋ณต๊ณ์ ๋นํด ๊ต์ฅํ ๋ณต์กํ๋ค. ๋ฐ๋ผ์ ํ๋๋์ง ์์ ์ํ์์๋ ๋ฐ๋ณต๊ณ์๊ฒ ์ง ์๋ ์๋ค. ํ์ง๋ง ํฌ์ฅ๊ณ์ SQL๊ตฌ๋ฌธ์ ํ๋ ๊ฐ๋ฅ์ฑ์ด ๊ต์ฅํ ๋์ผ๋ฏ๋ก ์ ๋๋ก ํ๋ํ๋ค๋ฉด ์ฒ์๊ณผ ๋น๊ตํด์ ํ๊ฒฉํ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ์์ ๊ฒ์ด๋ค.
์ด๋ฌํ ํฌ์ฅ๊ณ์ ์ฅ์ ์ ๋ฐ๋๋ก ๋ฐ๋ณต๊ณ์ ๋จ์ ์ด๋ผ๊ณ ํ ์ ์๋ค. ๋ฐ๋ผ์ ๋ฐ๋ณต๊ณ๋ ๋จ์ง ๋๋ฆฌ๊ธฐ๋ง ํ ๊ฒ์ด ์๋๋ผ ๋๋ฆฐ ๊ตฌ๋ฌธ์ ํ๋ํ ์ ์๋ ๊ฐ๋ฅ์ฑ๋ ๊ฑฐ์ ์๋ค๊ณ ํ ์ ์๋ค. ๋ฐ๋ณต๊ณ๊ฐ ์ ๋ง ๋ฌด์์ด ๊ฒ์ ๋ฐ๋ก ์ด ๋จ์ ์ด๋ค.
์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ์๋ฏธํ๋ค. ์ปท์ค๋ฒ์ง์ ์ ์ฑ๋ฅ ๊ฒ์ฆ์์ ๋ฌธ์ ๊ฐ ๋ฐ๊ฒฌ๋์ด ์ผ๊ทผ๊ณผ ์ฒ ์ผ์ ์๋ฌ๋ฆฌ๊ณ ์๋ ํ์ฅ์ ์ฐ๋ฆฌ๋ค ์์ ์ด๋ฌํ ๋ง๋ผ๋จน์ โ์ ์โ์ผ๋ก ๋น์ถ์ ์ฌ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ โ์ปจ์คํดํธโ์ด๋ค. ํ์ง๋ง ์ค์ ์ํฉ์์๋ ์ด๋ฌํ ์ ํ์ง๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
๋ฐ๋ณต๊ณ์์ ์ฌ์ฉํ๋ SQL๊ตฌ๋ฌธ์ ๋๋ฌด ๋จ์ํ๋ค. ์คํ ๊ณํ์ ๋ณด์๋ unique scan
๋๋ index range scan
์ ๋ ๋ฟ์ด๋ค. ์ด๋ฐ ๊ฐ๋จํ ๊ตฌ๋ฌธ์ ์ด๋๋ฅผ ์ด๋ป๊ฒ ํ๋ํด์ผ ํ ๊น?
๊ฒ๋ค๊ฐ INSERT
๊ตฌ๋ฌธ์ ๋ฐ๋ณตํ๋ ๊ฒฝ์ฐ๋ ์๋ค. INSERT
๊ตฌ๋ฌธ์ SELECT
๊ตฌ๋ฌธ๋ณด๋ค ๊ณ ์ํ๊ฐ ๋ ์ด๋ ต๋ค. ๋ฐ๋ผ์ ํ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ฑ ์ ํ๋๋ค.
์์ ์ ํ์ง ๋ณด๋จ ๊ฐ์ฅ ํฌ๋ง์ ์ธ ์ ํ์ง์ด๋ค. CPU ๋๋ ๋์คํฌ์ ๊ฐ์ ๋ฆฌ์์ค์ ์ฌ์ ๊ฐ ์๊ณ ์ฒ๋ฆฌ๋ฅผ ๋๋ ์ ์๋ ํค๊ฐ ๋ช ํํ๊ฒ ์ ํด์ ธ ์๋ค๋ฉด, ์ฒ๋ฆฌ๋ฅผ ๋ค์คํํด์ ์ฑ๋ฅ์ ์ ํ์ ๊ฐ๊น๊ฒ ์ค์ผ์ผํ ์ ์๋ค. ๋ฌผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ด ํ์ํ์ง๋ง, ์ฒ์๋ถํฐ ๋ค์ค๋๋ฅผ ์ค์ ํ ์ ์๊ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ค๋ฉด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ํ์ฅ ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ๋ฐ๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถํ ํ ์ ์๋ ๋ช ํํ ํค๊ฐ ์๊ฑฐ๋, ์์๊ฐ ์ค์ํ ์ฒ๋ฆฌ, ๋ณ๋ ฌํํ์ ๋ ๋ฌผ๋ฆฌ ๋ฆฌ์์ค๊ฐ ๋ถ์กฑํ๋ค๋ฉด ์ด๋ฌํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค.
์ด๋ ๊ฒ ๋ฐ๋ณต๊ณ๋ผ๋ ๊ฒ์ ํ๋์ ์ ํ์ง๊ฐ ๊ต์ฅํ ํ์ ์ ์ด๋ค. ๋ฐ๋ผ์ ๋ฐ๋ณต๊ณ๋ก ๋ง๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋๋ฆฌ๋ค๋ฉด ๋๋์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ๊ฐ์คํด์ผ ํ๋ค. ๋ค๋ง ์๋ฐฑ ๊ฐ ์ ๋๋ง ๋ฐ๋ณตํ๋ค๋ฉด, ๋ฐ๋ณต๊ณ๋ผ๋ ์ฑ๋ฅ์ด ์ถฉ๋ถํ ๊ด์ฐฎ๊ฒ ๋์จ๋ค. ๋ฐ๋ผ์ ๋ฌด์กฐ๊ฑด ๋ฐ๋ณต๊ณ๋ฅผ ์ ๋์ํ ํ์๋ ์๋ค. ํ์ง๋ง ์๋ฐฑ ๋๋ ์์ฒ๋ง ๋ฒ์ ๋ฐ๋ณต์ ๊ธฐ๋ณธ์ด๋ผ ์๊ฐํ๋ ์ผ๊ด ์ฒ๋ฆฌ์์๋ ๋ฐ๋์ ์ฃผ์๊ฐ ํ์ํ๋ค. ๋ํ ํ๋ ์์ํฌ ๋๋ ์ ๋ฌด ํจํค์ง ๋ด๋ถ์์ ๋ฐ๋ณต๊ณ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๊ฝค ์๋๋ฐ, ์ด๋ฐ ๊ฒฝ์ฐ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ด ๋์ฑ ํ๋ค์ด์ง๋ค.
์ด๊ฒ์ ๋ชจ๋ ๋ฐ๋ณต๊ณ์ SQL๊ตฌ๋ฌธ์ด ์ง๋์น๊ฒ ๋จ์ํด์ ์๊ธฐ๋ ์ฅ์ ์ด๋ค.
SELECT sale FROM sales2 WHERE company = 'A';
์ด๋ฐ ๋จ์ํ ์ฟผ๋ฆฌ๋ ์คํ ๊ณํ๋ ์์ฒญ๋๊ฒ ๋จ์ํ๋ค.
์คํ ๊ณํ์ด ๋จ์ํ๋ค๋ ๊ฒ์ ํด๋น ์คํ ๊ณํ์ ๋ณ๋ ์ํ์ด ๊ฑฐ์ ์๋ค๋ผ๋๊ฒ์ ๋ํ๋ธ๋ค. ๋ณ๋์ด ์ผ์ด๋๋ค๊ณ ํด ๋ดค์ ๊ฒจ์ฐ ์ตํฐ๋ง์ด์ ์์ ์ฌ์ฉํ๋ ์ธ๋ฑ์ค๋ฅผ ๋ฐ๊พธ๋ ์ ๋์ด๋ค. ๋ฐ๋ผ์ ์ค์ ์ด์ฉ ์ค์ ๊ฐ์๊ธฐ ์คํ ๊ณํ์ด ๋ฐ๋์ด ๋๋ ค์ง๋ ํ์์ ์ผ์ด๋์ง ์๋๋ค. ์ด๋ฐ ํ์์ ๋น์ฉ ๊ธฐ๋ฐ(cost base)์ ์ตํฐ๋ง์ด์ ์์๋ ์๋ช ์ ์ธ ๊ฒ์ธ๋ฐ, ๊ทธ๋ก๋ถํฐ ์กฐ๊ธ์ ์์ ๋ก์์ง ์ ์๋ค๋ ๊ฒ์ด๋ค. ํนํ SQL๊ตฌ๋ฌธ ๋ด๋ถ์์ ๊ฒฐํฉ์ ์ฌ์ฉํ์ง ์์๋ ๋๋ค๋ ๊ฒ์ด ๊ต์ฅํ ํฌ๊ฒ ์์ฉํ๋ค. ์คํ ๊ณํ ๋ณ๋์์ ๊ฐ์ฅ ๊ณจ์นซ๊ฑฐ๋ฆฌ๊ฐ ๋๋ ๊ฒ์ด ๋ฐ๋ก ๊ฒฐํฉ ์๊ณ ๋ฆฌ์ฆ์ ๋ณ๊ฒฝ์ด ๋๋ฌธ์ด๋ค.
์ด๋ ์ด๋ค ์๋ฏธ์์ ๊ท์น ๊ธฐ๋ฐ(rule base)์์ ๋น์ฉ ๋ฐํ์ผ๋ก ๋ณํํ๋ DBMS์ ๋นํ๋ฅผ ๊ฑฐ์ค๋ฅด๋ ๊ฒ์ด๋ค. ์ตํฐ๋ง์ด์ ๊ฐ ์๋ฒฝํ์ง ์์ ํ์ฌ ์์ ์์ ์์ ์ ์ธ ์ฑ๋ฅ์ ํ๋ณดํ ์ ์๋ค๋ ๊ฒ์ ์ ๋ง ์ด๋ง์ด๋งํ ์ฅ์ ์ด๋ค.
๋ฐ๋๋ก ๋งํ๋ฉด, ์ด๋ ํฌ์ฅ๊ณ์ ๋จ์ ์ด๋ค. ํฌ์ฅ๊ณ๋ SQL๊ตฌ๋ฌธ์ด ๋ณต์กํ ๋งํผ ์คํ ๊ณํ์ ๋ณ๋ ๊ฐ๋ฅ์ฑ์ด ๊ต์ฅํ ํฌ๋ค. ๋ฌผ๋ก ์ตํฐ๋ง์ด์ ๊ฐ ์ ํ ๊ฒ์ผ๋ก ์๊ฐํ๋ฉด ์ฅ์ ์ด๊ณ , ์ํํ๋ค ์๊ฐํ๋ฉด ๋จ์ ์ด ๋๋ ๋ฏธ๋ฌํ ๋ถ๋ถ์ด๋ค. ํ์ง๋ง ํ ์์ ์์, ์คํ ๊ณํ ๋ณ๋์ด ์ฌ์ด SQL๊ตฌ๋ฌธ์ ๋ํด์๋ ๋ถ๋ถ์ ์ผ๋ก ํํธ ๊ตฌ๋ฌธ์ ์ฌ์ฉํด ์คํ ๊ณํ์ ์ฌ์ฉํ๊ฑฐ๋, ์กฐ๊ธ ๋จ์ํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
์คํ ๊ณํ์ด ๋จ์ํ๊ณ ์ฑ๋ฅ์ด ์์ ์ ์ด๋ผ๋ ๊ฒ์ ์ถ๊ฐ์ ์ธ ์ฅ์ ์ ๊ฐ์ ธ์จ๋ค. ๋ฐ๋ก ์์ ์ฒ๋ฆฌ ์๊ฐ์ ์ ๋ฐ๋๊ฐ ๋๋ค๋ ๊ฒ์ด๋ค. ๋ฐ๋ณต๊ณ์ ์ฒ๋ฆฌ ์๊ฐ์ ๋ค์๊ณผ ๊ฐ์ด ํํ ํ ์ ์๋ค.
<์ฒ๋ฆฌ ์๊ฐ> = <ํ ๋ฒ์ ์คํ ์๊ฐ> * <์คํ ํ์>
์คํ ํ์๋ ๊ธฐ๋ฅ ์๊ฑด์ผ๋ก ์ ์ ์๋ค. ํํธ ํ ๋ฒ์ ์คํ ์๊ฐ์ ๋์ถฉ 0.1๋ฐ๋ฆฌ ์ด ~ 0.5์ด ์ ๋ ์ฌ์ด์ด๋ค. 0.1๋ฐ๋ฆฌ ์ด์ 0.5์ด๋ 5000๋ฐฐ ์ฐจ์ด๊ฐ ์๋ค ์๊ฐํ ์ ์์ง๋ง ์ ๋์น๋ก ๋ณด๋ฉด ๊ทธ๋ ์ง๋ง SQL ๊ตฌ๋ฌธ์ ๋ฏธ์ธํ ์กฐ๊ฑด์ ์ฐจ์ด๋ก ์๋ฐฐ ~ ์๋ฐฑ ๋ฐฐ์ ์ฐจ์ด๊ฐ ๋์ค๋ ๊ฒ์ด๋ฏ๋ก, ์ด ์ ๋๋ง ํด๋ ์์์ ์ํ ์ ๋ฐ๋๊ฐ ๋๋ค๊ณ ๋งํ ์ ์๋ค. ํฌ์ฅ๊ณ๋ ์คํ ๊ณํ์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ์ ํ ๋ฌ๋ผ์ง๋ฏ๋ก ํ๋ก๊ทธ๋จ์ ์ฌ์์ ์ฌ์ ์ ์์ํ๊ธฐ ์กฐ์ฐจ ํ๋ค๋ค. ๊ทธ์ ๋นํ๋ฉด ๊ต์ฅํ ๊ด์ฐฎ๋ค.
์ ๋ฐํ ์์์ ํ๋ ค๋ฉด, ์ด๋ ์ ๋ ๊ท๋ชจ๊ฐ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด ๋ชจ๋ธ ๊ฒ์ฆ์ ํ ๋ค์, ๋ช ๊ฐ์์ ์ด๋ ์ ๋์ ์คํ ์๊ฐ์ด ๋์ค๋์ง ์ธก์ ํ๊ณ (10๋ง ๊ฑด, 100๋ง ๊ฑด, 1000๋ง ๊ฑด ๋ฑ), ์คํ ์๊ฐ์ด ์ ํ์ผ๋ก ์ฆ๊ฐํ๋์ง ์ฌ๋ถ์ ๊ธฐ์ธ๊ธฐ๋ฅผ ํ์ธํด์ ๊ณ์ฐํด์ผ ํ๋ค.
๋ฐ๋ณต๊ณ์ ๋ ํ๋์ ์ฅ์ ์ ํธ๋์ญ์ ์ ์ ๋ฐ๋๋ฅผ ๋ฏธ์ธํ๊ฒ ์ ์ดํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด ๊ฐฑ์ ์ฒ๋ฆฌ๋ฅผ ๋ฐ๋ณต๊ณ์์, ํน์ ๋ฐ๋ณต ํ์๋ง๋ค ์ปค๋ฐํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ๋ง์ฝ ์ค๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๊ณ ํด๋, ์ค๊ฐ์ ์ปค๋ฐ์ ํ์ผ๋ฏ๋ก ํด๋น ์ง์ ๊ทผ์ฒ์์ ๋ค์ ์ฒ๋ฆฌ๋ฅผ ์คํํ๋ฉด ๋๋ค. ๋ํ ํน์ ์ด์ ๋ก ๋ฐฐ์น๋ฅผ ์ ์ ์ค๋จํด์ผ ํ ๋๋ ํด๋น ์ง์ ๊ทผ์ฒ์์ ๋ค์ ์ฒ๋ฆฌ๋ฅผ ์คํํ ์ ์๋ค. ์ด๋ฌํ ๋ฏธ์ธํ ์ ์ด๋ ํฌ์ฅ๊ณ์ SQL๊ตฌ๋ฌธ์์๋ ํ ์ ์๋ ๊ฒ์ด๋ค. ํฌ์ฅ๊ณ์์๋ ๊ฐฑ์ ์ฒ๋ฆฌ ์ค๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด, ์ฒ๋ฆฌ๋ฅผ ์ฒ์๋ถํฐ ๋ค์ ์คํํด์ผ ํ๋ค.
SQL์์ ๋ฐ๋ณต์ ๋์ ํ๋ ์๋จ์ ๋ฐ๋ก CASE
์๊ณผ ์๋์ฐ ํจ์์ด๋ค. ์ ํํ๊ฒ CASE
์์ ์ ์ฐจ ์งํฅํ ์ธ์ด์์ ๋งํ๋ IF-THEN-ELSE
๊ตฌ๋ฌธ์ ๋์ํ๋ ๊ธฐ๋ฅ์ด๋ค.
SQL์์๋ CASE์๊ณผ ์๋์ฐ ํจ์๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ์ธํธ๋ผ๊ณ ๊ธฐ์ตํ๋ฉด๋๋ค. ๋ฐ๋ณต๊ณ์ ์ฝ๋๋ฅผ ํฌ์ฅ๊ณ์ SQL๋ก ์์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
INSERT INTO sales2
SELECT company, year, sale, CASE SIGN(sale - MAX(sale)
OVER(PARTITION BY company ORDER BY year
ROWS BETWEEN 1 PRECEDING
AND 1 PRECEDING))
WHEN 0 THEN '='
WHEN 1 THEN '+'
WHEN -1 THEN '-'
ELSE NULL END AS var
FROM sales
์ด ์ฝ๋์ ํฌ์ธํธ๋ ๋ฐ๋ก SIGN
ํจ์์ด๋ค. SIGN
ํจ์๋ ์ซ์ ์๋ฃํ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ์์๋ผ๋ฉด -1, ์์๋ผ๋ฉด 1, 0์ด๋ผ๋ฉด 0์ ๋ฆฌํดํ๋ ํจ์์ด๋ค. ์ฌ๊ธฐ์๋ ์ง์ ์ฐ๋์์ ํ๋งค ๋ณํ๋ฅผ ์๊ณ ์ ์ฌ์ฉํ๋ค. CASE
์์ ์กฐ๊ฑด ๋ถ๋ถ์ ์๋์ฐ ํจ์๋ฅผ ๋ช ๋ฒ์ฉ ์ฌ์ฉํ์ง ์๋๋ก ํด์ฃผ๋ ๊ธฐ์ ์ด๊ธฐ๋ ํ๋ค.
๊ทธ๋ผ ์ด์ INSERT
๊ตฌ๋ฌธ์ ์ ์ธํ SELECT
๊ตฌ๋ฌธ์ ์คํ ๊ณํ์ ์ดํด๋ณด์
์ผ๋จ sales ํ
์ด๋ธ์ ํ์ค์บํ๊ณ (WHERE
๊ตฌ๋ฅผ ์ฌ์ฉํ ์กฐ๊ฑด ์ง์ ์ด ์์ผ๋ฏ๋ก ๋น์ฐํจ), ์๋์ฐ ํจ์๋ฅผ ์ ๋ ฌ๋ก ์คํํ๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค. (Extra : Using filesort
) ํ์ฌ SELECT ๊ตฌ๋ฌธ์ ๊ฒฐํฉ์ ์ฌ์ฉํ์ง ์๋๋ค. ๋ฐ๋ผ์ ํ
์ด๋ธ์ ๋ ์ฝ๋ ์๊ฐ ์ฆ๊ฐํด๋ ์คํ ๊ณํ์ ๋ณ๋ค๋ฅธ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฏ๋ก ์์ ์ ์ด๋ผ ๋งํ ์ ์๋ค.
์ ์ฝ๋์์ ์ค์ํ ํฌ์ธํธ๋ ์๋์ฐ ํจ์์ ROWS BETWEEN
์ต์
์ ์ฌ์ฉํ ๊ฒ์ด๋ค. ์ด๋ ๋์ ๋ฒ์์ ๋ ์ฝ๋๋ฅผ ์ง์ ์ 1๊ฐ๋ก ์ ํํ๋ ๊ฒ์ด๋ค. ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING
์ โํ์ฌ ๋ ์ฝ๋์์ 1๊ฐ ์ด์ ๋ถํฐ 1๊ฐ ์ด์ ๊น์ง์ ๋ ์ฝ๋ ๋ฒ์โ๋ฅผ ๋ํ๋ธ๋ค. ๋ฐ๋ผ์ ์ง์ ์ 1๊ฐ๋ก ๋ ์ฝ๋๋ฅผ ์ ํํ๊ฒ ๋๋ค.
๋ฐ๋ผ์ ํ์ฌ ์๋์ฐ ํจ์๋ โ๊ฐ์ ํ์ฌ์ ์ง์ ๋งค์โ์ ๋ฆฌํดํ๊ณ ๋ค์๊ณผ ๊ฐ์ด ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
SELECT company, year, sale,
MAX(company)
OVER (PARTITION BY company ORDER BY year
ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS pre_company,
MAX(sale)
OVER (PARTITION BY company ORDER BY year
ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS pre_sale,
FROM sales;
์ด๋ ๋ง์ฝ ๋น๊ต ๋์ ๋ ์ฝ๋๋ฅผ โ1๊ฐ ์ ๋ ์ฝ๋โ๊ฐ ์๋ โ2๊ฐ ์ ๋ ์ฝ๋โ๋ก ํ๊ณ ์ถ๋ค๋ฉด ROWS BETWEEN 2 PRECEDING AND 2 PRECEDING
์ผ๋ก ๋ฒ์๋ฅผ ๋ณ๊ฒฝํ๋ค. ์ด๋ฌํ ์ ์ฐํจ์ ์๋์ฐ ํจ์๊ฐ ๋ณด๊ธ๋๊ธฐ ์ด์ ์ ์ฌ์ฉํ๋ ์๊ด ์๋ธ์ฟผ๋ฆฌ๋ก๋ ํ๊ธฐ ํ๋ ๊ฒ์ด๋ค.
๐ก ์๊ด ์๋ธ๋ญ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋์ ๋ ์ฝ๋ ์ ํ
์๊ด ์๋ธ์ฟผ๋ฆฌ๋ ์๋ธ์ฟผ๋ฆฌ ๋ด๋ถ์์ ์ธ๋ถ ์ฟผ๋ฆฌ์์ ๊ฒฐํฉ ์กฐ๊ฑด์ ์ฌ์ฉํ๊ณ , ํด๋น ๊ฒฐํฉ ํค๋ก ์๋ผ์ง ๋ถ๋ถ ์งํฉ์ ์กฐ์ํ๋ ๊ธฐ์ ์ด๋ค. ์ด๋ ๋ ์ ์์ ์๋์ฐ ํจ์์
PARTITION BY
๊ตฌ์ORDER BY
๊ตฌ์ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ฐ๋๋ค. ์์ ์์ฑํ ์ฝ๋์ ๊ฐ์ ๊ฒฐํฉ์ ๊ฒ์ํ๋ ์ฝ๋๋ฅผ ์๊ด ์๋ธ์ฟผ๋ฆฌ๋ก ์์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋๋ค.SELECT company, year, sale, (SELECT company FROM sales S2 WHERE S1.company = S2.company AND year = (SELECT MAX(yaer) FROM sales S3 WHERE S1.company = S3.company # ์๊ด ์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐํฉ ์กฐ๊ฑด AND S1.year > S3.year)) AS pre_company (SELECT sale FROM sales S2 WHERE S1.company = S2.company AND year = (SELECT MAX(yaer) FROM sales S3 WHERE S1.company = S3.company # ์๊ด ์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐํฉ ์กฐ๊ฑด AND S1.year > S3.year)) AS pre_sale FROM sales S1
์๊ด ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ฝ๋์์๋ โ์ง์ โ ๋๋ โ์งํโ์ ๋ฐ์ดํฐ๋ฅผ ๊ตฌํ ๋
MAX
/MIN
ํจ์๋ฅผ ์ฌ์ฉํ๋ค. ๋ฐ๋ผ์ ๋ ๋ฒ์งธ, ์ธ ๋ฒ์งธ์ ๋ฐ์ดํฐ๋ฅผ ๊ตฌํ๋ ๊ฒ์ ์กฐ๊ธ ์ด๋ ต๋ค. ๋ํ ์คํ ๊ณํ์ด ๊ต์ฅํ ๋ณต์กํด์ง๋ฏ๋ก ์ฑ๋ฅ์ ์ธ ๋ฆฌ์คํฌ๋ ๋ฐ์ํ๋ค.
์ผ๋ณธ์์๋ 413-0033์ฒ๋ผ ํ์ดํ(-
)์ผ๋ก ๊ตฌ๋ถ๋ 7์๋ฆฌ ์ซ์๋ฅผ ์ฐํธ๋ฒํธ๋ก ์ฌ์ฉํ๋ค. ์์ ์ธ ์๋ฆฌ๋ ์ง์ญ์ ๋ํ๋ด๊ณ , ์ค๋ฅธ์ชฝ ๋ค ์๋ฆฌ๋ ํด๋น ์ง์ญ์ ์กฐ๊ธ ๋ ์์ธํ๊ฒ ๋๋์ด ์ผ๋ จ ๋ฒํธ๋ฅผ ๋ถ์ธ ๊ฒ์ด๋ค. ์ ์ผ์ฑ ๊ด์ ์์ ๋ณด๋ฉด, ํ์ดํ์ ์ ์ธํ 4130033์ ๊ฐ์ ์ผ๊ณฑ ์๋ฆฌ ์ซ์๊ฐ ์ ์ผํ๋ค. ์ด๋ ํ์ ์๋ฆฟ์๊น์ง ์ผ์นํ ์๋ก ๊ฐ๊น์ด ์ง์ญ์์ ๋ํ๋ธ๋ค. ์๋ฅผ ๋ค์ด 4130033์ ์์ฆ์ค์นดํ ์ํ๋ฏธ์ ์ํ๋ฏธ๋ฅผ ๋ํ๋ด๊ณ 4130002๋ ์์ฆ์ค์นดํ ์ํ๋ฏธ์ ์ด์ฆ์ฐ์ ๋ํ๋ด๋ฏ๋ก ์ธ์ ํ ์ง์ญ์ด๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
์ด๋ฌํ ์ฐํธ๋ฒํธ์ ์ฑ์ง์ ์ฌ์ฉํด์ ๊ฐ๋จํ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์. ์ผ๋จ ์ฐํธ๋ฒํธ๋ฅผ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ์ ๋ง๋ ๋ค. ์ด ํ ์ด๋ธ์ ์ ์ฅํ๋ ์ฐํธ๋ฒํธ๋ ์งํฉ์์ ์ ๋ ฅ๋ฐ์ ์ฐํธ๋ฒํธ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฐํธ๋ฒํธ๋ฅผ ๊ฒ์ํด๋ณธ๋ค ๊ฐ์ ํ ๋ ๊ฐ๊น์ด ์ง์ญ์ผ ์๋ก ํ์ ์๋ฆฌ ์ซ์๊น์ง ์ผ์นํ ๊ฒ์ด๋ค. 7์๋ฆฌ๊ฐ ๋ชจ๋ ์ผ์นํ๋ค๋ฉด ๊ทธ๊ฒ์ด ๋ต์ด์ง๋ง, ์ ํํ๊ธฐ ์ผ์นํ๋ ์ซ์๊ฐ ์์ ๋๋ ์ผ์ชฝ๋ถํฐ์ ์๋ฆฟ์๊ฐ ๋ง์ด ์ผ์นํ๋ ์ฐํธ๋ฒํธ๋ฅผ ๋ต์ผ๋ก ํ๋ค.
๋จผ์ ๋ค์๊ณผ ๊ฐ์ ํ ์ด๋ธ์ด ์กด์ฌํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ด ํ
์ด๋ธ์์ ๋ง์ฝ ์ฐํธ๋ฒํธ 4130033
์ ์
๋ ฅ์ ์ธ์ ํ ์ฐํธ๋ฒํธ๋ฅผ ์ถ๋ ฅํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด๋ค.
์ด ๋ฌธ์ ์ ํด๊ฒฐํ๋๋ฐ ์์ด ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค. ์ผ๋จ ์ฐํธ๋ฒํธ 4130033
์ด ํ
์ด๋ธ์ ์๋์ง๋ฅผ ์ฐพ๋๋ค ๋ง์ฝ ์๋ค๋ฉด ์ด์ด์ 413003*
(์ฌ๊ธฐ์ *
์ ์์์ ์ซ์)๊ฐ ์๋์ง๋ฅผ ์ฐพ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ค๋ฉด ์ด์ด์ 41300**
๊ฐ ์๋์ง ์ฐพ๋๋ค. ๋ง์ฝ ์ผ์นํ๋ ๊ฒฐ๊ณผ๊ฐ ์๋ค๋ฉด ์ด๊ฒ์ ์ถ๋ ฅํ๋ฉด ๋๋ค.
ํ์ง๋ง ์ด๋ฐ ๋ฐฉ๋ฒ์ ํ ์ด๋ธ์ ๋ ์ฝ๋ ์๊ฐ ๋ง์์ง์๋ก ์ฑ๋ฅ ์ธก๋ฉด์์ ์ ์ ์ ํ๋๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์จ๋ค.
์ด ๋ฌธ์ ์ ํฌ์ธํธ๋ ์์์ด๋ค. ๊ฐ์ฅ ๊ฐ๊น์ด ์ฐํธ๋ฒํธ ์์๋ฅผ 0, ๊ฐ์ฅ ๋จผ ์ฐํธ๋ฒํธ ์์๋ฅผ 6์ผ๋ก ๋ํ๋ธ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด๋ค.
์ด๋ฌํ rank_pcode
ํ๋๋ฅผ ๋ง๋๋ ค๋ฉด CASE
์์ ์ฌ์ฉํฉ๋๋ค.
SELECT pcode, district_name,
CASE WHEN pcode = '4130033' THEN 0
WHEN pcode LIKE '413003%' THEN 1
WHEN pcode LIKE '41300%' THEN 2
WHEN pcode LIKE '4130%' THEN 3
WHEN pcode LIKE '413%' THEN 4
WHEN pcode LIKE '41%' THEN 5
WHEN pcode LIKE '4%' THEN 6
ELSE NULL END AS rank_pcode
FROM PostalCode ORDER BY rank_pcode
CASE
์์ WHEN
๊ตฌ๋ ์ฐจ๋ก๋๋ก ์กฐ๊ฑด์ ๊ฒ์ฌํ๋ค๊ฐ. ์กฐ๊ฑด์ด ๋ง์ผ๋ฉด ์ดํ์ WHEN
๊ตฌ๋ฅผ ํ๊ฐํ์ง ์๋๋ค. ๋ฐ๋ผ์ ์์๋ฅผ ๊ณ์ฐํ ์ ์๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๋ฉด ์ด ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๊ฟ ์ ์์๊ฒ์ด๋ค.
์์๊ฐ ๊ฐ์ฅ ๋๋ค๋ ๊ฒ์ rank_pcode
ํ๋์ ๊ฐ์ด ๊ฐ์ฅ ์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก MIN
ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ตฌํ ์ ์๋ค.
SELECT pcode, district_name FROM PostalCode
WHERE CASE WHEN pcode = '4130044' THEN 0
WHEN pcode LIKE '413003%' THEN 1
WHEN pcode LIKE '41300%' THEN 2
WHEN pcode LIKE '4130%' THEN 3
WHEN pcode LIKE '413%' THEN 4
WHEN pcode LIKE '41%' THEN 5
WHEN pcode LIKE '4%' THEN 6
ELSE NULL END =
(SELECT MIN(CASE WHEN pcode = '4130033' THEN 0
WHEN pcode LIKE '413003%' THEN 1
WHEN pcode LIKE '41300%' THEN 2
WHEN pcode LIKE '4130%' THEN 3
WHEN pcode LIKE '413%' THEN 4
WHEN pcode LIKE '41%' THEN 5
WHEN pcode LIKE '4%' THEN 6
ELSE NULL END)
FROM PostalCode);
์ด๋ฌํ ๋ฐฉ๋ฒ์ ํฌ์ธํธ๋ 7ํ ๋ฐ๋ณต์ CASE
์์ ๋ถ๊ธฐ๋ก ๋ณํํ๋ค๋ ๊ฒ์ด๋ค. ์ค์ ์ ํ๋ฆฌ์ผ์ด์
์์๋ ์ฐํธ๋ฒํธ๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํด SQL ๊ตฌ๋ฌธ์ ๋์ ์ผ๋ก ์์ฑํ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ด ์ฟผ๋ฆฌ๋ ์ฑ๋ฅ์ ์ธ ๊ด์ ์์ ๊ฐ์ฅ ์ข์ ๋ต์ด๋ผ ํ๊ธฐ์๋ ์์ง ์ด๋ฅด๋ค. ์คํ ๊ณํ์ ์ดํด๋ณด๋ฉด ํ ์ด๋ธ์ ์ ๊ทผ์ด 2ํ ๋ฐ์ํ๋ ๊ฒ์ ์ ์ ์๋ค.
๋ง์ฝ ํ ์ด๋ธ์ ์๊ฐ ์๋ฐฑ ๋ง์์ ์์ฒ ๋ง์ผ๋ก ๋์ด๋๋ฉด ์๊ฐ์ด ๊ฝค ๊ฑธ๋ฆด๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ์ค์บ ํ์๋ฅผ ์ค์ผ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐ๊ตฌํด์ผ ํ๋ค.
๊ทธ๋ฐ๋ฐ ์ ํ ์ด๋ธ ์ค์บ์ด 2ํ ๋ฐ์ํ๋์ง ์๊ฐํด๋ด์ผ ํ๋ค. ๋ฐ๋ก ์์์ ์ต์๊ฐ์ ์๋ธ์ฟผ๋ฆฌ์์ ์ฐพ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ณ ์ ์ ์ธ ๋ฐฉ๋ฒ์ด์ง๋ง ๋ค์๊ณผ ๊ฐ์ด ์๋์ฐ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ค์บ ํ์๋ฅผ ์ค์ผ ์ ์๋ค.
SELECT pcode, district_name
FROM (SELECT pcode, district_name,
CASE WHEN pcode = '4130044' THEN 0
WHEN pcode LIKE '413003%' THEN 1
WHEN pcode LIKE '41300%' THEN 2
WHEN pcode LIKE '4130%' THEN 3
WHEN pcode LIKE '413%' THEN 4
WHEN pcode LIKE '41%' THEN 5
WHEN pcode LIKE '4%' THEN 6
ELSE NULL END AS hit_code,
MIN(CASE WHEN pcode = '4130033' THEN 0
WHEN pcode LIKE '413003%' THEN 1
WHEN pcode LIKE '41300%' THEN 2
WHEN pcode LIKE '4130%' THEN 3
WHEN pcode LIKE '413%' THEN 4
WHEN pcode LIKE '41%' THEN 5
WHEN pcode LIKE '4%' THEN 6
ELSE NULL END)
OVER(ORDER BY CASE WHEN pcode = '4130033' THEN 0
WHEN pcode LIKE '413003%' THEN 1
WHEN pcode LIKE '41300%' THEN 2
WHEN pcode LIKE '4130%' THEN 3
WHEN pcode LIKE '413%' THEN 4
WHEN pcode LIKE '41%' THEN 5
WHEN pcode LIKE '4%' THEN 6
ELSE NULL END) AS min_code
FROM PostalCode)Foo
WHERE hit_code = min_code;
์คํ๊ณํ์ ๋ณด๋ฉด ํ
์ด๋ธ ์ ๊ทผ์ด 1ํ๋ก ๊ฐ์ํ ๊ฒ์ ํ์ธ ํ ์ ์๋ค. ๊ทธ๋ฐ๋ฐ ์๋์ฐ ํจ์๋ฅผ ์ฌ์ฉํจ์ผ๋ก ์ธํด ์ ๋ ฌ (Using filesort
)๊ฐ ์ถ๊ฐ๋ก ์ฌ์ฉ๋์๋ค. ๋ฐ๋ผ์ ์ฌ๊ธฐ์ ๋น์ฉ์ด ์ถ๊ฐ๋๋๋ฐ ํ
์ด๋ธ ํฌ๊ธฐ๊ฐ ํฌ๋ค๋ฉด ํ
์ด๋ธ ํ ์ค์บ์ ์ค์ด๋ ๊ฒ์ ํจ๊ณผ๊ฐ ๋ ํฌ๋ค.
๐ก
select_type
์DERIVED
MySQL์ ์คํ๊ณํ์์
DERIVED
๋ ๋ค์๊ณผ ๊ฐ๋ค.
FROM
์ ์ ์ฌ์ฉ๋ ์๋ธ ์ฟผ๋ฆฌ๋ก ๋ถํฐ ๋ฐ์ํ ์์ํ ์ด๋ธ- ์ด ์์ํ ์ด๋ธ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ์ ๋ ์๊ณ ๋์คํฌ์ ์ ์ฅ๋ ์๋ ์๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ ๊ฒฝ์ฐ ์ฑ๋ฅ์ ํ๊ฐ ์์ง๋ง ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ์ปค์ ์์ ํ ์ด๋ธ์ ๋์คํฌ์ ์ ์ฅํ๋ฉด ์ฑ๋ฅ์ด ๋จ์ด์ง๊ฒ ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ํ์ฌ ์ฃผ์(pcode
)๋ฟ๋ง ์๋๋ผ ๊ณผ๊ฑฐ์ ์ด๋ ์ฃผ์(new_pcode
)๊น์ง ๊ด๋ฆฌํ๋ ํ
์ด๋ธ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด์
์ด ํ
์ด๋ธ์ ํ์ฌ ์ฃผ์๋ฅผ ๋ฑ๋กํ ๋๋ ๋ค์๊ณผ ๊ฐ์ด ํ์ฌ ์ฃผ์์ ์ฐํธ๋ฒํธ๋ง ๋ฑ๋กํ๊ณ โ์ด์ฌํ๋ ๊ณณ์ ์ฐํธ๋ฒํธโ๋ NULL
๋ก ํ๋ค.
('A', '4130001', NULL)
์ดํ A๊ฐ ์ด์ฌ๋ฅผ ํ๋ ์์ ์ ๋ค์๊ณผ ๊ฐ์ด โ์ด์ฌํ๋ ๊ณณ์ ์ฐํธ๋ฒํธโ๋ฅผ ๋ณ๊ฒฝ ํ๋ค.
('A', '4130001', NULL) -> ('A', '4130001', '4130002')
์ด๋ฒ์๋ ๋ค์, ์ด์ฌํ ๊ณณ์ ์ฃผ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์๋ก์ด ๋ ์ฝ๋๋ก ๋ฑ๋กํ๋ค.
('A', '4130002', NULL)
์ดํ A๊ฐ ์ด์ฌ๋ฅผ ๋ฐ๋ณตํ ๋๋ง๋ค ์ด๋ฌํ ์ฒ๋ฆฌ๋ฅผ ๋ฐ๋ณตํ๋ค. ์ด๋ ๊ฒ ์ด๋ ฅ์ ์ ์ฅํ๋ฉด A๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์ด์ฌ๋ฅผ ๋๋ฒ ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
4130001 -> 4130002 -> 4130103(ํ์ฌ ์ฃผ์)
์ค์ ์ฐ์ฒด๊ตญ์์๋ ์ค๋๋ ์ฃผ์๋ก ๋ณด๋ด์ง ์ฐํธ๋ฌผ์ ์๋ก์ด ์ฃผ์๋ก ์ ๋ฌํ๊ธฐ ์ํด ์ด๋ฐ ๋ฐฉ์์ผ๋ก ์ด๋ ฅ์ ๊ด๋ฆฌํ๋ค. ์ด์ฒ๋ผ ์ฐํธ๋ฒํธ๋ฅผ ํค๋ก ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ค์ค์ด ์ฐ๊ฒฐํ๋ ๊ฒ์ ํฌ์ธํฐ ์ฒด์ธ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ํํํ๋ ๊ณ ์ ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค. ํฌ์ธํฐ ์ฒด์ธ์ ์ฌ์ฉํ๋ PostalHistory ๊ฐ์ ํ ์ด๋ธ ํ์์ ์ธ์ ๋ฆฌ์คํธ ๋ชจ๋ธ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ง์ฝ A๊ฐ ๊ฐ์ฅ ์ค๋์ ์ ์ด์๋ ์ฃผ์๋ฅผ ๊ฒ์ํ๋ค๋ฉด ๋ต์ 4130001
์ผ๊ฒ์ด๋ค. ์ด๊ฒ์ ์ฐพ์ผ๋ ค๋ฉด ํ์ฌ ์ฃผ์์์ ์ถ๋ฐํด์ ์ฐจ๊ทผ์ฐจ๊ทผ ์ด์ ์ฃผ์๋ฅผ ์ฐพ์์ผ ํ ๊ฒ์ด๋ค. ๋ฌธ์ ๋ ๋ช ๋ฒ์ ๋ฐ๋ผ ์ฌ๋ผ๊ฐ์ผ๋ง ๊ฐ์ฅ ์ค๋๋๋ ์ฃผ์๋ฅผ ์ฐพ์ ์ ์์ ๊ฒ์ธ์ง ์ฌ์ ์๋ ์ ์ ์๋ค๋ ์ ์ด๋ค.
์ด์ฌ๋ฅผ ํ ๋ฒ ์ ๋๋ฐ์ ํ์ง ์์ ์ฌ๋๋ ์๊ฒ ์ง๋ง, ์ด์ฌ๋ฅผ 100๋ฒ ๋๊ฒ ํ๋ ์ด์ฌ ๋งค๋์๊ฐ ์์ ์๋ ์๋ค. ์ด์ฌ ํ์์ ์ํ์ด ์ ํด์ ธ ์๋ค๋ฉด ๊ทธ๋งํผ ์๊ธฐ ๊ฒฐํฉ์ ๋ฐ๋ณตํ ์ ์๊ฒ ์ง๋ง, ์ํ์ด ์ ํด์ง์ง ์์๋ค๋ฉด ๊ทธ๋ฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค.
์ด๋ ์ ์ฐจ ์งํฅํ ์ธ์ด์์ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ค๋ฉด ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ํ ์ ์๋ค. ํ์ผ์ name์ผ๋ก ์ ๋ ฌํ๊ณ , ํ์ฌ ์ฃผ์์ ๋ ์ฝ๋๋ถํฐ ์ถ๋ฐํด์ ์ด์ ์ฃผ์๊ฐ ์์ ๋ ๊น์ง ์ฒ๋ฆฌ๋ฅผ ๋ฐ๋ณตํ๋ฉด ๊ฐ์ฅ ์ค๋๋ ์ฃผ์๋ฅผ ์ฐพ์ ์ ์๋ค.
๋ค์์ SQL์์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ ์ฌ๊ท ๊ณตํต ํ ์ด๋ธ ์(recursion common table expression)์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
WITH RECURSIVE Explosion (name, pcode, new_pcode, depth)
AS
(SELECT name, pcode, new_pcode, 1 FROM PostalHistory
WHERE name = 'A' AND new_pcode IS NULL /* ๊ฒ์ ์์ */
UNION
SELECT Child.name, Child.pcode, Child.new_pcode, depth + 1
FROM Explosion AS Parent, PostalHistory AS Child
WHERE Parent.pcode = Child.new_pcode AND Parent.name = Child.name)
/* ๋ฉ์ธ SELECT ๊ตฌ๋ฌธ */
SELECT name, pcode, new_pcode FROM Explosion
WHERE depth = (SELECT MAX(depth) FROM Explosion);
์ฌ๊ท ๊ณตํต ํ
์ด๋ธ ์ Explosion
์, A์ ๋ํ ํ์ฌ ์ฃผ์(new_pcode
ํ๋๊ฐ NULL
)๋ถํฐ ์ถ๋ฐํด์ ํฌ์ธํฐ ์ฒด์ธ์ ํ๊ณ ์ฌ๋ผ๊ฐ ๊ณผ๊ฑฐ์ ์ฃผ์๋ฅผ ๋ชจ๋ ์ฐพ๋๋ค. ์ด๋ ๊ฐ์ฅ ์ค๋๋ ์ฃผ์๋ ์ฌ๊ท ์์ค์ด ๊ฐ์ฅ ๊น์ ๋ ์ฝ๋์ด๋ฏ๋ก, ์ด๋ฅผ depth
ํ๋๋ก ์ฐพ๋๋ค. depth
ํ๋๋ ํ ๋ฒ ๋ฐ๋ณตํ ๋๋ง๋ค 1์ฉ ์ฆ๊ฐํ๋ฏ๋ก, depth
ํ๋๊ฐ ๊ฐ์ฅ ํฐ ๊ฒ์ด ๊ฐ์ฅ ์ฌ๊ท ์์ค์ด ๊น๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
๊ทธ๋ผ ์คํ ๊ณํ์ ์ด๋ป๊ฒ ๋ ๊น?
id
3์ Parent
ํ
์ด๋ธ ์์ญ์ Extra
๋ฅผ ๋ณด๋ฉด Recorsive; Using where
์ด๋ผ๊ณ ๋์์๋๋ฐ ์ด๊ฒ์ด ์ฌ๊ท ์ฐ์ฐ์ ์๋ฏธํ๋ค. ์ด ์ฟผ๋ฆฌ๋ ๋ช ๋ฒ์ ์ด์ฌํด๋ ๋์ํ ์ ์๋ค๋ ์ ์์ ๊ต์ฅํ ์ ์ฐํ๋ค. ๋ํ ๋ง์ง๋ง ์คํ ๊ณํ์ ๋ณด๋ฉด Using temporary
์ด๋ผ๋ ์ค๋ช
์ด ๋ณด์ด๋๋ฐ ์ดํ Explosion
๋ทฐ์ ์ฌ๋ฌ ๋ฒ ์ ๊ทผํ๋ฏ๋ก ์์ ํ
์ด๋ธ๋ก ๋ง๋ค์๋ค๋ ๊ฒ์ ๋ํ๋ธ๋ค. ์ด๋ ๊ฒ ๋ง๋ค์ด์ง ์์ ํ
์ด๋ธ๊ณผ ์๋ PostalHistory
ํ
์ด๋ธ์, ์ธ๋ฑ์ค idx_new_pcode
๋ฅผ ์ฌ์ฉํด Nested Loops
๋ฅผ ์ํํ๋ฏ๋ก ๊ฝค ํจ์จ์ ์ธ ๊ณํ์ธ๋ค.
๋ค๋ง, ์ฌ๊ท ๊ณตํต ํ ์ด๋ธ์ ๋น๊ต์ ์ต๊ทผ์ ๋ง๋ค์ด์ง ๊ธฐ๋ฅ์ด๋ฏ๋ก ์์ง ๊ตฌํ๋์ง ์์๊ฑฐ๋, ์คํ ๊ณํ์ด ์ต์ ํ๋์ง ์์ DBMS๊ฐ ์๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ์ฌ์ฉํ ์ ์๋ ๋์ฒด ์๋จ์ ์ดํด๋ณด์
SQL์์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ 3๊ฐ์ง๊ฐ ์๋ค.
1๏ธโฃ ์ ์์์ ์ดํด๋ณธ ๋ฐฉ๋ฒ์ผ๋ก, RDB๊ฐ ํ์ํ๊ธฐ ์ด์ ๋ถํฐ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ํํํ๋ ์ ํต์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉ๋์๋ค. 3๏ธโฃ ์ ๊ฐฑ์ ์ด ๊ฑฐ์ ๋ฐ์ํ์ง ์์ ๊ฒฝ์ฐ์ ํ์ ๋ฐํํ๋ค. ์ค์ํ ๊ฒ์ 2๏ธโฃ ์ ์ค์ฒฉ ์งํฉ ๋ชจ๋ธ์ด๋ค. ์ด ๋ฐฉ๋ฒ์ ํฌ์ธํธ๋ ๊ฐ ๋ ์ฝ๋์ ๋ฐ์ดํฐ๋ฅผ ์งํฉ(์)์ผ๋ก ๋ณด๊ณ , ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์งํฉ์ ์ค์ฒฉ ๊ด๊ณ๋ก ๋ํ๋ธ๋ค๋ ๊ฒ์ด๋ค.
๋จผ์ ์์ ๊ฐ์ ํ
์ด๋ธ์ ๋ง๋ค์ด ์ค๋ค. ์ด ํ
์ด๋ธ์ ์ฐํธ ๋ฒํธ์ ๋ฐ์ดํฐ๋ฅผ ์์น์ ์์ ์กด์ฌํ๋ ์์ผ๋ก ์๊ฐํ๋ค. lft
์ rgt
๋ ์์ ์ผ์ชฝ ๋๊ณผ ์ค๋ฅธ์ชฝ ๋์ ์์นํ๋ ์ขํ๋ฅผ ๋ํ๋ธ๋ค. ์ขํ๊ฐ์ ๋์ ๊ด๊ณ๋ง ์ ์ ํ๋ค๋ฉด ์์์ ๊ฐ์ ์ฌ์ฉํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ฌ ํ ๋๋ง๋ค ์๋ก์ด ์ฐํธ๋ฒํธ๊ฐ ์ด์ ์ ์ฐํธ๋ฒํธ โ์์โ ํฌํจ๋๋ ํํ๋ก ์ถ๊ฐ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด A์ ์ฐํธ๋ฒํธ 3๊ฐ์ ํฌํจ ๊ด๊ณ๊ฐ ๋ค์๊ณผ ๊ฐ์ด ๋ํ๋ ๊ฒ์ด๋ค.
์ด๋ ์๋ก ์ฝ์
ํ๋ ์ฐํธ๋ฒํธ์ ์ขํ๋ ์ธ์ธก ์์ ์ผ์ชฝ ๋๊ณผ ์ค๋ฅธ์ชฝ ๋์ ์ขํ๋ฅผ ์ฌ์ฉํด ๊ฒฐ์ ๋๋ค. ์๋ฅผ ๋ค์ด ์ธ์ธก์ ์ฐํธ๋ฒํธ์ ์ผ์ชฝ ๋ ์ขํ๋ฅผ plft
, ์ค๋ฅธ์ชฝ ๋ ์ขํ๋ฅผ prgt
๋ผ๊ณ ํ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ ์์์ ๋ฐ๋ผ ์๋์ ์ผ๋ก ๋
ธ๋์ ์ขํ๋ฅผ ์ฐ์ฐํ๋ค.
๋ฐ๋ผ์ plft
์ prgt
๋ก 3๊ฐ์ ๊ตฌ๊ฐ์ ๋ถํ ํ ์ ์๋ 2๊ฐ์ ์ขํ๋ฅผ ์ฐพ๋ ๊ฒ์ด๋ค. lft
์ rgt
์ ์๋ฃํ์ ์ค์ํ(REAL
)์ธ๋ฐ DBMS์ ์ ๋ฐ ๋ฒ์ ๋ด์์๋ ๋ฎ์ ๋น์ฉ์ผ๋ก๋ ์ค์ฒฉ์ ์ผ๋ง๋ ์ง ํ ์ ์๋ค.
์ด๋ฌํ ์ค์ฒฉ ๋ชจ๋ธ์ ํ
์ด๋ธ์์๋ A์ ๊ฐ์ฅ ์ค๋๋ ์ฃผ์๋ฅผ ๊ต์ฅํ ๊ฐ๋จํ SQL ๊ตฌ๋ฌธ์ผ๋ก ์ฐพ์ ์ ์๋ค. ๊ฐ์ฅ ๋ฐ๊นฅ ์ชฝ์ ์๋ ์์ ์ฐพ๊ธฐ๋ง ํ๋ฉด ๋๋ค. ๋ฐ๋ผ์ NOT EXISTS
๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๊ฒ ๊ตฌํ ์ ์๋ค. โ์ผ์ชฝ ๋์ ์ขํ๊ฐ ๋ค๋ฅธ ๋ชจ๋ ์์ ์ผ์ชฝ ๋ ์์น๋ณด๋ค ์์โ์ด๋ผ๋ ์กฐ๊ฑด์ ์ฌ์ฉํ๋ค.
SELECT name, pcode FROM PostalHistory2 PH1
WHERE name = 'A'
AND NOT EXISTS (
SELECT * FROM PostalHistory2 PH2
WHERE PH2.name = 'A' AND PH1.lft > PH2.lft);
์ด์ ์คํ ๊ณํ์ ์ดํด๋ณด์.
์ธ์ธก ํ
์ด๋ธ (PH1
)๊ณผ ๋ด์ธก ํ
์ด๋ธ(PH2
)์ ํ ๋ฒ๋ง Nested Loops
๋ก ๊ฒฐํฉํ๋ ์คํ ๊ณํ์ด๋ค. ์ฌ๊ธฐ์ ์ฌ๊ท ์ฐ์ฐ์ ์ฌ์ฉํ์ง ์์๋ค๋ ๊ฒ์ ์ฃผ๋ชฉํด์ผ ํ๋ค. PostgreSQL์์๋ ํ
์ด๋ธ์ ํ ์ค์บ์ด ์ํ ๋๋๋ฐ ์ด๋ ํ
์ด๋ธ์ ๋ ์ฝ๋ ์๊ฐ ์ ๊ธฐ ๋๋ฌธ์ด๋ค ๋ฐ๋ฉด MySQL์์๋ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ๋ ๊ณํ์ ์ธ์ฐ๋ ๊ฒ์ ์ ์ ์๋ค. ์ด๋ฌํ ์ค์ฒฉ ์งํฉ์ ์ฝ๋๊ฐ ์ฌ๊ท๋ณด๋ค ๋น ๋ฅผ์ง ๋จ์ํ๊ฒ ํ๋จํ ์๋ ์์ง๋ง, ์ผ๋ฐ์ ์ธ ์ฝ๋ฉ์์๋ ์๋ ๋ชจ๋ธ(์ํฐํฐ ๊ตฌ์กฐ)์ ๊ด์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์๋ ์๋ค๋ ๊ฒ์ ์ผ๋จ ์๊ณ ์์ผ๋ฉด ๋๋ค.