본문 바로가기

DATA BASE

값초기화(NULL하고 다른 거 차이), NVL, VIEW, 인덱스

1. Null = " " 객체 초기화 / 객체를 주소를 남긴다.  point 남긴다.

2. " " (String) 객체 자료형

3. ' ' (char) Primitive

4. 0 (정수형 int) Primitive

 

0.0f (float) Primitive

0.0 (double) Primitive

 

객체의 쓰레기 값은 주소

int의 쓰레기 값은 범위 벗어난 값들어있는거

아무 것도 안담아놔도 쓰레기 값

 

DB에서 null이랑 " "이랑 다름.

 

NVL : null값 치환해줌

 

VIEW 만들어야 하는 이유 :

1. 외부 공개하기 꺼리는 내용(컬럼)은 안보여주려고

2. TUPLE 있는 갯수대로 다 보여 주지 않을 수 도 있음. -> 분산처리 할수 있으니까 SELECT 하는 성능 좋아짐. 

 

VIEW는 수정할 때 ALTER 쓰지 않아요!! CREATE OR REPLACE

 

 

인덱스

 

인덱스 쓰는 이유 : 조회속도 향상 (SELECT할 때)

 

쓰면 좋지만 취약점 알아보자

DML에 취약 (INSERT, UPDATE, DELETE) 

만약 INSERT뭐라도 해서 중간에 들어가고 뒤로 주루룩 밀려야 하면 정렬을 다시 해야해서 작업이 많아서..안좋으니까 INSERT를 많이 해야할 것 같으면 인덱스 별로! UPDATE도 마찬가지 

하지만! DELETE는 괜찮아요. 그 인덱스 자리 비워둠. 그러니까 정렬하지 않아서 속도상관 없다.

 

인덱스 생성

CREATE UNIQUE INDEX idx_dept2_dname
ON dept2(dname);

 

인덱스 위에서 DNAME에 인덱스준거 DNAME값 중복으로 INSESRT해보면 안될테니가 한번 해보자
인덱스는 유니크 하니까

INSERT INTO DEPT2
VALUES(9100, 'TEMP01', 1006, 'Seoul Branch');

NON-UNIQUE INDEX 

CREATE INDEX IDX_DEPT2_AREA
ON DEPT2(AREA);

FUNCTION BASED INDEX(함수기반 인덱스)

CREATE INDEX IDX_PROF_PAY_FBI
ON PROFESSOR(PAY+1000);

 

DESCENDING INDEX

CREATE INDEX INDEX_PROF_PAY
ON PROFESSOR(PAY DESC);

결합 인덱스(Composite INDEX)

SELECT ENAME, SAL
FROM EMP
WHERE ENAME = 'SMITH'
AND DEPTNO = 20;

 

CREATE INDEX IDX_EMP_COMP
ON EMP(ENAME, DEPTNO);

 

BITMAP

 

--BITMAP INDEX
CREATE BITMAP INDEX IDX_EMP_컬러명(데이터가 이거 아니면 저거일 때)_BIT
ON EMP(이 컬럼명);

 

 

인덱스 조회

 

SELECT TABLE_NAME, COLUMN_NAME, INDEX_NAME
FROM USER_IND_COLUMNS
WHERE TABLE_NAME = 'EMP2';

SELECT TABLE_NAME, INDEX_NAME
FROM USER_INDEXES
WHERE TABLE_NAME = 'DEPT2';

 

인덱스 모니터링

: 써는지 확인해보려고.

 

--인덱스 사용 여부 모니터링 하기 ...뭔가 안됨..
--모니터링 시작
ALTER INDEX IDX_EMP_ENAME MONITORING USAGE;
--모니터링 중단
ALTER INDEX IDX_EMP_ENAME NOMONITORING USAGE;
--사용 유무 확인
SELECT INDEX_NAME_USED
FROM V$OBJECT_USAGE
WHERE INDEX_NAME = 'IDX_EMP_ENAME';

 

인덱스 재구성(REBUILD) : DELETE해서 비워둔 인덱스 번호를 다시 정렬해서 매꾸는 것./ 사용자들 사용 못하게 해놓고 함. 

invisible index : 선능평가시 

 

--INDEX REBUILD하기
CREATE INDEX IDX_EMP_SAL ON EMP(SAL);
--INVISIBLE INDEX...잘 모르겠음
SELECT TABLE_NAME, INDEX_NAME, VISIBILITY
FROM USER_INDEXES
WHERE TABLE_NAME = 'EMP';

ALTER INDEX IDX_EMP_SAL INVISIBLE;

SELECT TABLE_NAME, INDEX_NAME, VISIBILITY
FROM USER_INDEXES
WHERE TABLE_NAME = 'EMP';

--다시 상태를 VISIBLE로 변경해서 자동으로 사용하게 만들기????
ALTER INDEX IDX_EMP_SAL VISIBLE;

SELECT TABLE_NAME, INDEX_NAME, VISIBLE
FROM USER_INDEXES
WHERE TABLE_NAME ='EMP';

 

 

 

 

ORDER BY 최대한 사용 하지 말기 어쩔 수 없이 써야할 수 있지만...

그럼 정렬하기 위해서는 인덱스 사용해서 정렬!!

 

SQL힌트 구문에서 해당 인덱스를 수동으로 사용하게 지정하기....????

ALTER INDEX IDX_EMP_SAL VISIBLE;

 

SELECT TABLE_NAME, INDEX_NAME, VISIBLE
FROM USER_INDEXES
WHERE TABLE_NAME ='EMP';

 

오름차순

select /* +index (emp idx_emp_sal)*/ ename

from emp

where ename >'0';

 

ROWID

SELECT ROWID, EMPNO, ENAME
FROM EMP
WHERE EMPNO=7902;

 

 

'DATA BASE' 카테고리의 다른 글

20200507 / DELETE TRUNCATE DROP 차이점 비교  (0) 2020.05.07
자바 - DB 연동  (0) 2020.05.07
웹서버와 DB연동 하기 (조인)  (0) 2020.04.29
무결성 정확성 일관성  (0) 2020.04.27
JSP(JavaServer Pages) 맛보기  (0) 2020.04.23