SQLD QnA - ynjch97/YNJCH_WIKI GitHub Wiki
1. ORACLE JOIN
1-1. JOIN์ ๋ฐฉ์
- ์กฐ์ธ์ฐ์ฐ(JOIN OPERATION)
- ์ฌ๋ฌ ํ ์ด๋ธ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ์กฐํํ ์ ์๊ฒ ํ๋ DBMS์ ๊ธฐ๋ฅ
- ๋ ์งํฉ(ํ ์ด๋ธ) ๊ฐ์ ๊ณฑ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฐ์ฅ ๋ํ์ ์ธ ๋ฐ์ดํฐ ์ฐ๊ฒฐ ๋ฐฉ๋ฒ
- ๋ฌผ๋ฆฌ์ ์กฐ์ธ : ์ตํฐ๋ง์ด์ ์ ์ํด ๋ฐ์ํ๋ ์กฐ์ธ
- ๋ ผ๋ฆฌ์ ์ธ ์กฐ์ธ์ ์ตํฐ๋ง์ด์ ๊ฐ DBMS ๋ด๋ถ์์ ๋ฌผ๋ฆฌ์ ์ธ ์กฐ์ธ์ผ๋ก ํํ
- Join ์์ ์ ํ ๋ ์ตํฐ๋ง์ด์ ๋ ์ด๋ค ๋ฐฉ์์ผ๋ก ์กฐ์ธ์ ํ ์ง ์คํ๊ณํ์ ์ธ์ฐ๊ฒ ๋จ
1-1-1. Nested-Loop Join
- ๋๊ฐ์ ํ ์ด๋ธ์ ํ์ ๊ฐ๊ฐ ๋ชจ๋ ํ์ธํ์ฌ ์กฐ์ธํ๋ ๋ฐฉ๋ฒ
- 2๊ฐ ์ด์์ ํ ์ด๋ธ์์ ํ๋์ ์งํฉ์ ๊ธฐ์ค์ผ๋ก ์์ฐจ์ ์ผ๋ก ์๋๋ฐฉ Row๋ฅผ ๊ฒฐํฉํ์ฌ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์กฐํฉํ๋ ๋ฐฉ์
- ์ ํ ํ ์ด๋ธ์ ์ฒ๋ฆฌ ๋ฒ์๋ฅผ ํ๋์ฉ ์ก์ธ์คํ๋ฉด์ ์ถ์ถ๋ ๊ฐ์ผ๋ก ์ฐ๊ฒฐํ ํ ์ด๋ธ์ ์กฐ์ธ
- ์คํ๊ณํ์์ ๋จผ์ ์คํ๋๋ ํ ์ด๋ธ์ด Driving ํ ์ด๋ธ, ๋์ค์ ์คํ๋๋ ๊ฒ์ด Driven ํ ์ด๋ธ
// ์ค์ฒฉ๋ for๋ฌธ์ ์๋ฆฌ์ ๋์ผํจ
for (i=0; i<100; i++) {
for (j=0; j<100; j++) {
(์๋ต)
}
}
Nested-Loop Join ํน์ง
- ์ข์ ๋ฒ์์ ์ฒ๋ฆฌ์ ์ต์ ํ / ์๋ ๋ฐ์ดํฐ ์กฐ์ธ ์ ์ฌ์ฉ
- ํ ๋ ์ฝ๋์ฉ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌ
- Random Access ์์ฃผ์ ์กฐ์ธ ๋ฐฉ์ > ๋ง์ ์์ ๋ฐ์ดํฐ ์กฐ์ธ ์ Random Access ์ฆ๊ฐ
- ํํ ํ ์ด๋ธ(Driven)์๋ ์กฐ์ธ์ ์ํ ์ธ๋ฑ์ค ์์ฑ ํ์
- ์คํ์๋ = ์ ํ ํ ์ด๋ธ ์ฌ์ด์ฆ * ํํ ํ ์ด๋ธ ์ ๊ทผํ์
Nested-Loop Join ์ฃผ์์ฌํญ
- ๋ฐ์ดํฐ๋ฅผ Random Access > ๊ฒฐ๊ณผ ์งํฉ์ด ๋ง์ผ๋ฉด ๋๋ ค์ง
- ์กฐ์ธ ์ปฌ๋ผ์ Index๊ฐ ์์ด์ผ ํ ์ด๋ธ ์ ์ฒด๋ฅผ ํ์ํ์ง ์๊ณ ํ์ํ ํ์ ๋ํด์๋ง ํ์ํ์ฌ ํจ์จ์
- Row ์๊ฐ ์ ์ ํ ์ด๋ธ์ Driving ํ ์ด๋ธ๋ก ์ ์ ํด์ผ ์ฒ๋ฆฌ ์๋ ํฅ์
- ํ ์ด๋ธ ์ค ์ ์ ์ชฝ์ Driven ํ ์ด๋ธ๋ก ์ค์
1-1-2. Sort Merge Join
- ์กฐ์ธ์ ๋์๋ฒ์๊ฐ ๋์ ๊ฒฝ์ฐ ๋ฐ์ํ๋ Random Access๋ฅผ ์ค์ด๊ธฐ ์ํ ๊ฒฝ์ฐ๋ ์ฐ๊ฒฐ๊ณ ๋ฆฌ์ ๋ง๋ ํ Index๊ฐ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ํด๊ฒฐํ๊ธฐ ์ํ ์กฐ์ธ ๋ฐฉ์
- ์์ชฝ ํ ์ด๋ธ์ ์ฒ๋ฆฌ๋ฒ์๋ฅผ ๊ฐ์ Accessํ์ฌ ์ ๋ ฌํ ๊ฒฐ๊ณผ๋ฅผ ์ฐจ๋ก๋ก Scanํ๋ฉด์ ์ฐ๊ฒฐ๊ณ ๋ฆฌ์ ์กฐ๊ฑด์ผ๋ก Mergeํ๋ ๋ฐฉ์
- ๋ ๊ฐ์ ํ ์ด๋ธ์ ์กฐ์ธ ์นผ๋ผ์ผ๋ก ์ ๋ ฌํ์ฌ ์กฐ์ธ
Sort Merge Join ํน์ง
- ์ฐ๊ฒฐ์ ์ํด Random Access๋ฅผ ํ์ง ์๊ณ ์ค์บ์ ํ๋ฉด์ ์ํ
- Nested Loop Join์ฒ๋ผ ์ ํ์งํฉ ๊ฐ๋ ์ด ์์
- ์ ๋ ฌ์ ์ํ ์์ญ(Sort Area Size)์ ๋ฐ๋ผ ํจ์จ์ ํฐ ์ฐจ์ด ๋ฐ์
- ์กฐ์ธ ์ฐ์ฐ์๊ฐ '='์ด ์๋ ๊ฒฝ์ฐ Nested Loop Join ๋ณด๋ค ์ ๋ฆฌ
- Outer ์งํฉ์ด ์ ๋ ฌ๋์ด ์๋ ๊ฒฝ์ฐ, Non equi join์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ ๋ฆฌ
- ์กฐ์ธ๋๋ ์ปฌ๋ผ์ Index๊ฐ ์๋ ๊ฒฝ์ฐ ์ ๋ฆฌ
Sort Merge Join ์ฃผ์์ฌํญ
- ๋ ๊ฒฐ๊ณผ ์งํฉ์ ํฌ๊ธฐ๊ฐ ์ฐจ์ด๊ฐ ๋ง์ด ๋๋ ๊ฒฝ์ฐ์๋ ๋นํจ์จ์
- ์ ๋ ฌํ ๋ฐ์ดํฐ๊ฐ ๋ง์ ๊ฒฝ์ฐ ๋ถ๋ด์ด ๊ฐ์ฅ ํฐ ๋ฐฉ๋ฒ
- Sorting ๋ฉ๋ชจ๋ฆฌ์ ์์นํ๋ ๋์์ join key๋ฟ๋ง ์๋๋ผ Select list๋ ํฌํจ๋๋ฏ๋ก ๋ถํ์ํ Select ํญ๋ชฉ ์ ๊ฑฐ
1-1-3. Hash Join
- ํด์ฑ ํจ์(Hashing Function) ์ ์ํ ํ์์ ํ์ฌ ์กฐ์ธ์ ์ํํ๋ ๋ฐฉ์
- ํด์ฑ ํจ์๋ ์ง์ ์ ์ธ ์ฐ๊ฒฐ์ ๋ด๋นํ๋ ๊ฒ์ด ์๋๋ผ ์ฐ๊ฒฐ๋ ๋์์ ํน์ ์ง์ญ(partition)์ ๋ชจ์๋๋ ์ญํ ๋ง์ ๋ด๋น
- ํด์๊ฐ์ ์ด์ฉํ์ฌ ํ ์ด๋ธ์ ์กฐ์ธํ๋ ๋ฐฉ์ - Sort-Merge ์กฐ์ธ์ ์ ๋ ฌ์ ๋ถํ๊ฐ ๋ง์ด ๋ฐ์ํ์ฌ, ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก Sort ๋์ ํด์ฌ๊ฐ์ ์ด์ฉํ๋ ์กฐ์ธ
Hash Join ํน์ง
- Random Access์ ์ ๋ ฌ์ ๋ํ ๋ถ๋ด์ ํด์ > ๋์ฉ๋์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ ์ฌ์ฉ๋จ
- parallel processing์ ์ด์ฉํ Hash Join์ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ต์ ์ ์๋ฃจ์
- 2๊ฐ์ ์กฐ์ธ ํ ์ด๋ธ ์ค small rowset์ ๊ฐ์ง๊ณ hash_area_size์ ์ง์ ๋ ๋ฉ๋ชจ๋ฆฌ ๋ด์์ hash table ์์ฑ
- CBO์์๋ง ๊ฐ๋ฅํ๋ฉฐ, CPU ์ฑ๋ฅ์ ์์กด์ (CPU ์์ ๋ง์ด ์๋น)
- Hash table ์์ฑ ํ Nested Loop์ฒ๋ผ ์์ฐจ์ ์ธ ์ฒ๋ฆฌ ํํ๋ก ์ํ
- ๋ฐฐ์น ์์ ์ ์ ๋ฆฌ
Hash Join ์ฃผ์์ฌํญ
- ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์์๋ ์๋นํ ํฐ hash area๋ฅผ ํ์๋ก ํจ์ผ๋ก, ๋ฉ๋ชจ๋ฆฌ์ ์ง๋์น ์ฌ์ฉ์ผ๋ก ์ค๋ฒํค๋ ๋ฐ์ ๊ฐ๋ฅ์ฑ
- ์๋์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ธํ ๋ ์คํ๋ ค ๋ถํ์ํ I/O๊ฐ ์ฆ๊ฐํ ์ ์์
- ์ฐ๊ฒฐ์กฐ๊ฑด ์ฐ์ฐ์๊ฐ โ=โ์ธ ๋์น์กฐ์ธ์ธ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅ
- Equi Join์์๋ง ๊ฐ๋ฅ > Non-Equal ์กฐ์ธ ์กฐ๊ฑด์ธ ๊ฒฝ์ฐ Hash Join์ผ๋ก ์ํ๋์ง ๋ชปํ๊ณ Merge Join์ผ๋ก ์ํ๋จ
- Outer Table์ ํด์ ํค ์นผ๋ผ์ ์ค๋ณต๊ฐ์ด ์ ์ ๊ฒฝ์ฐ์ ์ฌ์ฉ
- ๋ ์งํฉ ์ค ํฌ๊ธฐ๊ฐ ์์ ์งํฉ์ Outer Table๋ก ๊ฒฐ์
- ์กฐ์ธ ์นผ๋ผ์ ์ ๋นํ Index๊ฐ ์๋๋ฐ Nested Loop Join์ด ๋นํจ์จ ์ ์ผ ๋ ์ฌ์ฉ
- Nested Loop Join์์ ์กฐ์ธ ์นผ๋ผ Index๊ฐ ์๋๋ผ๋ Random Access ๋ถํ๊ฐ ์ฌํ ๋ ์ฌ์ฉ
1-2. JOIN์ ์ข ๋ฅ
1-4-1. CROSS JOIN
- ๋ ๊ฐ์ ํ ์ด๋ธ์ ๋ ์ฝ๋ ์๋ฅผ ๊ณฑํ ์ = ์ ์ฒด row
- ์๋ ๋ ์ฟผ๋ฆฌ๊ฐ ๊ฐ์ ๊ธฐ๋ฅ์ ํจ
SELECT * FROM A, B;
SELECT * FROM A CROSS JOIN B;
1-4-2. FULL OUTER JOIN
- ๋ ํ ์ด๋ธ ๊ฐ์ ํฉ์งํฉ์ ๋ํ๋
- ์๋ก์ ํ ์ด๋ธ์ ์กด์ฌํ์ง ์๋ ๊ฐ์ ๋ํด NULL ํ๊ธฐ
SELECT * FROM A FULL OUTER JOIN B ON A.C1 = B.C1;
1-4-3. LEFT OUTER JOIN
- ์ผ์ชฝ ํ ์ด๋ธ ๊ธฐ์ค์ผ๋ก JOIN ํ๋ฉฐ, RIGHT OUTER JOIN์ ๋ฐ๋๋๋ ๊ฐ๋
-
- ๊ธฐํธ๊ฐ ๋ถ์ง ์์ ํ ์ด๋ธ์ด ๊ธฐ์ค ํ ์ด๋ธ์ด ๋จ
- ์๋ ๋ ์ฟผ๋ฆฌ๊ฐ ๊ฐ์ ๊ธฐ๋ฅ์ ํจ
SELECT * FROM A LEFT OUTER JOIN B ON A.C1 = B.C1;
SELECT * FROM A, B WHERE A.C1 = B.C1(+);
1-4-4. JOIN
- ์๋ ๋ ์ฟผ๋ฆฌ๊ฐ ๊ฐ์ ๊ธฐ๋ฅ์ ํจ
SELECT * FROM A JOIN B ON A.C1 = B.C1;
SELECT * FROM A, B WHERE A.C1 = B.C1;
1-4-5. NATURAL JOIN
- ๋์ผํ ํ์ ๊ณผ ์ด๋ฆ์ ๊ฐ์ง ์ปฌ๋ผ์ ์กฐ์ธ ์กฐ๊ฑด์ผ๋ก ์ด์ฉ
2. ์คํ ๊ณํ
- ์คํ๊ณํ์ด๋ ์ฌ์ฉ์๊ฐ SQL์ ์คํํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ ค๊ณ ํ ๋ ์ตํฐ๋ง์ด์ ๊ฐ ์๋ฆฝํ๋ ์์ ์ ์ฐจ
- ์ฟผ๋ฆฌ๋ฌธ์ ์คํ ๊ณํ์ ํ์ธํ๋ ๋ฐฉ๋ฒ :
EXPLAIN PLAN
,AUTOTRACE
,SQL TRACE
AutoTrace
- AutoTrace ๊ฒฐ๊ณผ์๋ SQL์ ํ๋ํ๋๋ฐ ์ ์ฉํ ์ ๋ณด๋ค์ด ๋ง์ด ํฌํจ๋์ด ์์ด ๊ฐ์ฅ ์ฆ๊ฒจ ์ฌ์ฉ๋๋ ๋๊ตฌ ์ค ํ๋์
- SQL Plus์์ ์คํ๊ณํ์ ๊ฐ์ฅ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ํ์ธํด ๋ณผ ์ ์๋ ๋ฐฉ๋ฒ
- Operation : ๊ฐ ๋จ๊ณ์์์ ์ด๋ค ์์ ์ด ์ผ์ด๋ฌ๋์ง ํ์
- Name : ํ ์ด๋ธ๋ช ์ด๋ Index ๋ช ์ ํ์ํจ
- Rows : ํด๋น ์ฟผ๋ฆฌ ๊ณํ ๋จ๊ณ์์ ๋์ฌ ๊ฒ์ผ๋ก ์์๋๋ ํ์ ์
- Byte : ์คํ ๊ณํ์ ๊ฐ ๋จ๊ณ๊ฐ ๋ฐํํ ๊ฒ์ผ๋ก ์์ ๋๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ฅผ ๋ฐ์ดํธ๋ก ๋ํ๋ธ ์
- Cost : CBO๊ฐ ์ฟผ๋ฆฌ ๊ณํ์ ๊ฐ ๋จ๊ณ์ ํ ๋นํ ๋น์ฉ
- Time : ๊ฐ ๋จ๊ณ๋ณ ์ํ ์๊ฐ
2-1. ์คํ ๊ณํ ํด์
- ์คํ ๊ณํ์ ์ฌ๋ฌ ๊ฐ์ง ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ ธ ์๋๋ฐ ์ด๊ฒ์ ์คํ ์ด๋ผ๊ณ ํจ
- ๊ฐ๊ฐ์ ์คํ ์๋ ๊ทธ ๋จ๊ณ์์ ์ํ๋ ๋ช ๋ น, ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ ๊ฑด์, ์์๋ ๋น์ฉ๊ณผ ์๊ฐ์ ํ์
์คํ ๊ณํ ์์ ์ฝ๊ธฐ
- ์์์ ์๋๋ก ์ฝ์ด ๋ด๋ ค๊ฐ๋ฉฐ ์ ์ผ ๋จผ์ ์ฝ์ ์คํ ํ์
- ๊ฐ์ ๋ ๋ฒจ์ ๋ค์ฌ์ฐ๊ธฐ ์กด์ฌ ์ ์ -> ์๋ ์์๋ก ์ฝ๊ธฐ
- ํ์ ์คํ
์ด ์กด์ ํ๋ฉด ์ตํ์ ์คํ
๋ถํฐ ์์ํ์ฌ ์์ ์คํ
์ผ๋ก ์ฝ์ด๋์ด
- 5 > 4 > 6 > 3 > 7 > 2 > 8 > 1 > 0 ์์ผ๋ก ์ฝ์
2-2. SCAN์ ์ข ๋ฅ
- SCAN : ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ์์
- SCAN์ ์ํํ๋ ๋ฐฉ์์ ์ ๊ทผ ๊ฒฝ๋ก๋ผ๊ณ ํจ
- ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ๋ง์ง ์์ INDEX๋ฅผ ํ๋ ์๊ฐ์ด ๋ถํ์ํ๊ฑฐ๋, ๋ฐ์ดํฐ๊ฐ ์์ฃผ ๋ง์ ๊ฒฝ์ฐ FULL TABLE SCAN์ด ์ ๋ฆฌ
- ๋ง์ ๋ฐ์ดํฐ๊ฐ ์๋ ํ ์ด๋ธ์์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํด์ผ ํ๋ ์ํฉ์ด๋ผ๋ฉด INDEX SCAN์ด ์ ๋ฆฌ
2-2-1. FULL TABLE SCAN
- ํ ์ด๋ธ์ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ ๋ฐฉ์
FULL TABLE SCAN ์ฌ์ฉ
- ์กฐ๊ฑด์ ์์ ๋น๊ตํ ์นผ๋ผ์ INDEX๊ฐ ์๋ ๊ฒฝ์ฐ
- INDEX๊ฐ ์์ง๋ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฐ์ดํฐ๊ฐ ํ ์ด๋ธ์ ๋ง์ ์์ ์ฐจ์งํ์ฌ FULL TABLE SCAN์ด ๋ซ๋ค๊ณ ์ตํฐ๋ง์ด์ ๊ฐ ํ๋จ
- INDEX๊ฐ ์์ง๋ง ํ ์ด๋ธ์ ๋ฐ์ดํฐ ์์ฒด๊ฐ ์ ์ด FULL TABLE SCAN์ด ๋ซ๋ค๊ณ ์ตํฐ๋ง์ด์ ๊ฐ ํ๋จ
2-2-2. ROWID SCAN
- ROWID๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ฉฐ ๋จ์ผ ํ์ ์ ๊ทผํ๋ ๋ฐฉ์ ์ค์์ ๊ฐ์ฅ ๋น ๋ฆ
ROWID SCAN ์ฌ์ฉ
- ์กฐ๊ฑด์ ์ ROWID๋ฅผ ์ง์ ๋ช ์ํ ๊ฒฝ์ฐ
- INDEX SCAN์ ํตํด ROWID๋ฅผ ์ถ์ถํ ํ ํ ์ด๋ธ์ ์ ๊ทผํ ๊ฒฝ์ฐ
2-2-3. INDEX SCAN
- ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ์ฌ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ ๋ฐฉ์
INDEX SCAN ์ฌ์ฉ
- INDEX UNIQUE SCAN
- UNIQUE INDEX๋ฅผ ๊ตฌ์ฑํ๋ ๋ชจ๋ ์ปฌ๋ผ์ด ์กฐ๊ฑด์ "="๋ก ๋ช ์๋ ๊ฒฝ์ฐ
- INDEX RANGE SCAN
- UNIQUE ์ฑ๊ฒฉ์ ๊ฒฐํฉ ์ธ๋ฑ์ค์ ์ ๋ ์ปฌ๋ผ์ด WHERE์ ์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ / ์ผ๋ฐ ์ธ๋ฑ์ค์ ์ปฌ๋ผ์ด WHERE์ ์ ์กด์ฌํ๋ ๊ฒฝ์ฐ
- INDEX RANGE SCAN DESCENDING
- INDEX RANGE SCAN์ ์ํํจ๊ณผ ๋์์ ORDER BY DESC์ ์ ๋ง์กฑํ๋ ๊ฒฝ์ฐ
- INDEX SKIP SCAN
- ๊ฒฐํฉ ์ธ๋ฑ์ค์ ์ ํ ์ปฌ๋ผ์ด WHERE์ ์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ / ์ตํฐ๋ง์ด์ ๊ฐ INDEX SKIP SCAN์ด FULL TABLE SCAN๋ณด๋ค ๋ซ๋ค๊ณ ํ๋จํ๋ ๊ฒฝ์ฐ
- INDEX FULL SCAN
- ORDER BY / GROUP BY์ ๋ชจ๋ ์ปฌ๋ผ์ด ์ธ๋ฑ์ค์ ์ ์ฒด ๋๋ ์ผ๋ถ๋ก ์ ์๋ ๊ฒฝ์ฐ / ์ ๋ ฌ์ด ํ์ํ ๋ช ๋ น์์ INDEX ENTRY๋ฅผ ์์ฐจ์ ์ผ๋ก ์ฝ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๋ ๊ฒฝ์ฐ
- INDEX FULL SCAN DESCENDING
- INDEX FULL SCAN์ ์ํํจ๊ณผ ๋์์ ORDER BY DESC์ ์ ๋ง์กฑํ๋ ๊ฒฝ์ฐ
- INDEX FAST FULL SCAN
- FULL TABLE SCAN์ ํ์ง ์๊ณ ๋ INDEX FAST FULL SCAN์ผ๋ก ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ ์ ์๊ณ ์ถ์ถ๋ ๋ฐ์ดํฐ์ ์ ๋ ฌ์ด ํ์ ์์ผ๋ฉฐ ๊ฒฐํฉ ์ธ๋ฑ์ค๋ฅผ ๊ตฌ์ฑํ๋ ์ปฌ๋ผ ์ค์ ์ต์ ํ๊ฐ ์ด์์ NOT NULL์ธ ๊ฒฝ์ฐ
- INDEX JOIN
- ์ถ์ถํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๊ฐ ์กฐ์ธํ๋ ์ธ๋ฑ์ค์ ๋ชจ๋ ํฌํจ๋์ด ์๊ณ ์ถ์ถํ๋ ๋ฐ์ดํฐ์ ์ ๋ ฌ์ด ํ์์๋ ๊ฒฝ์ฐ
3. ์ ๋ ฌ
3-1. ORDER BY
- ์กฐํ๋ ๋ฐ์ดํฐ๋ค์ ๋ค์ํ ๋ชฉ์ ์ ๋ง๊ฒ ํน์ ์นผ๋ผ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ์ฌ ์ถ๋ ฅํ๋๋ฐ ์ฌ์ฉ
- ์ปฌ๋ผ๋ช ๋์ ALIAS๋ ์ปฌ๋ผ ์์๋ฅผ ๋ํ๋ด๋ ์ ์ ์ฌ์ฉ๋ ๊ฐ๋ฅ
- ๊ธฐ๋ณธ์ ์ธ ์ ๋ ฌ ์์๋ ์ค๋ฆ์ฐจ์
- ์ซ์ํ ๋ฐ์ดํฐ ํ์ : ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ ๊ฒฝ์ฐ ๊ฐ์ฅ ์์ ๊ฐ๋ถํฐ ์ถ๋ ฅ
- ๋ ์งํ ๋ฐ์ดํฐ ํ์ : ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ ๊ฒฝ์ฐ ๋ ์ง ๊ฐ์ด ๊ฐ์ฅ ๋น ๋ฅธ ๊ฐ์ด ๋จผ์ ์ถ๋ ฅ (๊ณผ๊ฑฐ๊ฐ ๋จผ์ ์ถ๋ ฅ)
ORDER BY์ ์ NULL ๊ฐ
- Oracle์ NULL ๊ฐ์ ๊ฐ์ฅ ํฐ ๊ฐ์ผ๋ก ๊ฐ์ฃผ
- ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ ๊ฒฝ์ฐ ๊ฐ์ฅ ๋ง์ง๋ง์, ๋ด๋ฆผ์ฐจ์์ ๊ฒฝ์ฐ ๊ฐ์ฅ ๋จผ์ ์์น
- SQL SERVER๋ NULL ๊ฐ์ ๊ฐ์ฅ ์์ ๊ฐ์ผ๋ก ๊ฐ์ฃผ
4. ๊ทธ๋ฃน
4-1. GROUP BY
4-2. ROLLUP
- ์ธ์์ ์์์ ์ํฅ์ ๋ฐ์
ROLLUP(item_id, month)
SELECT item_id, month, SUM(amount) AS amount
FROM sales
GROUP BY ROLLUP(item_id, month);
ROLLUP(month, item_id)
SELECT month, item_id, SUM(amount) AS amount
FROM sales
GROUP BY ROLLUP(month, item_id);
4-3. CUBE
- ๊ทธ๋ฃนํ ์ปฌ๋ผ์ด ๊ฐ์ง ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ ๋ํ์ฌ ์๊ณ(SUBTOTAL)๊ณผ ์ด๊ณ(GRAND TOTAL)์ ์์ฑ
SELECT item_id, month, SUM(amount) AS amount
FROM sales
GROUP BY CUBE(item_id, month);
4-4. GROUPING SETS
- ์ธ์๋ณ ์๊ณ(SUBTOTAL)๋ง์ด ์์ฑ๋จ
- ROLLUP๊ณผ CUBE์ ๋ฌ๋ฆฌ ๊ณ์ธต ๊ตฌ์กฐ๊ฐ ๋ํ๋์ง ์์ > ์ธ์์ ์์๊ฐ ๋ฌ๋ผ๋ ๊ฒฐ๊ณผ๋ ๋์ผ
SELECT item_id, month, SUM(amount) AS amount
FROM sales
GROUP BY GROUPING SETS(item_id, month);
- ๊ดํธ๋ก ๋ฌถ์ ์งํฉ๋ณ๋ก๋ ์ง๊ณ๋ฅผ ๊ตฌํ ์ ์์
SELECT item_id, month, company, SUM(amount) AS amount
FROM sales
GROUP BY GROUPING SETS((item_id, month), company);
4-5. GROUPING
- ์ง์ ๊ทธ๋ฃน๋ณ ์ง๊ณ๋ฅผ ๊ตฌํ์ง๋ ์์ง๋ง ROLLUP, CUBE, GROUPING SETS๋ฅผ ์ง์ํ๋ ์ญํ
- ์ง๊ณ๊ฐ ๊ณ์ฐ๋ ๊ฒฐ๊ณผ๋
GROUPING(ํํ์) = 1
, ๊ทธ ์ธ์๋GROUPING(ํํ์) = 0
SELECT
CASE GROUPING(item_id) WHEN 1 THEN '๋ชจ๋ ์ํID' ELSE item_id END AS item_id,
CASE GROUPING(month) WHEN 1 THEN '๋ชจ๋ ์' ELSE month END AS month,
SUM(amount) AS amount
FROM sales
GROUP BY GROUPING SETS((item_id, month), company);
5. ์งํฉ ์ฐ์ฐ์
- ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ฐ์ฐ์ ํตํด ์๋ก์ด ๊ฒฐ๊ณผ ์ถ์ถ
์งํฉ ์ฐ์ฐ์ ์ฌ์ฉ ์กฐ๊ฑด
- ๋ ์งํฉ์ SELECT ์ ์ ์ค๋ ์ปฌ๋ผ์ ๊ฐ์, ๋ฐ์ดํฐ ํ์ ์ด ๋์ผํด์ผ ํจ
- ๋ ์งํฉ์ ์ปฌ๋ผ๋ช ์ ๋ฌ๋ผ๋ ์๊ด ์์
์งํฉ ์ฐ์ฐ์์ ์ข ๋ฅ
UNION
: ๋ ์งํฉ์ ๋ํด์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ / ์ค๋ณต ๊ฐ ์ ๊ฑฐํ๊ณ ์ ๋ ฌUNION ALL
: ๋ ์งํฉ์ ๋ํด์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ / ์ค๋ณต ๊ฐ ์ ๊ฑฐ ์ํ๊ณ ์ ๋ ฌ ์ํจINTERSECT
: ๋ ์งํฉ์ ๊ต์งํฉ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํ์ฌ ์ถ๋ ฅMINUS
: ๋ ์งํฉ์ ์ฐจ์งํฉ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ / ์ฟผ๋ฆฌ์ ์์ ์ค์ / INTERSECT์ ๋ฐ๋์ ๊ฒฐ๊ณผ
5-1. INTERSECT
- ๋ฐ์ดํฐ์ ํ์ , ์์, ๊ฐ์๊ฐ ๋ง์์ผ ํจ
SELECT col1, col2 FROM table1
INTERSECT
SELECT col3, col4 FROM table2;
์ฐธ๊ณ ์ฌ์ดํธ
- ๊ณ์ธตํ ์ฟผ๋ฆฌ, WITH์ , ๋ถ์ ํจ์์ window ํจ์, ๋ค์ค ํ ์ด๋ธ INSERT https://thebook.io/006696/part01/ch07/
- ๊ณ์ธตํ ์ฟผ๋ฆฌ - CONNECT BY~ https://tiboy.tistory.com/563
- ๊ณ์ธตํ ์ฟผ๋ฆฌ - CONNECT_BY_ISLEAF https://devjhs.tistory.com/171
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํ ๊ณํ https://coding-factory.tistory.com/744
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํ ๊ณํ 2 https://positivemh.tistory.com/364
- Nested Loop, Sort-Merge, Hash Join https://needjarvis.tistory.com/162
- Nested Loop, Sort-Merge, Hash Join 2 https://myjamong.tistory.com/238
- Nested Loop, Sort-Merge, Hash Join 3 https://regein.tistory.com/194
- ๊ทธ๋ฃน ํจ์ ROLLUP, CUBE, GROUPING https://byul91oh.tistory.com/372
- HAVING COUNT(*) https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=diceworld&logNo=220152871523
- ์ค๋ผํด JOIN ์ข ๋ฅ https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=tyboss&logNo=70008936838
- ๊ทธ๋ฃน๋ณ ์๋ฒ, ์์ https://coding-factory.tistory.com/444
- RATIO_TO_REPORT https://crosstheline.tistory.com/107
- NULL ๊ฐ ์ ๋ ฌ ๊ธฐ์ค https://qqqqqq.tistory.com/entry/ORDER-BY-%EC%A0%88%EC%9D%98-NULL-%EA%B0%92
- ORDER SIBLINGS BY https://diaryofgreen.tistory.com/188
- ์งํฉ ์ฐ์ฐ์ INTERSECT https://mine-it-record.tistory.com/82
- ์ค๋ผํด Window Function https://loghada.tistory.com/19
- ์ค๋ผํด Window Function 2 https://mizykk.tistory.com/121
- ์ค๋ผํด Window Function 3 https://velog.io/@yewon-july/Window-Function