5월 31일 월요일 (15일차) - 다른객체들

@_@·2021년 5월 31일

Database

목록 보기
38/39

<목차>
ㅇ 시퀀스
ㅇ 인덱스
ㅇ 동의어




12장
ㅇ 기타 데이터베이스 객체
시퀀스
자료스크린샷
엑셀에서 숫자 나열하고 드래그하면 자동번호 생성 되듯이
중복되지 않은 고유번호 자동 생성
공유 가능한 객체야
기본 키 값을 생성하는 데 사용
지금 가진 테이블들은 눈에 보이는데
현업에서 몇십 몇백개의 행을 중복을 일일이 체크할 수 없잖아.
시퀀스 사용하면 프라이머리 키 사용할 때 편리해

조심해야 할 것은 얘는 번호야
어떤 프라이머리키는 문자,날짜야 - 이때는 시퀀스 못 써!
숫자에만 쓸 수 있어.- 고유'번호'니까

시퀀스 값을 메모리에 캐시하면 액세스 효율이 높아진다
메모리가 작업할 수 있는 작업공간
공간이 어떤식으로 사용되나면
공간을 순차적으로 쓰다가, 가장 오래된 것부터 빠져나가. 이런식으로 공간 확보

메모리 캐시 기능 :  특정 공간은 지정. 나만의 공간으로 . 밀려나지 않아.
들어오면 밀려나는 구조인데
캐시 기능을 사용하면

기본적으로 시퀀스가 20개씩 먼저 생성. 먼저 저장해두고 밀려나지 않아.

시퀀스는 이미 만들어져 있는 번호를 사용
값을 생성하는 효율성이 높아져
많이 안쓰긴 해

값을 추출하기 위한 성능은 좋아지지만
미리 확보하니까 공간이 줄어들긴 해


크리에이트 시퀀스 사용

이름은 테이블컬럼시퀀스
대부분 업무 규칙에 따라 만들어져. 보통 이렇게 사용해

인크리먼트 바이는 시퀀스 증가값
스타트위드는 첫번째 생성되는 시퀀스넘버
맥스밸류는 최대로 생성될 시퀀스넘버
디폴트로 노캐시.노사이클  (즉, 안써도 돼)

맥스 밸류에 다다르면 더이상 값을 생성하지 않아

캐시라는 옵션으로 주면 20개 먼저 만들겠다 이고. 다 쓰면 다시 ?????

사이클옵션은 신중하게 써야 해. 얘를 사이클옵션으로 쓰게 되면
맥스밸류 다다르면 다시 120부터 시작
만약 시퀀스를 프라이머리키에 사용하면 사이클옵션주면안되겠지

ㅇ실습
우리가 가진 번호와 중복되지 않기 위해 300번부터 시작
CREATE SEQUENCE dept_deptid_seq
INCREMENT BY 10
START WITH 300
MAXVALUE 9999


시퀀스 자체가 테이블처럼 값을 가지고 있는 게 아니라
그때그때 마다 요청해주면 생성되는?? 거지
값을 생성해주는 생성기야
데이터 딕셔너리에 저장되어 있어

시퀀스는 자판기야. 음료수 자판기는 그대로 있고 동전 넣고 버튼 클릭해야 자판기가 음료수를 토해내잖아

ㅇ 동전을 넣는 게 1nextval이라는 컬럼이야
시퀀스에서 값을 추출하는 역할을 해

여기서 추출된 값이 2 currval에 저장돼

커런트밸류는 혼자서는 사용할 수 없어
넥스트밸류가 실행되고 나서 사용

ㅇ 시퀀스 사용 실습
현재 디테이블 조회해보면 10번부터 270번까지 27개의 부서 있었어
이제 부서를 추가해보자
dept_deptid_seq.nextval 부서 번호 자리에 이걸 넣는 거야 - 우리가 만들었던 시퀀스에 넥스트밸류라는 기능 사용해서
300번, 310번 이렇게 직접 넣지 않고
'운영 프로그램 코드 대체'
INSERT INTO departments
VALUES (dept_deptid_seq.nextval, 'IT', 100, 1700)

/  3번 하면  행이 크리에이트 돼
300, 310, 320 번 행이 생성 됐어
시퀀스는 한 번 추출된 값을 다시 추출하지 않아. 증가된 값 추출???

현업에서도 꽤 많이 사용해. 편리하게 사용해

ㅇ 사용하다보면 공백이 발생해
시퀀스가 300번 310번 320번 추출해서 인서트 했잖아~
지금 트랜잭션 진행중이야
이걸 롤백하면?  다시 270번으로 돌아가 (300,310,320 넣은거 취소됐어)
이 때 시퀀스가 값을 다시 입력하면 몇번이 될까? 330이 되네!
그 이유는 시퀀스는 한 번 추출된 값은 더 이상 추출하지 않아서
롤백은 테이블에 저장되어 있는 ~~가 ~~된거지
시퀀스는 생성기야. 값을 저장하고 있는 게 아니라서 롤백과 전혀 상관 없어

근데 공백 발생하는 경우 많아
갭. 스크린샷?!

시퀀스는 공유 가능해서
a랑 b가 동시에 사용 가능해

테이블은 공유하지 않아. 테이블에 저장되어 있는 데이터 복사해버릴 수 있잖아 - 보안측면에서 공유 안해

시퀀스는 데이터를 가지고 있는 게 아니니까 공유 가능
자판기 모두가 같이 쓰듯이
그러다보니 사진 스크린샷

이럴 때 당황하지 말라고 알려드림

프로젝트 진행 때 시퀀스 사용하면 편리해!!


시퀀스 수정 - 객체니까 알터
알터 시퀀스
인그리먼트 바이는 : 다음 번 생성되는 시퀀스넘버에만 영향 줘
이미 추출된 거에는 영향 주지 않아

맥스밸류 :  키우는 건 언제는 가능. 줄일 때는 일부 검증
이미 사용되고 있는 번호로는 맥스밸류 줄일 수 없어
현재 추출된 시퀀스 넘버보다 큰 값으로만 줄일 수 있다

스타트위드는? 변경 불가!
왜? 첫번째 생성되는 시퀀스넘버니까. 이미 300번 이상이 생성 되버렸는데
200번으로 줄이면 중간에 300이 생겨있는거잖아
바꾸는 방법은 딱 하나 시퀀스를 삭제하고 같은 이름으로 재생성


제거는 드랍. 추출했던 값들은? 상관 없어
생성기를 없애는거니까.
추출한 값은 테이블로 권한이 넘어간거야.
이미 추출된 시퀀스 넘버들은 사라지지 않아
이게 독립성이야


ㅇ인덱스 객체
개념만 정리. 세세한거는 정보처리때 해

스크린샷
테스트라는 테이블
파싱 1검증2실행계획수립3실행

테이블이 있으면 실행 계획이라는 건 셀렉트 문장에 의해 테이블에 어떻게 접근해서 데이터를 가져올건지
테이블의 데이터 검색하는 방식 가장 기본적인게 테이블 풀스캔
테이블에 저장되어 있는 모~든 데이터를 불러들여서 ㅓ내가원하는 정보가 나올 때 까지 찾아
1900년도 100만건 2000년도 데이터 만건
우리가 만건만 조회하고 싶은데 풀스캔 하면 1900년도부터 다 뒤져
테이블 사이즈가 크면 클수록 성능 너무 떨어져

효율적으로 데이터 검색하는 방법 뭐가 있을까? => 인덱스를 만들어 냄

인덱스 : 테이블의 데이터에 검색 속도를 높이기 위해 만들어진 객체야
(=목차)
목차는 1.db개요 ---23p 이런식으로 되어 있잖아.

배열??? 인덱스는 배열의 구조로 저장 해
인덱스는 테이블이 아니라 컬럼에다가 설치해

a에 설치한다하면
디폴트로 오름차순 정렬해서 배열에 저장해
오른쪽에는 포인터를 저장해
행이 저장된 행의 주소가 로우아이디
포인터는 행의 주소정보를 저장해서 연결되어 있어 - 스크린샷

인덱스를 쓰면 인덱스 스캐너 방식 사용
인덱스를 통해 40을 찾고 포인트를 통해 해당 행으로 바로 고고

인덱스를 쓰면 검색 속도가 향상 돼
특히 범위 검색할 대 탁월한 성능
정렬되어 있으니까


그러면 테이블의 모든 컬럼에 인덱스 설치하면 검색속도 좋아지겠네? 큰일나 ~ㅋㅋ
인덱스는 셀렉트 전용이야 . 검색 전용이야
시험 볼 때
내가 물리적으로 방문해야 할 창고가 2개양
인덱스창고 거쳤다가 테이블 창고로 가는거야

고객센터 들렀다가 어디 있는지 듣고 찾아가는거야

테이블 풀스캔은 한번만 가면돼

인덱스 무분별하게 사용하면 성능 오히려 떨어져

그래서 전체 양중에 10~15%사이의 데이터 검색할 때 사용 - 이 때 효과적
이 외에는 오히려 풀스캔이 효과적

dml을 쓸 때 인덱스는 최악의 성능
인덱스는 정렬을 하니까 테이블이 변경될 때마다 인덱스 재구축 일어나
그래서 인덱스는 셀렉트 전용!


프라이머리키, 유니크는 인덱스가 자동으로 설치돼?? - 공통점은 중복이 없어
인덱스는 중복 없는 컬럼에 쓰면 좋아


최악의 인덱스는 성별.. 이런데다가 인덱스 설치하면 최악
2개뿐이야. 그럼 절반을 다 뒤져야 해


인덱스는 개발자 영역이라기보다 dba나 튜너들의 역할
검색속도 향상 시켜주고.
개발자들은 인덱스를 안 쓰는 게 좋아
물론 설계단에서 이미 여기에 인덱스를 설치해라라고 써져 있으면 만들면 되겠지

ㅇ동의어
시너니엄. emp이런거야
잘 사용하는 객체는 아냐

지금까지 5개 객체 살펴봤어

profile
STEP BY STEP

0개의 댓글