๐โโ๏ธ ๋ทฐ(VIEW)๋,
SELECT ์ฟผ๋ฆฌ๋ฌธ์ ์ ์ฅํ ๊ฐ์ฒด๋ก ์ค์ง์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์์ง์์ ๋ ผ๋ฆฌ์ ์ธ ํ ์ด๋ธ์ด๋ ํ ์ด๋ธ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ
- ๋ณต์กํ SELCET ๋ฌธ์ ๋ค์ ์์ฑํ ํ์๊ฐ ์์
- ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ์จ๊ธธ ์ ์์
๐โ ์ ๊น ! ๋ฐ์ดํฐ ๋์ ๋๋ฆฌ(Date Dictionary)๋ ์์๋ด ์๋ค !
์์์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ค์ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ์์คํ ํ ์ด๋ธ
- ์ฌ์ฉ์๊ฐ ํ ์ด๋ธ์ ์์ฑํ๊ฑฐ๋, ์ฌ์ฉ์๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฑ์ ์์ ์ ํ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ์ ์ํด ์๋์ผ๋ก ๊ฐฑ์ ๋๋ ํ ์ด๋ธ๋ก ์ฌ์ฉ์๋ ๋ฐ์ดํฐ ๋์ ๋๋ฆฌ ๋ด์ฉ์ ์ง์ ์์ ํ๊ฑฐ๋ ์ญ์ ํ ์ ์์
- ์๋ณธ ํ ์ด๋ธ์ ์ปค์คํฐ๋ง์ด์ง ํด์ ๋ณด์ฌ์ฃผ๋ ์๋ณธ ํ ์ด๋ธ์ ๊ฐ์ ํ ์ด๋ธ(VIEW)
- ๋ทฐ์ ๋ํ ์ ๋ณด๋ฅผ ํ์ธํ๋ ๋ฐ์ดํฐ ๋์ ๋๋ฆฌ
USER_VIEWS
SELECT UV.* FROM USER_VIEWS UV;
GRANT CREATE VIEW TO C##EMPLOYEE;
>>> ๋ฐ๋์ system๊ณ์ ์ผ๋ก ์คํ
>>> 'Grant์(๋ฅผ) ์ฑ๊ณตํ์ต๋๋ค.' ์ถ๋ ฅ
CREATE [OR REPLACE] VIEW ๋ทฐ์ด๋ฆ AS ์๋ธ์ฟผ๋ฆฌ;
CREATE OR REPLACE VIEW V_RESULT_EMP -- OR REPLACE : ์์ผ๋ฉด ์ด๊ฒ์ผ๋ก ๋ฎ์ด์ฐ๊ธฐ
AS
SELECT
EMP_ID
, EMP_NAME
, JOB_NAME
, DEPT_TITLE
, LOCAL_NAME
FROM EMPLOYEE E
LEFT JOIN JOB J ON (E.JOB_CODE = J.JOB_CODE)
LEFT JOIN DEPARTMENT D ON (E.DEPT_CODE = D.DEPT_ID)
LEFT JOIN LOCATION L ON (D.LOCATION_ID = L.LOCAL_CODE);
SELECT
V.*
FROM V_RESULT_EMP V
WHERE V.EMP_ID = '205';
CREATE OR REPLACE VIEW ๋ทฐ๋ช
(๋ทฐ์ปฌ๋ผ๋ณ์นญ) AS ์๋ธ์ฟผ๋ฆฌ
CREATE OR REPLACE VIEW V_EMP
(
์ฌ๋ฒ -- EMP_ID์ ๋ณ์นญ๋ถ์ฌ
, ์ด๋ฆ
, ๋ถ์
)
AS
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
FROM EMPLOYEE;
SELECT
V.*
FROM V_EMP V;
DROP VIEW ๋ทฐ๋ช
DROP VIEW V_EMP;
>>> ์ด ๋๋ '๋ฐ๋์ ๋ณ์นญ์ ๋ถ์ฌํด์ ์์ฑ'ํด์ผํจ
CREATE OR REPLACE VIEW V_EMP_JOB
(
์ฌ๋ฒ -- ๋ทฐ์ ๋ณ์นญ ๋ถ์ด๊ธฐ
, ์ด๋ฆ
, ์ง๊ธ
, ์ฑ๋ณ
, ๊ทผ๋ฌด๋
์
)
AS
SELECT
EMP_ID
, EMP_NAME
, JOB_NAME
, DECODE(SUBSTR(EMP_NO, 8, 1), 1, '๋จ', '์ฌ')
>>> ํจ์์์ ๋ณ์นญ ํ์!
>>> ์์ผ๋ฉด, '์ด ์์ ์ด์ ๋ณ๋ช
๊ณผ ํจ๊ป ์ง์ ํด์ผ ํฉ๋๋ค' ์ค๋ฅ
, EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM HIRE_DATE)
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);
SELECT
V.*
FROM V_EMP_JOB V; -- ๋ณ์นญ์ด ๋ถ์ฌ๋ ๋ทฐ ํ์ธ ๊ฐ๋ฅ
UPDATE
EMPLOYEE
SET EMP_NAME = 'ํ๊ธธ๋'
WHERE EMP_ID = '200';
SELECT
E.*
FROM EMPLOYEE E
WHERE EMP_ID = '200'; -- EMP_NAME์ด ํ๊ธธ๋์ผ๋ก ๋ณ๊ฒฝ๋จ
SELECT
V.*
FROM V_RESULT_EMP V
WHERE EMP_ID = '200'; -- ํ๊ธธ๋์ผ๋ก ๋ณ๊ฒฝ๋์ด์์
INSERT
INTO V_JOB
(
JOB_CODE, JOB_NAME
)
VALUES
(
'J8', '์ธํด'
);
SELECT
V.*
FROM V_JOB V; -- 'J8', '์ธํด' ๊ฐ ์กฐํ๊ฐ๋ฅ
SELECT
J.*
FROM JOB J; -- ๋ฒ ์ด์ค ํ
์ด๋ธ์์๋ 'J8', '์ธํด' ๊ฐ ์กฐํ๊ฐ๋ฅ
UPDATE
V_JOB V
SET JOB_NAME = '์๋ฐ'
WHERE JOB_CODE = 'J8';
SELECT
V.*
FROM V_JOB V; -- 'J8', '์๋ฐ'๋ก ๋ณ๊ฒฝ๋ ๊ฐ ์กฐํ๊ฐ๋ฅ
SELECT
J.*
FROM JOB J; -- ๋ฒ ์ด์ค ํ
์ด๋ธ์์๋ 'J8', '์๋ฐ'๋ก ๋ณ๊ฒฝ๋ ๊ฐ ์กฐํ๊ฐ๋ฅ
DELETE
FROM V_JOB
WHERE JOB_CODE = 'J8';
-- ์ญ์ ํ ํ ์กฐํ ์, ๋ทฐ์ ๋ฒ ์ด์ค ํ
์ด๋ธ์์ ๋ชจ๋ ์ญ์ ๋ ๊ฒ ํ์ธ ๊ฐ๋ฅ
๋ทฐ๋ฅผ ํตํด ๋ฒ ์ด์คํ ์ด๋ธ ์ฝ์ /๋ณ๊ฒฝ/์ญ์ ๊ฐ๋ฅํ ๊ฒ ํ์ธํ์ผ๋, ๋ฐ๋ฉด์ ์กฐ์์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ๊ฐ ๋ง์
๐ VIEW ์กฐ์์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ
[1] ๋ทฐ ์ ์์ ํฌํจ๋์ง ์์ ์ปฌ๋ผ์ ์กฐ์ํ๋ ๊ฒฝ์ฐ
[2] ๋ทฐ์ ํฌํจ๋์ง ์์ ์ปฌ๋ผ ์ค์, ๋ฒ ์ด์ค๊ฐ ๋๋ ํ
์ด๋ธ ์ปฌ๋ผ์ด NOT NULL ์ ์ฝ์กฐ๊ฑด์ด ์ง์ ๋ ๊ฒฝ์ฐ
[3] ์ฐ์ ํํ์์ผ๋ก ์ ์ ๋ ๊ฒฝ์ฐ
[4] JOIN์ ์ด์ฉํด ์ฌ๋ฌ ํ
์ด๋ธ์ ์ฐ๊ฒฐํ ๊ฒฝ์ฐ
[5] DISTINCT๋ฅผ ํฌํจํ ๊ฒฝ์ฐ
[6] ๊ทธ๋ฃนํจ์๋ GROUP BY์ ์ ํฌํจํ ๊ฒฝ์ฐ
OR REPLACE
: ๊ธฐ์กด์ ๋์ผํ ๋ทฐ ์ด๋ฆ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ ๋ฎ์ด์ฐ๊ณ , ์กด์ฌํ์ง ์์ผ๋ฉด ์๋ก ์์ฑํ๋ ์ต์
FORCE(๊ฐ์ ์คํ)
: ์๋ธ ์ฟผ๋ฆฌ์ ์ฌ์ฉ ๋ ํ
์ด๋ธ์ด ์กด์ฌํ์ง ์์๋ ๋ทฐ ์์ฑํ๋ ์ต์
CREATE OR REPLACE FORCE VIEW V_EMP
AS
SELECT TCODE
, TNAME
, TCONTENT
FROM TT;
>>> FORCE๋ก ์ธํด ๊ฐ์ ๋ก ๋ทฐ ์์ฑ ๋ฐ '๊ฒฝ๊ณ : ์ปดํ์ผ ์ค๋ฅ์ ํจ๊ป ๋ทฐ๊ฐ ์์ฑ๋์์ต๋๋ค.' ์ถ๋ ฅ
NOFORCE
: ์๋ธ์ฟผ๋ฆฌ์ ํ
์ด๋ธ์ด ์กด์ฌํด์ผ๋ง ๋ทฐ๋ฅผ ์์ฑํ๋ ์ต์
(๊ธฐ๋ณธ๊ฐ)
CREATE OR REPLACE NOFORCE VIEW V_EMP >>> ๊ธฐ๋ณธ๊ฐ์ด๋ฏ๋ก NOFORCE๋ฅผ ๋ช
์ํ์ง์์๋๋จ
AS
SELECT TCODE
, TNAME
, TCONTENT
FROM TT;
>>> 'ํ
์ด๋ธ ๋๋ ๋ทฐ๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค' ์ค๋ฅ
WITH CHECK OPTION
: ์กฐ๊ฑด์ ์ ์ฌ์ฉ ๋ ์ปฌ๋ผ์ ๊ฐ์ ์์ ํ์ง ๋ชป ํ๊ฒ ํ๋ ์ต์
CREATE OR REPLACE VIEW V_EMP2
AS
SELECT
E.*
FROM EMPLOYEE E
WHERE MANAGER_ID = '200'
>>> ์ด ๋ถ๋ถ์ ์ค์ํ ๋ถ๋ถ์ด๋ฏ๋ก ๋ทฐ๋ฅผ ํตํด ์์ ํ์ง ๋ชป ํ๊ฒ ํจ
WITH CHECK OPTION;
UPDATE
V_EMP2
SET MANAGER_ID = '900'
WHERE MANAGER_ID = '200'; -- '๋ทฐ์ WITH CHECK OPTION์ ์กฐ๊ฑด์ ์๋ฐฐ ๋ฉ๋๋ค' ์ค๋ฅ
WITH READ ONLY
: DML ์ํ์ด ๋ถ๊ฐ๋ฅํ๊ฒ ํ๋ ์ต์
CREATE OR REPLACE VIEW V_DEPT
AS
SELECT
D.*
FROM DEPARTMENT D
WITH READ ONLY;
>>> ์ฝ๊ธฐ ์ ์ฉ์ด๋ฏ๋ก ์ฝ์
/์์ /์ญ์ ๋ถ๊ฐ๋ฅ
DELETE
FROM V_DEPT; -- '์ฝ๊ธฐ ์ ์ฉ ๋ทฐ์์๋ DML ์์
์ ์ํํ ์ ์์ต๋๋ค.' ์ค๋ฅ
๐โโ๏ธ ์ํ์ค(SEQUENCE)๋,
์๋ ๋ฒํธ ๋ฐ์๊ธฐ ์ญํ ์ ํ๋ ๊ฐ์ฒด
- ์์ฐจ์ ์ผ๋ก ์ ์ ๊ฐ์ ์๋์ผ๋ก ์์ฑ
CREATE SEQUENCE ์ํ์ค๋ช
[INCREMENT BY ์ซ์] -- ๋ค์ ๊ฐ์ ๋ํ ์ฆ๊ฐ์น, ์๋ตํ๋ฉด ์๋ 1์ด ๊ธฐ๋ณธ
[START WITH ์ซ์] -- ์ฒ์ ๋ฐ์์ํฌ ๊ฐ ์ง์ , ์๋ตํ๋ฉด ์๋ 1์ด ๊ธฐ๋ณธ
[MAXVALUE ์ซ์ or NOMAXVALUE] -- ๋ฐ์์ํฌ ์ต๋ ๊ฐ ์ง์ (10์ 27์น)
[MINVALUE ์ซ์ or NOMINVALUE] -- ๋ฐ์์ํฌ ์ต์ ๊ฐ ์ง์ (-10์ 26์น)
[CYCLE or NOCYCLE] -- ๊ฐ ์ํ ์ฌ๋ถ
[CACHE ๋ฐ์ดํธํฌ๊ธฐ or NOCACHE] --์บ์ฌ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ณธ ๊ฐ์ 20๋ฐ์ดํธ, ์ต์ 2๋ฐ์ดํธ
CREATE SEQUENCE SEQ_EMPID
START WITH 300
INCREMENT BY 5
MAXVALUE 310
NOCYCLE
NOCACHE;
์ํ์ค๋ช
.CURRVAL
: ํด๋น ์ํ์ค๊ฐ ๊ฐ์ง๊ณ ์๋ CURRENT VALUE(ํ์ฌ ๊ฐ)
์ํ์ค๋ช
.NEXTVAL
: ํด๋น ์ํ์ค๊ฐ ๊ฐ์ง NEXT VALUE(๋ค์ ๊ฐ) ๋ฆฌํด. NEXTVAL์ 1ํ ์ํํด์ผ CURRVAL๋ฅผ ์ ์ ์์
SELECT SEQ_EMPID.CURRVAL FROM DUAL;
>>> CURRVAL ๋ฐ๋ก ์คํ ์,
>>> '์ํ์ค SEQ_EMPID.CURRVAL์ ์ด ์ธ์
์์๋ ์ ์ ๋์ด ์์ง ์์ต๋๋ค' ์ค๋ฅ
SELECT SEQ_EMPID.NEXTVAL FROM DUAL; -- 300
SELECT SEQ_EMPID.CURRVAL FROM DUAL; -- 300
SELECT SEQ_EMPID.NEXTVAL FROM DUAL; -- 305
SELECT SEQ_EMPID.CURRVAL FROM DUAL; -- 305
SELECT SEQ_EMPID.NEXTVAL FROM DUAL; -- 310
SELECT SEQ_EMPID.CURRVAL FROM DUAL; -- 310
SELECT SEQ_EMPID.NEXTVAL FROM DUAL;
>>> MAXVALUE๋ฅผ ๋์ด๊ฐ๋ฉด ์๋ฌ ๋ฐ์
>>> '์ํ์ค SEQ_EMPID.NEXTVAL exceeds MAXVALUE์ ์ฌ๋ก๋ก ๋ ์ ์์ต๋๋ค'
USER_SEQUENCES
SELECT * FROM USER_SEQUENCES;
ALTER SEQUENCE ์ํ์ค๋ช
...
ALTER SEQUENCE SEQ_EMPID
INCREMENT BY 10
MAXVALUE 400
NOCYCLE
NOCACHE;
>>> START WITH ๊ฐ์ '๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ'์ด๋ฏ๋ก,
>>> ํด๋น ๊ฐ์ ๋ณ๊ฒฝํ๋ ค๋ฉด DROP์ผ๋ก ์ญ์ ํ ๋ค์ ์์ฑ
SELECT SEQ_EMPID.NEXTVAL FROM DUAL; -- 320
SELECT SEQ_EMPID.CURRVAL FROM DUAL; -- 320
SELECT SEQ_EMPID.NEXTVAL FROM DUAL; -- 330
SELECT SEQ_EMPID.CURRVAL FROM DUAL; -- 330
>>> ์ํ์ค๊ฐ ๋ณ๊ฒฝ๋์ด 10์ฉ ์ฆ๊ฐํ๊ณ ์ต๋๊ฐ์ด 400๊น์ง ๋์ด๋ ์ถ๊ฐ๊ฐ ์ง์
DROP SEQUENCE ์ํ์ค๋ช
;
DROP SEQUENCE SEQ_EMPID;
SEQUENCE๋ 'ํ ์ด๋ธ์ ์๋ณ์(PK)' ๋ก ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ (๋๋ฒ๋ง)
CREATE SEQUENCE SEQ_EID
START WITH 300
INCREMENT BY 1
MAXVALUE 10000
NOCYCLE
NOCACHE;
INSERT
INTO EMPLOYEE
-- (๋ชจ๋ ์ปฌ๋ผ๋ช
)
-- => ์๋ VALUES์์ ๋ชจ๋ ์ปฌ๋ผ์ ๋ํ ๊ฐ์ ์์๋๋ก ์
๋ ฅํ์์ผ๋ฏ๋ก ๋ช
์ ๋ถํ์
VALUES
(
SEQ_EID.NEXTVAL, 'ํ๊ธธ๋', '660101-1111111', 'hong_gd@greedy.com', '01012345678',
'D2', 'J7', 'S1', 5000000, 0.1, 200, SYSDATE, NULL, DEFAULT
);
>>> 300๋ถํฐ ์์ํ๊ณ 1์ฉ ์ฆ๊ฐํ๋ SEQ_EID.NEXTVAL๋ฅผ EMP_ID ์ปฌ๋ผ์ ๊ฐ์ผ๋ก ๋ฃ์ด
>>> ์ถ๊ฐํ ๋๋ง๋ค 300, 301, 302,...๋ก ์ถ๊ฐ๋๊ฒ๋ ์ํ์ค ์ฝ์
SELECT
E.*
FROM EMPLOYEE E;
๐โโ๏ธ ์ธ๋ฑ์ค(INDEX)๋,
SQL ๋ช ๋ น๋ฌธ์ ๊ฒ์์ฒ๋ฆฌ ์๋๋ฅผ ํฅ์์ํค๊ธฐ ์ํด ์ปฌ๋ฌ์ ๋ํด ์์ฑํ๋ ๊ฐ์ฒด
- ํ๋ ๋์คํฌ์ ์ด๋ค ์์น์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง ์ฃผ์๋ก์ผ๋ก ์ธ๋ฑ์ค๋ DATA์ ROWID๋ก ๊ตฌ์ฑ
- ์ธ๋ฑ์ค์ ๋ด๋ถ ๊ตฌ์กฐ๋ ์ด์ง ํธ๋ฆฌ ํ์์ผ๋ก ๊ตฌ์ฑ (๋ ธ๋๋ค์ด ์ ๋ ฌ๋ ํํ)
- ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ ์๊ฐ์ด ํ์ํ๋ฉฐ ์ธ๋ฑ์ค๋ฅผ ์ํ ์ถ๊ฐ ์ ์ฅ ๊ณต๊ฐ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ํญ์ ์ฅ์ ๋ง ์๋ ๊ฒ์ ์๋
- ์ธ๋ฑ์ค๊ฐ ์์ฑ ๋ ์ปฌ๋ผ์์ DML ์์ ์ด ๋น๋ฒํ ๊ฒฝ์ฐ ์ฒ๋ฆฌ ์๋๊ฐ ๋๋ ค์ง
๐โ ์ธ๋ฑ์ค์ ์ฅ์ & ๋จ์
- ์ฅ์
- ๊ฒ์ ์๋ ํฅ์
- ์์คํ ๋ถํ๋ฅผ ์ค์ฌ(FULL SCAN์ ํ์ง ์์ผ๋ฏ๋ก) ์์คํ ์ฑ๋ฅ ํฅ์
- ๋จ์
- ์ถ๊ฐ ์ ์ฅ ๊ณต๊ฐ, ์์ฑ ์๊ฐ ํ์
- DML์ด ๋น๋ฒํ๋ฉด REBUILD(ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ค์ ๋ง๋ฌ) ์์ ์ ์ฃผ๊ธฐ์ ์ผ๋ก ํด์ผํ๋ฉฐ REBUILD ํ์ง ์์ผ๋ฉด ์คํ๋ ค ์ฑ๋ฅ ์ ํ
๐ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ ์ ์ฒด ๋ก์ฐ์ 15% ์ดํ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋ ์ธ๋ฑ์ค๋ฅผ ์์ฑํด์ ์ฌ์ฉ (์ ์ ๋ฐ์ดํฐ๋ฅผ FULL SCANํ๋ฉด ๋นํจ์จ์ ์ด๋ฏ๋ก)
๐โ ์ ๊น ! ROWID์ ๊ตฌ์กฐ๋ ์ด๋ป๊ฒ ๋๋์?
์ค๋ธ์ ํธ ๋ฒํธ, ์๋ํ์ผ ๋ฒํธ, ๋ธ๋ก ๋ฒํธ, ๋ฐ์ดํฐ ๋ฒํธ (๋ฌผ๋ฆฌ์ ์ธ ID๊ฐ)
SELECT ROWID , EMP_ID , EMP_NAME FROM EMPLOYEE;
๐ INDEX์ ์ข ๋ฅ
[1] ๊ณ ์ ์ธ๋ฑ์ค(UNIQUE INDEX)
[2] ๋น๊ณ ์ ์ธ๋ฑ์ค(NONUNIQUE INDEX)
[3] ๋จ์ผ ์ธ๋ฑ์ค(SINGLE INDEX)
[4] ๊ฒฐํฉ ์ธ๋ฑ์ค(COMPOSITE INDEX)
[5] ํจ์ ๊ธฐ๋ฐ ์ธ๋ฑ์ค(FUNTION BASED INDEX)
๐โ ์ ๊น ! ์ธ๋ฑ์ค ํํธ ๋จผ์ ์๊ณ ๊ฐ์๋ค !
์ผ๋ฐ์ ์ผ๋ก๋ ์ตํฐ๋ง์ด์ ๊ฐ ์ ์ ํ ์ธ๋ฑ์ค๋ฅผ ํ๊ฑฐ๋ ํ ์ค์บ๋์ ํด์ ๋น์ฉ์ด ์ ๊ฒ ๋๋ ํจ์จ์ ์ธ ๋ฐฉ์์ ์ ํ. ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ์ํ๋ ํ ์ด๋ธ์ ์๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๊ตฌ๋ฌธ(ํํธ)๋ฅผ ํตํด์ ์ ํํ ์๋ ์์
- SELECT์ ์ฒซ ์ค์ ํํธ ์ฃผ์
/* + ๋ด์ฉ */
์ ์์ฑํ์ฌ ์ ์ ํ ์ธ๋ฑ์ค๋ฅผ ๋ถ์ฌํ ์ ์์
- ๊ณ ์ ์ธ๋ฑ์ค๋ก ์์ฑ ๋ ์ปฌ๋ผ์๋ ์ค๋ณต ๊ฐ์ด ํฌํจ๋ ์ ์์ผ๋ฉฐ PK, UNIQUE ์ ์ฝ ์กฐ๊ฑด์ ์์ฑํ๋ฉด ์๋์ผ๋ก ํด๋น ์ปฌ๋ผ์ UNIQUE INDEX๊ฐ ์์ฑ.
- ํด๋น ์ปฌ๋ผ์ผ๋ก ACCESS ํ๋ ๊ฒฝ์ฐ ์ฑ๋ฅ ํฅ์ ํจ๊ณผ
- ๋จ์ผ ์ธ๋ฑ์ค๋ผ๊ณ ๋ ๋ณผ ์ ์์
SELECT /*+ INDEX(E ์ํฐํฐ1_PK)*/ >>> ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด์ ์กฐํํด๋ฌ๋ผ๋ ํํธ
E.*
FROM EMPLOYEE E;
>>> ์กฐํํ์ ๋, ๋ด๋ถ์ ์ผ๋ก ๊ฐ์ฅ ๋น ๋ฅธ ์กฐํ๋ฒ์ ์ฐพ์
>>> (์ธ๋ฑ์ค๋ก ์ฐพ๊ฑฐ๋ ํ ์ค์บ์ผ๋ก ์ฐพ๊ฑฐ๋)
SELECT /*+ INDEX_DESC(E ์ํฐํฐ1_PK)*/ >>> ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด์ ์ญ๋ฐฉํฅ์ผ๋ก ์กฐํํด๋ฌ๋ผ๋ ํํธ
E.*
FROM EMPLOYEE E;
CREATE UNIQUE INDEX ์ธ๋ฑ์ค๋ช
ON ํ
์ด๋ธ๋ช
(์ปฌ๋ผ๋ช
);
CREATE UNIQUE INDEX IDX_EMP_NO
ON EMPLOYEE(EMP_NO);
CREATE UNIQUE INDEX IDX_DEPT_CODE
ON EMPLOYEE(DEPT_CODE);
>>> DEPT_CODE์ ๊ฐ ์ปฌ๋ผ์ ๊ฐ์ด ์ฌ๋ฌ๊ฐ ์์.
>>> '์ค๋ณต ํค๊ฐ ์์ต๋๋ค. ์ ์ผํ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ ์ ์์ต๋๋ค' ์ค๋ฅ
- WHERE์ ์์ ๋น๋ฒํ๊ฒ ์ฌ์ฉ๋๋ ์ผ๋ฐ ์ปฌ๋ผ์ ๋์์ผ๋ก ์์ฑ
- ๋จ์ผ ์ธ๋ฑ์ค๋ผ๊ณ ๋ ๋ณผ ์ ์์
CREATE INDEX IDX_DEPT_CODE >>> UNIQUE ํค์๋๋ง ๋นผ๋ฉด NONUNIQUE INDEX ์์ฑ ๊ฐ๋ฅ
ON EMPLOYEE(DEPT_CODE);
>>> ์ค๋ณต๊ฐ์ด ์๋ DEPT_CODE ์ปฌ๋ผ์ NONUNIQUE ์ธ๋ฑ์ค ์์ฑ
๊ฒฐํฉ ์ธ๋ฑ์ค๋ ์ค๋ณต ๊ฐ์ด ๋ฎ์ ๊ฐ์ด ๋จผ์ ์ค๋ ๊ฒ์ด ๊ฒ์ ์๋๋ฅผ ํฅ์ ์ํด
CREATE INDEX IDX_DEPT
ON DEPARTMENT(DEPT_ID, DEPT_TITLE); >>> ์ค๋ณต ๊ฐ์ด ๋ ๋ฎ์ DEPT_ID ์ปฌ๋ผ ๋จผ์ ๋ช
์
SELECT /*+ INDEX_DESC(D IDX_DEPT)*/
D.DEPT_ID
FROM DEPARTMENT D
WHERE D.DEPT_TITLE > '0' >>> ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ค์ด ์ ๋ ฌ๋์์ผ๋ฉด ํ์ ๋ ์ฌ์ฉํ๋ ์กฐ๊ฑด
>>> (๋๊ตฐ๊ฐ๋ฅผ ๊ฑฐ๋ฅผ ๋ ์ฐ๋ ์กฐ๊ฑด X)
AND D.DEPT_ID > '0';
- SELECT์ ์ด๋ WHERE์ ์์ ์ฐ์ ๊ณ์ฐ์์ด๋ ํจ์๊ฐ ์ฌ์ฉ๋ ๊ฒฝ์ฐ, ๊ณ์ฐ์ ํฌํจ๋ ์ปฌ๋ผ์ ์ธ๋ฑ์ค์ ์ ์ฉ์ ๋ฐ์ง ์์
- ๊ณ์ฐ์์ผ๋ก ๊ฒ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค๋ฉด, ์์์ด๋ ํจ์์์ผ๋ก ์ด๋ฃจ์ด์ง ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ก ๋ง๋ค์๋ ์๋ค.
CREATE INDEX IDX_EMP_SALCALC
ON EMPLOYEE((SALARY + (SALARY * NVL(BONUS,0))) * 12);
SELECT /*+ INDEX_DESC(E IDX_EMP_SALCALC)*/
E.EMP_ID
, E.EMP_NAME
, (E.SALARY + (E.SALARY * NVL(E.BONUS,0))) * 12 ์ฐ๋ด
FROM EMPLOYEE E
WHERE (E.SALARY + (E.SALARY * NVL(E.BONUS,0))) * 12 > 1000000;