๐งท ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์บ์ ์ต์ ํ
๐๏ธ ๋ฐ์ธ๋ ๋ณ์
1. SQL ๊ณต์ ๋ฐ ์ฌ์ฌ์ฉ ๋จ์
์ฌ์ฉ์ ์ ์ ํจ์/ ํ๋ก์์ , ํธ๋ฆฌ๊ฑฐ, ํจํค์ง ๋ฑ ์ ๊ฒฝ์ฐ
์ด๋ฌํ ์ค๋ธ์ ํธ๋ค์ Stored Object๋ก ๋ถ๋ฅ๋๋ฉฐ, ์์ฑ ์ ๊ณ ์ ํ ์ด๋ฆ์ ๊ฐ๋๋ค. ์์ฑ๊ณผ ๋์์ ์ปดํ์ผ๋ ์ํ๋ก ๋ฐ์ดํฐ ๋์ ๋๋ฆฌ์ ์ ์ฅ๋๋ฉฐ, ์ฌ์ฉ์๊ฐ ์ญ์ ํ์ง ์๋ ํ ์๊ตฌ์ ์ผ๋ก ๋ณด๊ด๋๋ค. ์คํ ์์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์บ์์ ์ ์ฌ๋์ด ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๊ณต์ ํ๋ฉฐ ์ฌ์ฌ์ฉํ ์ ์๋ค.
SQL์ ๊ฒฝ์ฐ
SQL์ Transient Object๋ก ๋ถ๋ฅ๋๋ฉฐ, ๊ณ ์ ํ ์ด๋ฆ์ด ์๊ณ SQL ํ ์คํธ ์์ฒด๊ฐ ์ด๋ฆ ์ญํ ์ ํ๋ค. ๋ฐ์ดํฐ ๋์ ๋๋ฆฌ์ ์ ์ฅ๋์ง ์๊ณ , ์ฒ์ ์คํ ์ ์ต์ ํ ๊ณผ์ ์ ๊ฑฐ์ณ ๋์ ์ผ๋ก ์์ฑ๋ ๋ด๋ถ ํ๋ก์์ ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์บ์์ ์ ์ฌ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋์ผํ SQL์ ๊ณต์ ํ๋ฉฐ ์ฌ์ฌ์ฉํ ์ ์๋ค. ํ์ง๋ง ์บ์ ๊ณต๊ฐ์ด ๋ถ์กฑํ ๊ฒฝ์ฐ ํด๋น SQL์ ์บ์์์ ์ ๊ฑฐ๋๊ณ , ์ดํ ๋ค์ ์คํ ์ ์ต์ ํ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๋ค.
IBM DB2์ ๊ฐ์ DBMS๋ SQL์ ์๊ตฌ์ ์ผ๋ก ์ ์ฅํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, Oracle์ด๋ SQL Server์ ๊ฐ์ DBMS๋ ๊ทธ๋ ์ง ์๋ค. SQL ํ ์คํธ๊ฐ ์ด๋ฆ ์ญํ ์ ํ๋ฏ๋ก, ์์ ๋ถ๋ถ์ด๋ผ๋ ๋ฌ๋ผ์ง๋ฉด ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ก ์ธ์๋๋ค. ๋ชจ๋ SQL์ ์๊ตฌ์ ์ผ๋ก ์ ์ฅํ๋ ค๋ฉด ๋ฐฉ๋ํ ์ ์ฅ ๊ณต๊ฐ์ด ํ์ํ๋ฉฐ, ์ด๋ก ์ธํด SQL์ ๊ฒ์ํ๋ ์๋๋ ๋๋ ค์ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
2. ๋ฐ์ธ๋ ๋ณ์์ ์ค์์ฑ
๋์ ๋ค๋ฐ์ ํ๋ ํ์ฑ ๋ฐ์
I/O ์์ ์ด ๊ฑฐ์ ๋ฐ์ํ์ง ์๋๋ผ๋, SQL ํ๋ ํ์ฑ์ด ๋์๋ค๋ฐ์ ์ผ๋ก ๋ฐ์ํ๋ฉด CPU ์ฌ์ฉ๋ฅ ์ด ๊ธ๊ฒฉํ ์์นํ๋ฉฐ DBMS์ ๋ถํ๋ฅผ ์ด๋ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด, ํน์ ์ด๋ฒคํธ๋ก ์ธํด ๋์ ์ ์์๊ฐ ๋๋์ผ๋ก ๋ฐ์ํ์ฌ ์์ฒญ์ด ๋ชฐ๋ฆด ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด ๋ณด์. ์ด๋, FOR LOOP
๋ฅผ ํตํด ์กฐ๊ฑด์ ์ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉฐ SQL์ ์คํํ๋ฉด, ๊ฐ SQL์ ๋ํด ์๋ก์ด ์ปค์๊ฐ ์์ฑ๋๊ณ ๋งค๋ฒ ํ๋ ํ์ฑ์ด ๋ฐ์ํ๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก SQL ์ตํฐ๋ง์ด์ ์ ๋ก์ฐ ์์ฑ๊ธฐ๊ฐ ๋ง๋ ๋ด๋ถ ํ๋ก์์ ๊ฐ ๋๋์ผ๋ก ์ ์ฌ๋๋ฉด์ ์ฑ๋ฅ ์ ํ๋ฅผ ์ ๋ฐํ ์ ์๋ค.
๊ณต์ ๊ฐ๋ฅํ SQL
๋์๋ค๋ฐ์ ํ๋ ํ์ฑ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํ๋ผ๋ฏธํฐ **Driven ๋ฐฉ์์ ์ฌ์ฉํ๋๋ฐ, ์ฌ๊ธฐ์ ํต์ฌ์ด ๋๋ ๊ฒ์ด ๋ฐ๋ก ๋ฐ์ธ๋ ๋ณ์๋ค. ๋ฐ์ธ๋ ๋ณ์๋ฅผ ํ์ฉํ๋ฉด, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์บ์๋ฅผ ์กฐํํ ๋ ์๋์ ๊ฐ์ ๋จ์ผ SQL๋ง ๋ฐ๊ฒฌ๋๋ค.
SELECT * FROM TABLE FROM ID = :1
์ด SQL์ ์ต์ด ์คํ ์ ๋จ ํ ๋ฒ๋ง ํ๋ ํ์ฑ์ด ์ด๋ฃจ์ด์ง๊ณ , ์ดํ์๋ ๋์ผํ ํ๋ก์์ ๋ฅผ ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๊ณต์ ํ๋ฉฐ ๋ฐ๋ณต ์ฌ์ฌ์ฉํ๊ฒ ๋๋ค. ์ด๋ฅผ ํตํด DBMS ๋ถํ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ค์ผ ์ ์๋ค.
- ์ปค์ ์์ฑ ํ์ ๊ฐ์: ๋ถํ์ํ ์ปค์ ์์ฑ์ ๋ฐฉ์งํ๋ค.
- ๋ฉ๋ชจ๋ฆฌ์ CPU ์ฌ์ฉ๋ ์ ๊ฐ: ๋์ผํ SQL์ ๋ฐ๋ณต ์ฌ์ฌ์ฉํจ์ผ๋ก์จ ๋ฉ๋ชจ๋ฆฌ ์๋ชจ์ ํ์ฑ์ ์์๋๋ ์๊ฐ์ ์ค์ธ๋ค.
- DB ์ฑ๋ฅ ๋ฐ ํ์ฅ์ฑ ํฅ์: ๋ฆฌ์์ค ์ ์ฝ(๋ฉ๋ชจ๋ฆฌ์ CPU ์ฌ์ฉ๋ ์ ๊ฐ)์ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ ๊ฐ์ ํ๋ค.
- ๋์ ์ฌ์ฉ์ ์ ์ ์ ํจ๊ณผ ๊ทน๋ํ: ํนํ ๋์ ์ ์์๊ฐ ๋ง์ ํ๊ฒฝ์์ ๋์ฑ ์ค์ํ ์ญํ ์ ํ๋ค.
3. ๋ฐ์ธ๋ ๋ณ์์ ๋ถ์์ฉ
๋ฐ์ธ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ต์ด ์คํ ์ ์ต์ ํ ๊ณผ์ ์ ๊ฑฐ์ณ ์์ฑ๋ ์คํ ๊ณํ์ด ์บ์์ ์ ์ฌ๋๊ณ , ์ดํ์๋ ํด๋น ๊ณํ์ ์ฌ์ฌ์ฉํ๋ฉฐ ๊ฐ์ ๋ฐ์ธ๋ฉํ์ฌ ๋ฐ๋ณต์ ์ผ๋ก ํ์ฉ๋๋ค. ์ฆ, ์ต์ ํ ์์ ์ ์กฐ๊ฑด์ ์ ๊ฐ์ ๋ฐ์ธ๋ฉํ๋ ์์ ์ด ์๋ ์คํ ์์ ์ด๋ค. ์ด๋ฌํ ํน์ฑ์ผ๋ก ์ธํด ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ์ ์ด ๋ฐ์ํ ์ ์๋ค.
- SQL ์ต์ ํ ์์ ์ ์กฐ๊ฑด์ ์ปฌ๋ผ์ ํ์คํ ๊ทธ๋จ ์ ๋ณด๋ฅผ ํ์ฉํ์ง ๋ชปํ๋ค.
- ๋ฐ์ดํฐ ๋ถํฌ๊ฐ ๊ท ์ผํ์ง ์์ ๊ฒฝ์ฐ, ํ๊ท ๋ถํฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋ ์คํ ๊ณํ์ด ์ต์ ์ ์ ํ์ด ์๋ ์ ์๋ค.
(1) ๋ฐ์ธ๋ ๋ณ์ Peeking
๋ฐ์ธ๋ ๋ณ์์ ๋ถ์์ฉ์ ๊ทน๋ณตํ๊ธฐ ์ํด Oracle 9i๋ถํฐ ๋์ ๋ ๊ธฐ๋ฅ์ด๋ค. SQL์ด ์ฒ์ ํ๋ ํ์ฑ๋ ๋, ๋ฐ์ธ๋ ๋ณ์์ ๊ฐ์ "์ฟ๋ณด๊ณ (peeking)" ์ด๋ฅผ ๋ฐํ์ผ๋ก ์ปฌ๋ผ ๋ถํฌ๋ฅผ ๊ณ ๋ คํ ์คํ ๊ณํ์ ์๋ฆฝํ๋ค. (SQL Server์ ๊ฒฝ์ฐ, Parameter Sniffing)
๊ทธ๋ฌ๋ ์คํ ๊ณํ์ด ์ ์ ํ์ง ์์ ๊ฒฝ์ฐ, SQL ์คํ ์๋๊ฐ ๊ฐ์๊ธฐ ๋๋ ค์ง๊ฑฐ๋, ์์ฃผ ์คํ ๊ณํ์ด ๋ณ๊ฒฝ๋์ด ์ฑ๋ฅ ๋ณ๋์ด ์ฌํด์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ด๋ฌํ ์ด์ ๋ก ๋๋ถ๋ถ์ ์์คํ ์์ ํ์ฌ๋ ๋นํ์ฑํ๋ ์ํ๋ก ์ด์๋๋ค.
(2) ์ ์์ ์ปค์ ๊ณต์ (Adaptive Cursor Sharing)
Oracle 11g์ ๋์ ๋ ๊ธฐ๋ฅ์ผ๋ก, ์ ๋ ฅ๋ ๋ฐ์ธ๋ ๋ณ์ ๊ฐ์ ๋ถํฌ์ ๋ฐ๋ผ ์๋ก ๋ค๋ฅธ ์คํ ๊ณํ์ ์ฌ์ฉํ ์ ์๋๋ก ์ค๊ณ๋์๋ค.
- ์ ํ๋๊ฐ ๋์ ์กฐ๊ฑด์ ๋ํด ํ ์ด๋ธ์ Full Scan ํ๋ ์คํ ๊ณํ์ ์์ฑํ๊ณ , ์ด๋ฅผ ์ปค์๋ก ์ฌ์ฌ์ฉ.
- ์ ํ๋๊ฐ ๋ฎ์ ์กฐ๊ฑด์ด ์ ๋ ฅ๋๋ฉด, ํ์คํ ๊ทธ๋จ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ๋ ์๋ก์ด ์คํ ๊ณํ์ ์์ฑ.
- ๋ ๊ฐ์ Child Cursor๊ฐ ์บ์์ ์ ์ฅ๋๊ณ , ์ ํ๋์ ๋ฐ๋ผ ์ ํฉํ ์ปค์๋ฅผ ์ ํ์ ์ผ๋ก ์ฌ์ฌ์ฉ.
- ํ์ฌ ๋ฐ์ธ๋ ๊ฐ์ ์ ํฉํ ์ปค์๊ฐ ์์ ๊ฒฝ์ฐ, ํ๋ ํ์ฑ์ ํตํด ์๋ก์ด ์คํ ๊ณํ์ ์์ฑ.
์ด ๊ธฐ๋ฅ์ ํ์ฉํ๋ ค๋ฉด ์กฐ๊ฑด์ ์ปฌ๋ผ์ ํ์คํ ๊ทธ๋จ์ด ์์ฑ๋์ด ์์ด์ผ ํ๋ค. ๋ค๋ง, ๊ธฐ์กด ์ปค์๋ฅผ ๋จผ์ ์คํํ ํ ์ฑ๋ฅ์ด ์ข์ง ์๋ค๊ณ ํ๋จ๋์์ ๋ ์๋ก์ด ์คํ ๊ณํ์ ์์ฑํ๋ ๋ฐฉ์์ผ๋ก, ์ฆ๊ฐ์ ์ธ ์ต์ ํ๊ฐ ์ด๋ฃจ์ด์ง์ง ์๋ ๋จ์ ์ด ์๋ค.
(3) ์ ๋ ฅ ๊ฐ์ ๋ฐ๋ผ SQL ๋ถ๋ฆฌ
๋ฐ์ธ๋ ๋ณ์ ์ฌ์ฉ์ ๋ฐ๋ฅธ ๋ถ์์ฉ์ ํผํ๊ธฐ ์ํด, ๋ฐ์ธ๋ ๊ฐ์ ๋ฐ๋ผ ์คํ ๊ณํ์ ๋ถ๋ฆฌํ๋ ๋ฐฉ์์ ๊ณ ๋ คํ ์ ์๋ค.
SELECT /*+ FULL(A)*/ *
FROM TABLE
WHERE :O IN ('A','B')
AND OPTION = :O
UNION ALL
SELECT /*+ INDEX(A IDX)*/ *
FROM TABLE
WHERE :O NOT IN ('A','B')
AND OPTION = :O
๋จ์ :
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์บ์ ํจ์จ ์ ํ:
UNION ALL
๋ก ๊ฒฐํฉ๋ N๊ฐ์ SQL์ ์ตํฐ๋ง์ด์ ๊ฐ N๊ฐ๋ฅผ ๋ชจ๋ ์ต์ ํํด์ผ ํ๋ฉฐ, Shared Pool์์ ๊ณต๊ฐ ๋ญ๋น๊ฐ ๋ฐ์. - CPU ๋ถํ ์ฆ๊ฐ:
- Parse ๋จ๊ณ์์ ๋ง์ CPU ๋ฆฌ์์ค๋ฅผ ์๋ชจ.
- ์คํ๋์ง ์๋ ๋ถ๊ธฐ ์กฐ๊ฑด๊น์ง ํฌํจ๋์ด Execute ๋จ๊ณ์์๋ ์ถ๊ฐ์ ์ธ CPU ์ฌ์ฉ ๋ฐ์.
- ๋คํธ์ํฌ ํธ๋ํฝ ์ฆ๊ฐ: SQL ๋ถ๋ฆฌ๋ก ์ธํด ๋ฉ์์ง ์ ์ก๋ ์ฆ๊ฐ.
(4) ์์ธ์ ์ผ๋ก Literal ์์๊ฐ ์ฌ์ฉ
์กฐ๊ฑด์ ์ปฌ๋ผ์ ๊ฐ ์ข ๋ฅ๊ฐ ์์์ผ ๊ฒฝ์ฐ, ๋ฐ์ธ๋ ๋ณ์ ๋์ Literal ์์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ผ ์ ์๋ค. ์ ๋ ฅ ๊ฐ ์ข ๋ฅ๊ฐ ์ ๋ค๋ฉด ํ๋ ํ์ฑ ๋ถํ๊ฐ ํฌ์ง ์์ผ๋ฉฐ, ์ตํฐ๋ง์ด์ ๊ฐ ์ต์ ์ ์คํ ๊ณํ์ ์๋ฆฝํ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๊ธฐ ๋๋ฌธ์ด๋ค.
Literal ์์ ์ฌ์ฉ์ด ์ ๋ฆฌํ ๊ฒฝ์ฐ:
- ๋ฒ์ ๊ฒ์ ์กฐ๊ฑด: ๋ถ๋ฑํธ๋
BETWEEN
์กฐ๊ฑด์ ์ ์ฌ์ฉํ ๊ฒฝ์ฐ, Literal ์์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ต์ ํ์ ์ ๋ฆฌ - ๋ฐฐ์น ํ๋ก๊ทธ๋จ ๋ฐ ์ ๋ณด๊ณ ์์คํ
(DW/OLAP):
- ๋๋ถ๋ถ ๊ธฐ๊ฐ ์กฐ๊ฑด์ ํฌํจํ๋ฉฐ ๋ฒ์ ๊ฒ์์ด ๋ง๊ธฐ ๋๋ฌธ์ Literal ์์๋ฅผ ์ฌ์ฉํ ๋ ๋ ๋์ ์คํ ๊ณํ์ด ์๋ฆฝ
- Long-running ์ฟผ๋ฆฌ์ ํน์ฑ์ ํ์ฑ ์๊ฐ์ ์ ์ฒด ์ฟผ๋ฆฌ ์๊ฐ์์ ํฐ ๋น์ค์ ์ฐจ์งํ์ง ์์.
- ์ฌ์ฉ ๋น๋๊ฐ ๋งค์ฐ ๋ฎ์ ๊ฒฝ์ฐ:
- ํ๋ ํ์ฑ์ ๋ฐ๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์บ์ ๋ถํ๊ฐ ๊ฑฐ์ ์์ ๋, OLTP ์์คํ ์์๋ ์ ํ์ ์ผ๋ก Literal ์์๋ฅผ ์ฌ์ฉํ ์ ์์.
- ๋จ, OLTP ํ๊ฒฝ์์๋ ํน์ํ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ๋ฐ๋์ ๋ฐ์ธ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์์น.
- ์กฐ๊ฑด์ ์ปฌ๋ผ ๊ฐ ์ข ๋ฅ๊ฐ ์์์ผ ๊ฒฝ์ฐ: ๊ฐ์ ์ข ๋ฅ๊ฐ ์ ์ด ์บ์์ ์ ์ฅ๋ SQL ์ฌ์ฌ์ฉ์ด ์ฉ์ดํ ๊ฒฝ์ฐ Literal ์ฌ์ฉ์ด ํจ๊ณผ์ ์ผ ์ ์์.
๐๏ธ ์ธ์ ์ปค์ ์บ์ฑ ๊ธฐ๋ฅ
(1) ๋ฌธ์ ๋ฐ์
์ปค์๋ฅผ ๊ณต์ ํ ์ ์๋ ํํ๋ก SQL์ ์์ฑํ๋ฉด ํ๋ ํ์ฑ์ ์ต์ํํ์ฌ ์์คํ ํ์ฅ์ฑ์ ๋์ผ ์ ์๋ค. ๊ทธ๋ฌ๋ ํ๋ ํ์ฑ์ ํผํ๋๋ผ๋ SQL ๊ตฌ๋ฌธ์ ๋ถ์ํ๊ณ ํด์ ๊ฐ์ ๊ณ์ฐํ๋ฉฐ, Library Cache ๋์น๋ฅผ ํ๋ํ ๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์บ์์์ ์ปค์๋ฅผ ํ์ํ๋ ์์ ์์ฒด๊ฐ ๋ถ๋ด์ด ๋๋ ์์ ์ด๋ค. ํนํ, SQL์ ๋์ ์คํํ๋ ๋น๋๊ฐ ๋์์ง๋ฉด ๊ฒฝํฉ์ด ๋ฐ์ํ์ฌ ์์คํ ๋ถํ๋ฅผ ์ ๋ฐํ๋ค.
(2) ์ธ์ ์ปค์ ์บ์ฑ์ ํตํด ๋ฌธ์ ํด๊ฒฐ
Shared Pool์ ์์นํ ๊ณต์ ์ปค์๋ฅผ ์คํํ๊ธฐ ์ํด PGA๋ก ์ธ์คํด์คํ๋ ์ปค์๋ฅผ ์ธ์ ์ปค์ ๋ผ๊ณ ํ๋ค. ์ฟผ๋ฆฌ๋ฅผ ์คํํ ํ ์ปค์๋ฅผ ๋ซ์ผ๋ฉด, ์ธ์ ์ปค์์ ์ํด ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์ ๊ณต์ ์ปค์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๊ฐ ์ฆ์ ํด์ ๋๋ค. ์ดํ ๋์ผํ SQL์ ์คํํ๋ฉด ์ปค์๋ฅผ ์ด๊ธฐ ์ํด ๋ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์บ์ ํ์ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ค๋ผํด์ ์์ฃผ ์คํ๋๋ ์ธ์ ์ปค์๋ฅผ ์ธ์ ์ปค์ ์บ์(Session Cursor Cache)์ ์ ์ฅํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์ด๋ฅผ ํตํด Parse Call์ ๋ฐ๋ฅธ ๋ถํ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ค์ผ ์ ์๋ค.
(3) ๊ธฐ๋ฅ ํ์ฑํ
- Parse Call ํ์ ≥ 3์ธ ์ปค์๋ฅผ ๋ซ์ ๋, ํด๋น ์ปค์๋ฅผ ์ธ์ ์ปค์ ์บ์์ ์ ์ฅํ๋ค.
- ์ธ์ ์ปค์ ์บ์์๋ SQL ํ ์คํธ์ ํจ๊ป ๊ณต์ ์ปค์๋ฅผ ์ฐธ์กฐํ๋ ํฌ์ธํฐ๋ฅผ ์ ์ฅํ๋ค.
- ์ปค์๋ฅผ ๋ซ๋๋ผ๋ ๊ณต์ ์ปค์์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์งํ๋ฏ๋ก, ์ดํ ๋์ผํ SQL ์คํ ์ ๋ ๋น ๋ฅด๊ฒ ์ปค์๋ฅผ ์ด ์ ์๋ค.
(4) ํน์ง
- LRU ์๊ณ ๋ฆฌ์ฆ : ์ธ์ ์ปค์ ์บ์ ๋ด์์๋ LRU(Least Recently Used) ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ์ฌ, ์๋ก์ด ์ํธ๋ฆฌ๋ฅผ ์ ์ฅํ ๊ณต๊ฐ์ด ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉ ๋น๋๊ฐ ๋ฎ์ ์ปค์๋ฅผ ๋ฐ์ด๋ธ๋ค.
- Parse Call ๋ถํ ๊ฐ์: Parse Call ์์ฒด๋ฅผ ์ค์ด๋ ๊ฒ์ด ์๋๋ผ, Parse Call๋ก ์ธํ ์์คํ ๋ถํ๋ฅผ ๊ฐ์์ํค๋ ๊ธฐ๋ฅ์ด๋ค.
- PL/SQL๊ณผ ์ฐ๊ณ: PL/SQL์์๋ SQL ์ปค์๋ฅผ ์๋์ผ๋ก ์บ์ฑํ๋ค. ๋จ, Oracle 10g๋ถํฐ๋
session_cached_cursors
ํ๋ผ๋ฏธํฐ๊ฐ 0๋ณด๋ค ํฐ ๊ฐ์ผ๋ก ์ค์ ๋์ด ์์ด์ผ ์๋ํ๋ค.
(5) ์ฅ์
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์บ์ ๋ถํ ๊ฒฝ๊ฐ: ์์ฃผ ์คํ๋๋ SQL์ ์ํด ๋ฐ์ํ๋ ๋ถํ๋ฅผ ์ค์ธ๋ค.
- CPU ์ฌ์ฉ๋ ๊ฐ์: SQL ๊ตฌ๋ฌธ ๋ถ์ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์บ์ ํ์ ๊ณผ์ ์์ ์๋ชจ๋๋ CPU ์์์ ์ค์ธ๋ค.
- ๋์น ์์ฒญ ํ์ ๊ฐ์: ์ํํธ ํ์ฑ ๊ณผ์ ์์ ๋ฐ์ํ๋ ๋์น ์์ฒญ์ ์ค์ฌ ์์คํ ์ฑ๋ฅ์ ํฅ์์ํจ๋ค.
๐๏ธ ์ ํ๋ฆฌ์ผ์ด์ ์ปค์ ์บ์ฑ
๋ฌธ์ ๋ฐ์
์ธ์
์ปค์๋ฅผ ์บ์ฑํ๋ฉด SGA์ ๊ณต์ ์ปค์๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ปค์๋ฅผ ์ด ์ ์๋ค. ๊ทธ๋ฌ๋, ์ธ์
์ปค์ ์บ์์ ์๋ SQL์ ์คํํ๋๋ผ๋ ์ฌ์ ํ ๊ณต์ ์ปค์ ํ์ Pin ํ๊ณ , ์คํ์ ํ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ PGA์ ํ ๋นํ๋ ์์
์ ๋ฐ๋ณต๋๋ค.
์ด๋ฌํ ์์ ์ ์๋ตํ๊ณ SQL์ ๋์ฑ ๋น ๋ฅด๊ฒ ์คํํ๋ ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ปค์ ์บ์ฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ผ ํ๋ค. ์ด ๊ธฐ๋ฅ์ ๊ณต์ ์ปค์๋ฅผ Pin ํ ์ํ๋ก ์ ์งํ์ฌ Parse Call์ด ์ต์ด 1ํ๋ง ๋ฐ์ํ๊ฒ ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก๋ Execute Call ํ์๋งํผ Parse Call์ด ๋ฐ๋ณต๋๋ค.
1. Java์์์ ์ปค์ ์บ์ฑ
Java์์ ์ปค์ ์บ์ฑ์ ์ํด ์๋ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค:
- ๋ฌต์์ ์บ์ฑ(implicit caching) ์ต์ ์ ํ์ฑํํ๊ฑฐ๋, Statement(์ปค์)๋ฅผ ๋ซ์ง ์์์ผ ํ๋ค.
- ํ๋ ํ์ฑ์ ์ต์ด 1ํ๋ง ์ํํ๋ ค๋ฉด ๋ฐ์ธ๋ ๋ณ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
(1) ์ปค์๋ฅผ ๋ซ์ง ์๊ณ ์ฌ ์ฌ์ฉํ ๊ฒฝ์ฐ
public static void CursorHolding (Connection conn, int count) throws Exception{
PreparedStatement stmt = conn.prepareStatement (
"SELECT /* cursor holding */ ?,?,?, a .* FROM emp a WHERE a.ename LIKE 'W%'");
ResultSet rs;
for (int i = 1; i <= count; i++) {
stmt.setInt(1,i);
stmt.setInt(2,i);
stmt.setString(3,"test");
rs=stmt.executeQuery();
rs.close();
}
stmt.close(); // ๋ฃจํ ์ธ๋ถ์์ Cursor Close
}
๋ฐ์ธ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ์ผ๋ฏ๋ก ํ๋ ํ์ฑ์ ์ต์ด 1ํ๋ง ์ํ๋๋ค. ์ปค์๋ฅผ ๋ฃจํ ์ธ๋ถ์์ ๋ซ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ, Parse Call์ 1ํ๋ง ๋ฐ์ํ๋ค.
(2) ๋ฌต์์ ์บ์ฑ ๊ธฐ๋ฅ ์ฌ์ฉํ ๊ฒฝ์ฐ
public static void CursorCaching(Connection conn, int count) throws Exception{
((OracleConnection) conn) .setStatementCacheSize(1); // ์บ์ ์ฌ์ด์ฆ๋ฅผ 1๋ก ์ง์
((OracleConnection) conn) .setImplicitCachingEnabled(true); // ๋ฌต์์ ์บ์ฑ ๊ธฐ๋ฅ ํ์ฑํ
for (int i = 1; i <= count; i++) {
PreparedStatement stmt = conn.prepareStatement (
"SELECT /* implicit caching */ ?,?,?,a .* " +
"FROM emp a WHERE a.ename LIKE 'W%'");
stmt.setInt(1,i);
stmt.setInt(2,i);
stmt.setString(3,"test");
ResultSet rs=stmt.executeQuery();
rs.close();
stmt.close(); // ๋ฃจํ ๋ด๋ถ์์ Cursor Close
}
}
์ปค์๋ฅผ ๋ฃจํ ๋ด๋ถ์์ ๋ซ๋๋ผ๋ ๋ฌต์์ ์บ์ฑ ์ต์ ์ด ํ์ฑํ๋์ด ๋ด๋ถ์ ์ผ๋ก ์บ์์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์ปค์๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋ค. ์ด๋ ๋ฌต์์ ์บ์ฑ ์ต์ ์ ํ์ฑํํ๊ธฐ ๋๋ฌธ์ด๋ค.
2. PL/SQL์์์ ์ปค์ ์บ์ฑ
PL/SQL์์๋ ๋ณ๋์ ์ต์ ์์ด๋ ์๋์ผ๋ก ์ปค์๋ฅผ ์บ์ฑํ๋ค. ๋จ, Static SQL์ผ ๊ฒฝ์ฐ์๋ง ์บ์ฑ์ด ์ ์ฉ๋๋ฉฐ, Dynamic SQL์ด๋ Cursor Variable(Ref Cursor)์ ์ฌ์ฉํ๋ฉด ์๋ ์บ์ฑ ํจ๊ณผ๊ฐ ์ฌ๋ผ์ง๋ค.
- Oracle 9i๊น์ง๋
open_cursors
ํ๋ผ๋ฏธํฐ๊ฐ ์บ์ฑ ๊ฐ๋ฅํ SQL ๊ฐ์๋ฅผ ๊ฒฐ์ ํ๋ค. - Oracle 10g๋ถํฐ๋
session_cached_cursors
ํ๋ผ๋ฏธํฐ๊ฐ ์ด๋ฅผ ๋์ ํ๋ค. ํด๋น ํ๋ผ๋ฏธํฐ๋ ์ธ์ ์ปค์๊ณผ๋ ๊ด๋ จ ์๊ธฐ ๋๋ฌธ์ ์ธ์ ์ปค์ ์บ์ฑ ๊ธฐ๋ฅ์ด ๋นํ์ฑํ๋๋ฉด PL/SQL์ ์๋ ์ปค์ ์บ์ฑ๋ ๋นํ์ฑํ๋๋ค.
3. n-Tier ํ๊ฒฝ์์์ ์ปค์ ์บ์ฑ
n-Tier ํ๊ฒฝ์์๋ DB Connection ์ฌ์ฉ ํ ์ฆ์ ์ปค๋ฅ์ ํ์ ๋ฐํ๋๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์์ค์์ ์ปค์ ์บ์ฑ ๊ธฐ๋ฒ์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๊ธฐ ์ด๋ ต๋ค. ๊ทธ๋ฌ๋ PL/SQL๋ก ์์ฑ๋ ํจ์๋ ํ๋ก์์ ๋ฅผ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ๋ฉด, ์ ํ๋ฆฌ์ผ์ด์ ์ปค์ ์บ์ฑ๊ธฐ๋ฒ์ ํ์ฉํ ์ ์๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์บ์ ํจ์จ์ ํฌ๊ฒ ํฅ์์ํจ๋ค.
๐๏ธ Static SQL vs Dynamic SQL
Static SQL (=Embedded SQL) ์ด๋? ๋ฌธ์์ด ๋ณ์์ ๋ด์ง ์๊ณ ์ฝ๋ ์ฌ์ด์ ์ง์ ๊ธฐ์ ๋ SQL๋ฌธ์ ์๋ฏธํ๋ค.
- Static SQL์ ์ง์ํ๋ ๊ฐ๋ฐ ์ธ์ด๋ PowerBuilder, PL/SQL, Proc*C, SQLJ ๋ฟ์ด๊ณ ์ด์ธ์๋ ๋ชจ๋ Dynamic SQL์ ์ง์ํ๋ค.
Dynamic SQL ์ด๋? ๋ฌธ์์ด ๋ณ์์ ๋ด์์ ๊ธฐ์ ํ๋ SQL๋ฌธ์ ์๋ฏธํ๋ค.
- ๋ณ์์ ๊ฐ์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ผ๋ฏ๋ก ์กฐ๊ฑด์ ๋ฐ๋ผ SQL๋ฌธ์ ์ ์ฐํ๊ฒ ์กฐ์ ํ ์ ์๋ค.
- ์คํ ์ ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ์ SQL๋ฌธ์ ์ผ๋ถ ๋๋ ์ ์ฒด๋ฅผ ๊ตฌ์ฑํ์ฌ ์คํํ ์ ์๋ค.
์ฑ๋ฅ๊ณผ ๋ฐ์ธ๋ ๋ณ์ ์ฌ์ฉ
Static SQL๊ณผ Dynamic SQL์ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ๊ด์ ์์์ ๊ตฌ๋ถ์ผ ๋ฟ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฅ์์๋ ๋์ผํ SQL๋ฌธ์ผ๋ก ์ฒ๋ฆฌ๋๋ค. ๋ฐ๋ผ์ ์ ํ๋ฆฌ์ผ์ด์ ์ปค์ ์บ์ฑ ๊ธฐ๋ฅ์ ํ์ฉํ์ง ์๋ ํ, Static, Dynamic ๊ตฌ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์บ์ ํจ์จ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.
๊ฒฐ๊ตญ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์บ์ ํจ์จ์ ๋ ผํ ๋ ์ด์ ์ ๋ฐ์ธ๋ ๋ณ์ ์ฌ์ฉ ์ฌ๋ถ์ ๋ง์ถฐ์ ธ์ผ ํ๋ค. Dynamic SQL์ ์ฌ์ฉ ์์ฒด๊ฐ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ ๋ฐํ๋ ๊ฒ์ด ์๋๋ผ, ๋ฐ์ธ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์์ ๋ ๋ฌธ์ ๊ฐ ๋๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ SQL ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด์๋ Static, Dynamic ๊ตฌ๋ถ๋ณด๋ค ๋ฐ์ธ๋ ๋ณ์๋ฅผ ์ ์ ํ ํ์ฉํ๋ ๊ฒ์ ์ด์ ์ ๋ง์ถ๋ ๊ฒ์ด ์ค์ํ๋ค. Static๊ณผ Dynamic SQL์ ๋ฐ์ธ๋ ๋ณ์ ์ฌ์ฉ ์ฌ๋ถ๋ก ๊ตฌ๋ถํ๋ ค๋ ๊ฒ์ ์ ์ ํ์ง ์๋ค.
1. Dynamic SQL ์ฌ์ฉ ๊ธฐ์ค
(1) Dynamic SQL ์ฌ์ฉ์ ๊ดํ ๊ธฐ๋ณธ ์์น
- Static SQL์ ์ง์ํ๋ ๊ฐ๋ฐํ๊ฒฝ์ด๋ผ๋ฉด, Static SQL๋ก ์์ฑํ๋ ๊ฒ์ด ์์น์ผ๋ก ํ๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์บ์ฑ ๊ธฐ๋ฅ์ด ํ์ํ ์ํฉ์์ Dynamic SQL์ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- Dynamic SQL ์ฌ์ฉ์ด ํ์ฉ๋๋ ๊ฒฝ์ฐ
- PreCompile ๊ณผ์ ์์ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ SQL ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ๋ (์: ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ, ๋ถ์ ํจ์, ANSI ์กฐ์ธ ๋ฑ).
- ์ํฉ๊ณผ ์กฐ๊ฑด์ ๋ฐ๋ผ ์์ฑ๋๋ SQL์ ๊ฒฝ์ฐ์ ์๊ฐ ๋๋ฌด ๋ง์ Static SQL๋ก ์์ฑํ๋ฉด ๊ฐ๋ฐ ์์ฐ์ฑ์ด ๋จ์ด์ง๊ณ ์ ์ง๋ณด์ ๋น์ฉ์ด ํฌ๊ฒ ์ฆ๊ฐํ๋ ๊ฒฝ์ฐ.
- Dynamic SQL์ ์ฌ์ฉํ ๋๋ ์กฐ๊ฑด์ ์๋ ๋ฐ์ธ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์์น์ผ๋ก ํ๋ค.
- ํนํ ์ฌ์ฉ ๋น๋๊ฐ ๋๊ณ ์กฐ๊ฑด์ ์ ์ปฌ๋ผ ๊ฐ ์ข ๋ฅ๊ฐ ๋ง์ ๊ฒฝ์ฐ์๋ ๋ฐ๋์ ์ค์ํด์ผ ํ๋ค.
- ๋ฐ์ธ๋ ๋ณ์ ๋ฏธ์ฌ์ฉ์ด ์์ธ์ ์ผ๋ก ์ธ์ ๋๋ ๊ฒฝ์ฐ → [[#(4) ์์ธ์ ์ผ๋ก, Literal ์์๊ฐ ์ฌ์ฉ|Literal ์์๊ฐ ์ฌ์ฉ]]
- Long Running ์ฟผ๋ฆฌ: ๋ฐฐ์น ํ๋ก๊ทธ๋จ, DW, OLAP ๋ฑ ์ ๋ณด๊ณ ์์คํ ์์ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ๋ก, ํ์ฑ ์์ ์๊ฐ์ด ์ ์ฒด ์ฟผ๋ฆฌ ์ํ ์๊ฐ์์ ์ฐจ์งํ๋ ๋น์ค์ด ๋งค์ฐ ๋ฎ๊ณ , ์ํ ๋น๋๋ ๋ฎ์ ํ๋ํ์ฑ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์บ์ ๋ถํ๋ฅผ ์ ๋ฐํ ๊ฐ๋ฅ์ฑ์ด ์ ์ ๊ฒฝ์ฐ.
- OLTP ์ ํ๋ฆฌ์ผ์ด์ ์์์ ์์ธ: ์ฌ์ฉ ๋น๋๊ฐ ๋งค์ฐ ๋ฎ์ ํ๋ํ์ฑ์ผ๋ก ์ธํ ๋ถํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ ์์ธ์ ์ผ๋ก ํ์ฉ๋๋ค. ๋ค๋ง, OLTP ํ๊ฒฝ์์๋ ๊ฐ๋ฅํ๋ฉด ๋ฐ์ธ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์์น์ด๋ค.
- ์กฐ๊ฑด์ ๊ฐ์ ์ข ๋ฅ๊ฐ ์์์ด๋ฉฐ, ๊ฐ ๋ถํฌ๊ฐ ๊ท ์ผํ์ง ์์ ์ตํฐ๋ง์ด์ ๊ฐ ์ปฌ๋ผ ํ์คํ ๊ทธ๋จ ์ ๋ณด๋ฅผ ํ์ฉํ ์ ์๋๋ก ์ ๋ํด์ผ ํ๋ ๊ฒฝ์ฐ.
(2) Static SQL์ ์ ํ์ ๊ฒ์ ์กฐ๊ฑด
Dynamic SQL ์ฌ์ฉ ์์น์ ์ ํด๋ ์ค์ ๊ฐ๋ฐ์์๋ ์ ๋๋ก ์ง์ผ์ง๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ํนํ ๊ฒ์ ์กฐ๊ฑด์ด ๋ค์ํด ์ฌ์ฉ์ ์ ํ์ ๋ฐ๋ผ ์กฐ๊ฑด์ ์ด ๋์ ์ผ๋ก ๋ฐ๋๋ ์ํฉ์์๋ Static SQL๋ง์ผ๋ก ๋์ํ๊ธฐ ์ด๋ ต๋ค.
Dynamic SQL ์ฌ์ฉ์ ์ค์ด๊ธฐ ์ํด NVL๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋จ์ผ ์คํ ๊ณํ์ ๊ณต์ ํ๋๋ก ์์ฑํ ์ ์๋ค. ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์บ์ ํจ์จ ์ธก๋ฉด์์ ์ ๋ฆฌํ์ง๋ง, ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ค.
๋ฌธ์ ์ : ์กฐ๊ฑด์ ์ปฌ๋ผ์ด ์ธ๋ฑ์ค์ธ ๊ฒฝ์ฐ, ์ธ๋ฑ์ค๋ฅผ ์ ํ ์ฌ์ฉํ์ง ๋ชปํ๊ฑฐ๋ ๋นํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์์ ์ฝ๋ :
SELECT *
FROM TABLE
WHERE ์ผ์ BETWEEN :ST AND :ET
AND ๊ตฌ๋ถ = NVL(:GUBUN, 'GUBUN')
AND ์ ํ = NVL(:CODE, 'CODE')
์ด์ฒ๋ผ NVL์ ์ฌ์ฉํ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์บ์ ํจ์จ์ ๋์์ง์ง๋ง, I/O ํจ์จ์ ์ ํ๋ ์ ์๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ํ์ค์ ์ธ ๋์์ด ํ์ํ๋ค.
ํ์ค์ ์ธ ๋์ :
- Static SQL ์ฌ์ฉ ์์น ์ค์:
์ฌ์ฉ์ ์ ๋ ฅ ์กฐ๊ฑด์ ๋ฐ๋ผ ์์ฑ๋ ์ ์๋ SQL ๊ฐ์๊ฐ ๋๋ฌด ๋ง์ ๊ฒฝ์ฐ, Dynamic SQL ์ฌ์ฉ์ ํ์ฉํ๋ค.- Dynamic SQL๋ก ์์ฑ๋ SQL ์ค ์ผ๋ถ๋ง ์์ฃผ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์, ์ค์ง์ ์ธ ํ๋ํ์ฑ ๋ถํ๋ ํฌ์ง ์๋ค.
- ๋ค๋ง, ๋ฐ์ธ๋ ๋ณ์ ์ฌ์ฉ ์์น์ ๋ฐ๋์ ์ค์ํด์ผ ํ๋ค.
- Dynamic SQL์ ๋จ์ :
- ์กฐ๊ฑด์ ์ด ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋์ด ์ธ๋ฑ์ค ์ค๊ณ๊ฐ ์ด๋ ค์์ง ์ ์๋ค.
- ์ตํฐ๋ง์ด์ ํํธ๋ฅผ ์ฌ์ฉํด์ผ ํ ๊ฒฝ์ฐ, SQL์ด ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋๋ฉด ํํธ ์ ์ฉ์ด ์ด๋ ต๋ค.
- ๊ฒฐ๋ก :
๊ฐ๋ฐ ์์ฐ์ฑ๊ณผ ์ฑ๋ฅ์ ๋ชจ๋ ๊ณ ๋ คํด Static SQL ์ฌ์ฉ์ ๊ธฐ๋ณธ ์์น์ผ๋ก ํ๊ณ , Dynamic SQL์ ์ ์คํ๊ฒ ํ์ํ ๋๋ง ์ฌ์ฉํด์ผ ํ๋ค.
์ ํ์ ๊ฒ์ ์กฐ๊ฑด ์ Static SQL ํ์ฉ ๋ฐฉ์
๋ค์ํ ๊ฒ์ ์กฐ๊ฑด์ ์ฒ๋ฆฌํ ๋๋ ์๋ ๋ฐฉ๋ฒ๋ค์ ํ์ฉํ ์ ์๋ค. ๊ฐ ๋ฐฉ๋ฒ์ ์ฅ๋จ์ ์ ์ดํดํ๊ณ ์ ์ ํ ์ ํํด์ผ ํ๋ค.
- (:CODE IS NULL OR CODE = :CODE)
- ๋จ์ : OR ์กฐ๊ฑด์ด ํฌํจ๋๋ฉด TABLE FULL SCAN์ด ๋ฐ์ํ๋ค. ์ธ๋ฑ์ค๋ฅผ ํ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ์ ํฉํ์ง ์๋ค.
- CODE LIKE :CODE || '%'
- ์ฅ์ : ์ธ๋ฑ์ค ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- ๋จ์ :
- ์ฌ์ฉ์๊ฐ ๊ฐ์ ์ ๋ ฅํ์ง ์์ ๊ฒฝ์ฐ์๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค.
- NULL ํ์ฉ ์ปฌ๋ผ์ผ ๋๋ ๊ฒฐ๊ณผ ์งํฉ์ด ๋ฌ๋ผ์ง ์ ์๋ค.
- ์กฐ๊ฑด์ = NVL(:CODE, 'CODE') / ์กฐ๊ฑด์ = DECODE(:CODE, NULL, 'CODE', :CODE)
- ์ฅ์ : ๋ณ์ ์ ๋ ฅ ์ฌ๋ถ์ ๋ฐ๋ผ TABLE FULL SCAN๊ณผ INDEX SCAN์ผ๋ก ์คํ ๊ณํ์ด ๋ถ๊ธฐ๋๋ค.
- ๋จ์ :
- NULL ํ์ฉ ์ปฌ๋ผ์์๋ ๊ฒฐ๊ณผ ์งํฉ์ด ๋ฌ๋ผ์ง ์ ์๋ค.
- ์ฌ๋ฌ ์ปฌ๋ผ์ ๋ํ ์ฌ์ฉํ ๋๋ ๊ทธ์ค ๋ณ๋ณ๋ ฅ์ด ๊ฐ์ฅ ์ข์ ์ปฌ๋ผ ๊ธฐ์ค์ผ๋ก ํ๋ฒ๋ง ๋ถ๊ธฐ๊ฐ ์ผ์ด๋๋ค. ์ด๋ ๊ธฐ ๋๋ฌธ์ ๋ณต์กํ ์ต์ ์กฐ๊ฑด์ ์ฒ๋ฆฌํ ๋, ์ด ๋ฐฉ์์๋ง ์์กดํ๊ธฐ ์ด๋ ต๋ค.
- UNION ALL ์ฌ์ฉ: ์กฐ๊ฑด์ ๋ฐ๋ผ ์ฟผ๋ฆฌ๋ฅผ ๋ช
์์ ์ผ๋ก ๋ถ๊ธฐ ์ฒ๋ฆฌํ ์ ์๋ค.
- ์ฅ์ : ๋ช ํํ ์คํ ๊ณํ์ผ๋ก ์ธ๋ฑ์ค ํ์ฉ์ด ์ฉ์ดํ๋ค.
์ ํ ๊ธฐ์ค :
- NOT NULL ์ปฌ๋ผ : NVL/DECODE๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํธ๋ฆฌํ๋ค.
- NULL ํ์ฉ ์ปฌ๋ผ : ์ธ๋ฑ์ค ์ก์ธ์ค๊ฐ ์ค์ํ ๊ฒฝ์ฐ, UNION ALL์ ์ฌ์ฉํด ๋ช ์์ ์ผ๋ก ๋ถ๊ธฐ ์ฒ๋ฆฌํ๋ค.
- ์ธ๋ฑ์ค ์ก์ธ์ค๊ฐ ํ์ ์๋ ๊ฒฝ์ฐ : ์ธ๋ฑ์ค ํํฐ ๋๋ ํ ์ด๋ธ ํํฐ ์กฐ๊ฑด์ผ๋ก๋ง ์ฌ์ฉ๋๋ ์ปฌ๋ผ์ ์ด๋ค ๋ฐฉ์์ ์ฌ์ฉํด๋ ๋ฌด๋ฐฉํ๋ค.
2. Static SQL ๊ตฌํ์ ์ํ ๊ธฐ๋ฒ๋ค
์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฒ์ ์กฐ๊ฑด์ ๋ฐ๋ผ SQL์ด ๋ค์ํ๊ฒ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋ Dynamic SQL์ ์ฌ์ฉํ๋ ๋์์ ์กฐ๊ฑด์ ๋น๊ต ๊ฐ์ Literal ์์๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋ก๊ฐ ๋น๋ฒํ๋ค. ํ์ํ์ง ์์ ๊ฒฝ์ฐ Dynamic SQL ์ฌ์ฉ์ ์ง์ํ๊ณ Static SQL์ ํ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค. ์๋๋ ๋ค์ํ ์ํฉ์์ Static SQL์ ๊ตฌํํ๋ ๊ธฐ๋ฒ๋ค์ด๋ค.
(1) IN-List ํญ๋ชฉ์ด ๊ฐ๋ณ์ ์ด์ง๋ง ์ต๋ ๊ฒฝ์ฐ ์๊ฐ ์ ์ ๊ฒฝ์ฐ
๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ SQL๋ก ์์ฑํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ, ์ต๋ ๊ฐ์๋งํผ ๋ฐ์ธ๋ ๋ณ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด ์๋ค.
SELECT * FROM TABLE WHERE COL IN (:A, :B, :C);
- ์
๋ ฅํ์ง ์์ ํญ๋ชฉ์๋
NULL
๊ฐ์ ์ ๋ ฅํ๋ฉด ๊ฒฐ๊ณผ ์งํฉ์์ ์๋์ผ๋ก ์ ์ธ๋๋ค. - ์ ์ฒด ์กฐํ๊ฐ ํ์ํ ๊ฒฝ์ฐ,
DECODE
๋ฌธ์ ํ์ฉํ๋ค
SELECT * FROM TABLE WHERE COL IN ( DECODE(:A, 'ALL'),'01',:A),
DECODE(:B, 'ALL'),'02',:B),
DECODE(:C, 'ALL'),'03',:C),);
(2) IN-List ํญ๋ชฉ์ด ๊ฐ๋ณ์ ์ด์ง๋ง ์ต๋ ๊ฒฝ์ฐ ์๊ฐ ๋ง์ ๊ฒฝ์ฐ
๊ฒฝ์ฐ์ ์๊ฐ ๋ง์ ์ํฉ์์๋ IN ์กฐ๊ฑด์ ์ฒ๋ฆฌํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ปฌ๋ผ๊ณผ ๋ณ์ ์์น๋ฅผ ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค. ๋ฌธ์์ด์ ์ฒ๋ฆฌํ๋ ์ค๋ผํด ๋ด๋ถ ์๊ณ ๋ฆฌ์ฆ ์ LIKE ์ฐ์ฐ์ ๋ณด๋ค INSTR ํจ์๊ฐ ๋ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด ์์ฑํ์๋ค.
:LIST := '01,02,03,....,30'
SELECT *
FROM ์ด๋ ฅ
WHERE INSTR(:LIST, CODE) > 0
AND GUBUN = :B
๋ฌธ์ ์ :
LIKE
๋INSTR
์ ์ปฌ๋ผ์ ๊ฐ๊ณตํ ํํ๋ก ์ฌ์ฉ๋๋ฏ๋ก, ์ธ๋ฑ์ค ์ก์ธ์ค ์กฐ๊ฑด์ผ๋ก ํ์ฉํ์ง ๋ชปํ๋ค.CODE
์ปฌ๋ผ์ด ์ ๋ ์ปฌ๋ผ์ธ ์ธ๋ฑ์ค์์๋ ์ธ๋ฑ์ค ํจ์จ์ด ๋จ์ด์ง ์ ์๋ค.
ํด๊ฒฐ ๋ฐฉ์:
- ์ธ๋ฑ์ค ๊ตฌ์ฑ [CODE + GUBUN]์ธ ๊ฒฝ์ฐ :
LIKE
๋INSTR
์ ์ปฌ๋ผ ์ฌ์ฉ ์, ์ ๋ ์ปฌ๋ผ์ด ๊ฐ๊ณตํ ํํ ์ด๋ฏ๋ก ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๊ฑฐ๋ Index Full Scan ์ฒ๋ฆฌํด์ผ ํ๋ฏ๋ก IN ์ฐ์ฐ์๊ฐ ๋ ์ ๋ฆฌํ๋ค. - ์ธ๋ฑ์ค ๊ตฌ์ฑ [GUBUN + CODE]์ธ ๊ฒฝ์ฐ :
- CODE ํญ๋ชฉ ๊ฐ์๊ฐ ์์์ธ ๊ฒฝ์ฐ, IN ์ฐ์ฐ์๊ฐ ์ ๋ฆฌํ๋ค.
- CODE ํญ๋ชฉ ๊ฐ์๊ฐ ๋ค์์ธ ๊ฒฝ์ฐ, ์ธ๋ฑ์ค๋ฅผ ๊ทธ๋งํผ ์ฌ๋ฌ ๋ฒ ํ์นจ ํด์ผ๋ง ํ๋ค. INSTR/ LIKE ๊ตฌ๋ฌธ์ ํตํด ์ธ๋ฑ์ค ํํฐ ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ ๋ฆฌํ ์ ์๋ค.
์ธ๋ฑ์ค ๊ตฌ์ฑ [GUBUN + CODE] ์ผ ๋, ์ธ๋ฑ์ค๋ฅผ ์ข ๋ ํจ์จ์ ์ผ๋ก ์ก์ธ์ค ํ ์ ์๋ ๋ฐฉ๋ฒ
โ Nested Loop Join ํ์ฉ :
:LIST := '01,02,03,....,30'
SELECT /*+ ORDERED USE_NL(B) */ B.*
FROM (
SELECT CODE
FROM ์ด๋ ฅ ์ฝ๋
WHERE INSTR(:LIST, CODE) > 0
) A, ์ด๋ ฅ B
ON B.CODE = A.CODE
AND B.GUBUN = :B
์ด๋ ฅ ์ฝ๋ ํ ์ด๋ธ์ Full Scan ํ๋ฉด์ NL ์กฐ์ธ ๋ฐฉ์์ผ๋ก CODE ๊ฐ์ ์ด๋ ฅ ํ ์ด๋ธ์ ๋์ ธ์ฃผ๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค๋ฅผ ์ ์์ ์ผ๋ก ์ด์ฉํ ์ ์๋ค. ๋จ, ์ด๋ ฅ ์ฝ๋ ํ ์ด๋ธ์ Full Scan ํ ๋, ๋นํจ์จ์ด ์์ด์ผ ํ๋ค.
โก SUBSTR๋ก ์ฝ๋ ์์ฑ :
:LIST := '01,02,03,....,30'
SELECT /*+ ORDERED USE_NL(B) */ B.*
FROM (
SELECT SUBSTR(:LIST, (LEVEL - 1) * 2 + 1, 2) AS CODE
FROM DUAL
CONNECT BY LEVEL <= LENGTH(:LIST) / 2
) A, ์ด๋ ฅ B
ON B.CODE = A.CODE
AND B.GUBUN = :B
ํด๋น ๋ฐฉ๋ฒ์ ๋ณ์์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ์ฌ ์ฝ๋์ฑ ํ ์ด๋ธ์ ์ธ์์ ์ผ๋ก ๋ง๋ค์ด ์ด๋ ฅ ํ ์ด๋ธ๊ณผ NL ์กฐ์ธํ๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค๋ฅผ ์ ์์ ์ผ๋ก ์ด์ฉํ ์ ์๋ค.
(3) ์ฒดํฌ ์กฐ๊ฑด์ด ๊ฐ๋ณ์ ์ธ ๊ฒฝ์ฐ
DECODE ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ์ผ๋ก ์กฐ๊ฑด์ ์ฒ๋ฆฌํ ์ ์๋ค.
SELECT COL, SUM(NUM)
FROM ์ด๋ ฅ A
WHERE DATE = :DATE
AND GUBUN = :GUBUN
AND EXISTS (
SELECT '1'
FROM ์ด๋ ฅ์ฝ๋
WHERE CODE = A.CODE
AND CHK = DECODE(:YN, 'Y', 'Y', CHK)
)
GROUP BY COL
๋ฌธ์ ์ :
- ์ง๊ณ ์กฐ๊ฑด์ด ์ ์ฒด๋ฅผ ๋์์ผ๋ก ํ์ฅ๋ ๋, ๋ถํ์ํ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ํํจ์ผ๋ก์จ ๋ธ๋ก I/O๊ฐ ์ฆ๊ฐํ ์ ์๋ค.
- ์กฐ๊ฑด์ ๋ฐ๋ผ SQL์ ๋ถ๋ฆฌํ๊ฑฐ๋ UNION ALL์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋์ ์ ํ์ผ ์ ์๋ค.
๋์:
SELECT COL, SUM(NUM)
FROM ์ด๋ ฅ A
WHERE DATE = :DATE
AND GUBUN = :GUBUN
AND EXISTS (
SELECT '1'
FROM DUAL
WHERE :YN = 'N'
UNION ALL
SELECT '1'
FROM ์ด๋ ฅ์ฝ๋
WHERE CODE = A.CODE
AND CHK = 'Y'
AND :YN = 'Y'
)
GROUP BY COL
EXISTS ์๋ธ์ฟผ๋ฆฌ๋ ์กฐ๊ฑด์ ๋ถํฉํ๋ ์ฒซ ๋ฒ์งธ ๋ ์ฝ๋๋ฅผ ์ฐพ์ผ๋ฉด ์ฆ์ true๋ฅผ ๋ฐํํ๊ณ ์คํ์ ์ข
๋ฃํ๋ค. ํนํ 10g ์ดํ๋ถํฐ๋ DUAL
ํ
์ด๋ธ์ด FAST DUAL ๋ฐฉ์์ผ๋ก ์ต์ ํ๋์๊ธฐ ๋๋ฌธ์ ๋ธ๋ก I/O๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
9i์์๋ DUAL ํ ์ด๋ธ์ Full Scan ๋ฐฉ์์ผ๋ก ์ฝ๊ฒ ๋๋ฏ๋ก, ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ์ ์ด ๋ฐ์ํ ์ ์๋ค. ํํฐ ์บ์ฑ ํจ๊ณผ๊ฐ ์์ง๋ง, ์ต์ DATE, GUBUN ์กฐ๊ฑด ๊ฒฐ๊ณผ ๊ฑด์์ ๋ฐ๋ผ DUAL ํ ์ด๋ธ์ ๋ฐ๋ณต์ ์ผ๋ก ์ฝ์ด์ผ ํ๋ค. ๋ฐ๋ณต์ ์ผ๋ก ์ฝ๋ ๊ณผ์ ์์ ์ธ๊ทธ๋จผํธ ํค๋ ํฌํจ 2~4๊ฐ ๋ธ๋ก I/O๊ฐ ์ถ๊ฐ๋ก ๋ฐ์ํ ์ ์๋ค.
(4) SELECT-LIST๊ฐ ๋์ ์ผ๋ก ๋ฐ๋๋ ๊ฒฝ์ฐ
DECODE๋ CASE ํจ์๋ฅผ ํ์ฉํ์ฌ SELECT-LIST๋ฅผ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
DECODE(:GUBUN, '01', SUM(QTY), AVG(AMT)) AS NUM
๋ฌธ์ ์ : ์ง๊ณ ํจ์ ๋ด๋ถ์ DECODE๋ CASE ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด, ๋ฐ๋ณต ์ํ๋์ด ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค.
SUM(DECODE(:GUBUN, '01', QTY, AMT)) AS NUM
(5) ์ฐ์ฐ์๊ฐ ๋ฐ๋๋ ๊ฒฝ์ฐ
์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ๋ผ <, >, >=, <=, = ์ ๊ฐ์ ์ฐ์ฐ์๊ฐ ๋ฌ๋ผ์ง๋ ๊ฒฝ์ฐ์๋ Dynamic SQL์ ์ฌ์ฉํ ์๋ฐ์ ์๋ค. ๊ทธ๋ฌ๋. Static SQL๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด BETWENN ๊ตฌ๋ฌธ์ ํ์ฉํ ์ ์๋ค.
SELECT *
FROM TABLE
WHERE COL BETWEEN :START_VAL AND :END_VAL;
์กฐ๊ฑด์ ๋ฐ๋ผ :START_VAL
๊ณผ :END_VAL
์ ์ ์ ํ ๊ฐ์ ๋ฐ์ธ๋ฉํ์ฌ ์ฐ์ฐ์๋ฅผ ๋์ฒดํ ์ ์๋ค.
Reference
'DB > SQLP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SQLP] 2-1. ์ธ๋ฑ์ค ๊ตฌ์กฐ (0) | 2025.02.22 |
---|---|
[SQLP] 1-5. I/O ๋ฉ์ปค๋์ฆ (0) | 2025.02.11 |
[SQLP] 1-3. SQL ๊ณต์ ๋ฐ ์ฌ์ฌ์ฉ (0) | 2025.02.09 |
[SQLP] 1-2. SQL ํ์ฑ๊ณผ ์ต์ ํ (0) | 2025.02.09 |
[SQLP] 1-1. Oracle ์ํคํ ์ฒ (0) | 2025.02.09 |