글

라벨이 데이터베이스인 게시물 표시

데이터베이스 - 인덱스 객체

이미지
인덱스 데이터베이스에 데이터를 집어 넣으면 시간 순서대로 일단 정렬이 된다. 따라서 우리가 데이터를 찾을 때 다소 불편하다. 이를 극복하기 위해서 인덱스를 사용한다. 즉 인덱스는 검색 속도를 높이기 위해서 사용하는 스키마 객체이다. 인덱스를 사용하지 않을 때는 모든 데이터를 읽어 검색 조건에 따라 데이터를 선별한다. 하지만 인덱스를 사용하면 조건에 맞는 데이터만을 직접 접근하기 때문에 검색 효율을 높일 수 있다. 인덱스는 오라클 서버에 의해 자동 생성되기도 하지만, 사용자가 직접 생성할 수도 있다. 테이블에서 제약 조건으로 primary key 또는 unique를 생성할 경우 자동 생산된다. 그리고 이 경우 인덱스의 이름은 제약조건의 이름과 동일하다. foreign key에 대해서는 자동생성되지 않지만 인덱스가 존재하면 조인할 때 검색속도가 향상되기 때문에 반드시 생성하도록 하자. 인덱스 생성 인덱스를 만들 때는 정렬 기법이 중요하다. 우리가 이미 알고 있는 오름차순, 내림차순은 데이터 간 접근속도 차이가 많이 난다. 하지만 검색 속도를 모든 데이터에 대해 가능하면 비슷한 속도로 접근할 수 있도록 해야한다. 이를 위해서 중간값 정렬이라는 것을 사용한다. 일종의 이진 트리 형식으로 중간값보다 큰 집합과 작은 집합으로 나누고, 또 나눈 데이터에서 이 작업을 반복한다. 이를 “balanced tree” 기법이라고도 부른다. 인덱스를 생성하면 인덱스는 기존 테이블로부터 데이터를 받아 Balanced tree에 넣는다. 우리가 데이터를 정렬하기 위해서 이름순, sal순 등으로 정렬할 때마다 실제 데이터를 뒤섞어놓는 것보다 필요한 칼럼을 뽑아서 트리에 넣는 것이 효율적이고 안전하기 때문이다. 테이블 스캔과 인덱스 스캔 보통 테이블에서 데이터를 찾는 것을 테이블 스캔, 인덱스에서 데이터를 찾는 것을 인덱스 스캔이라고 한다. 인덱스를 생성할 칼럼 선정 넓은 범위를 갖는 칼럼: 인덱스는 검색용이기 때문에 범위...

데이터베이스 - 시퀸스 객체

이미지
시퀸스 데이터 베이스 객체에는 테이블과 뷰를 제외하고 시퀸스, 인덱스, 동의어가 존재한다. 테이블과 뷰에 대해서는 앞에서 학습하였기 때문에 나머지 3 종류의 객체에 대해서 살펴보도록 하겠다. 시퀸스는 은행에서 대기표를 뽑을 때 사용하는 일종의 번호발생기라고 생각하면 된다. 여러 사용자들이 공유하는 데이터베이스 객체로서 호출 시 중복되지 않는 숫자를 리턴한다. 시퀸스는 중복되지 않는 값이기 때문에 주로 primary key를 생성할 때 시퀸스 값을 이용한다. 시퀸스 생성 시퀸스 생성 명령은 다음과 같다. 일단 create문을 통해 sequence 이름을 입력하고, 숫자를 얼마씩 증가시킬지, 시퀸스 초기값, 최대값 등을 설정한다. cycle 옵션 nocycle은 시퀸스가 한바퀴 돌았을 때 다시 반복하도록 하는가에 대한 속성값이다. 만약에 cycle로 선언하여 반복을 허용할 경우에는 primary 키로 사용해서는 안된다. cache 옵션 시퀸스 번호의 추출을 빠르게 진행할 수 있도록 하는 옵션이다. nextval(아래에서 다룰 것)에 의해 최초로 시퀸스 번호를 추출하면 cache 옵션에 기술된 숫자 만큼 시퀸스 번호가 추출되고 캐시에 저장된다. nextval에 의해 다음 시퀸스 번호가 호출될 때 캐시에서 이 번호들을 리턴한다. user_sequences 시퀸스 역시 데이터 딕셔너리가 존재한다. 이를 user_sequences라고 하는데, 아래와 같은 데이터들을 담고 있다. 이 중 몇가지를 검색하도록 해보자. 시퀸스의 이름과 초기값, 최대값, 증분을 검색하였다. 우리가 시퀸스 생성 시 설정한대로 잘 출력되고 있다. nextval, currval 가상 칼럼 시퀸스를 작성한 후 nextval, currval 라는 가상 칼럼을 사용하여 시퀸스 번호를 검색할 수 있다. nextval는 다음 시퀸스 번호를 출력하고, currval는 현재 시퀸스 번호를 출력한다. 일단 curr...

데이터베이스 - 뷰 객체

이미지
뷰 뷰는 실제 데이터가 저장되는 곳은 아니고, 바라보는 창이다. 뷰는 내부에 데이터를 저장하고 있지 않지만 기존 테이블에 기초한 논리적 테이블이다. 복잡한 쿼리를 단순하게 만들기 위해 select문을 이름 있게 저장하는 것이라고 생각하면 보다 쉽게 뷰를 다룰 수 있을 것이다. 뷰를 사용하는 목적은 보여주고 싶은 데이터만을 추출하여 보여줌으로써 데이터 접근 제한을 둘 수 있다. 게다가 복잡한 쿼리문이나 조인문의 경우 뷰를 통해 단순하게 바꾸고 사용할 수 있다. 뷰에는 두 종류가 있는데, 단순 뷰와 복합 뷰이다. 이는 select문이 얼마나 포함되었는가를 기준으로 나눈 것뿐이다. 뷰 생성하기 이제 뷰를 생성해보겠다. 뷰의 생성 문법은 다음과 같다. create문을 사용하여 서브 쿼리에 들어간 select문에 이름을 정해준다고 생각하면 된다. 실제로 데이터베이스 서버에서 뷰를 생성해보자. 뷰 생성 권한 주기 그런데 생성에 앞서 한 가지 문제가 있다. 실제로 뷰 생성 create문을 실행하면 다음과 같이 권한이 불충분하다는 메시지가 나타난다. 이는 scott이라는 사용자가 sys로부터 view 생성 권한을 받지 않았기 때문이다. 이제 system으로 접속하여 scott에게 view 생성 권한을 주도록하자. 우리가 처음에 오라클 데이터베이스를 설치할 때 system의 비밀번호를 123456으로 설정하였다. connect(conn)로 접속하여 권한을 주도록 하자. grant 명령어는 아직 배우지 않았지만 뒤에서 다루도록 할 것이다. 일단 넘어가도록 하자. 이제 scott에게 view 생성 권한이 생겼다. 이제 scott에 다시 연결하여 view를 생성해보자. 이제 뷰가 제대로 생성되고 있는 것을 확인할 수 있다. 그리고 뷰는 물리 데이터는 아니지만 select문이나 desc문을 사용할 수 있다. 이를 select문을 통해 출력하면 테이블의 형태로 출력된다. 즉 실제로 저장...

데이터베이스 - 제약조건 관리

이미지
제약조건 관리 제약조건 추가 이미 테이블을 만든 상태에서 새롭게 제약 조건을 추가하는 것도 가능하다. 이 때 사용하는 것은 alter문이다. 문법은 다음과 같다. 이제 alter문을 사용해서 제약조건을 추가해보도록 하겠다. 먼저 테이블을 하나 만들어주자. 사원 번호에 대해서 일단 primary key를 적용한다. 이 테이블에 대해서 alter문을 통해 foreign key를 추가해보도록 하겠다. primary key인 사원번호에 대해서 참조하도록 한다. 제대로 제약 조건이 추가되었는지 확인해보자. P 타입의 primary key 제약 조건뿐만 아니라 R 타입의 foreign key 제약 조건 역시 추가되었음을 확인할 수 있다. 제약 조건 삭제 제약 조건을 삭제하는 경우 역시 alter ~ drop constraint 문을 사용한다. 위에서 생성했던 제약 조건을 한번 지워보도록 하자. 제대로 삭제가 되었는지 확인하자. cascade 조건 만약에 primary key를 삭제한다면 어떻게 될까? 당연히 앞서서 배웠 듯이 참조하고 있는 foreign key가 존재하기 때문에 오류 메시지를 출력할 것이다. 하지만 primary key를 삭제하는 동시에 이를 참조하고 있던 foreign key까지 한번에 삭제하는 방법이 있다. 이를 cascade 조건이라고 한다. 위에서 만들었던 사원 테이블에서 다시 foreign key를 추가하고 다음의 명령을 실행해보자. primary key를 삭제하는데 일단 오류 메시지가 출력되지 않는다. 그리고 해당 제약 조건을 참조했을 때, primary key 뿐만 아니라 foreign key까지 모두 삭제되는 것을 확인할 수 있다. 제약조건 비활성화 / 활성화 우리가 만든 제약조건에 대해서 삭제, 추가 외에도 비활성화, 그리고 이를 다시 활성화할 수 있다. 이에 대해서 알아보도록 하겠다....