Operating System/ORACLE

    [ORACLE] 로우 아이디(ROWID)

    [ORACLE] 로우 아이디(ROWID)

    * 로우 아이디는 임의의 컬럼에 해당하는 로우 데이터가 물리적으로 데이터베이스 디스크의 어딘가에 저장되어 있는지에 대한 주소라고 이해하면 된다. 결국 주소를 가지고 어느 누군가를 찾는 것이 당연히 쉬운 것처럼 데이터베이스의 경우에도 마찬가지이다. 데이터가 물리적으로 어디에 저장되어 있는지 그 주소를 가지고 찾아가는 것이 인덱스를 사용하게 되면 얻게 되는 이점이다. -> dept 테이블을 생성하고 각각의 로우 데이터에 해당하는 디스크 상의 주소가 자동적으로 생기게 되는데 이것이 로우 데이터이다. -> 로우 아이디는 전체적으로 80 bits를 사용하게 되는데 기본적으로 네 부분으로 나누어져 있다. 오브젝트 넘버(32 bits), 파일 넘버(10 bits), 블록 넘버(22 bits) 마지막으로 로우 넘버(1..

    [ORACLE] 인덱스(INDEX)

    [ORACLE] 인덱스(INDEX)

    * 인덱스(INDEX) -> 인덱스는 스키마 오브젝트중 하나이다. -> 인덱스는 어떤 사용자가 생성했는냐에 따라 해당 인덱스에 대한 스키마가 정해진다. -> 임의의 쿼리를 실행할 때 테이블 스캔을 하지 않고 Rowid를 사용하여 원하는 로우 데이터를 찾아온다. -> 디스크 I/O를 감소시킴으로써 보다 빠른 검색이 가능하다. -> 오라클 서버에 의하여 관리된다. -> 인덱스는 자동적으로 생성 가능하다. -> 임의의 컬럼에 Primary key 또는 Unique key 제한 조건을 설정하는 동시에 해당 컬럼에는 인덱스가 자동적으로 생성된다. -> 인덱스는 인위적으로 생성 가능하다. * 인덱스 기본 형식 CREATE INDEX index name ON table name (column name[ ,column..

    [ORACLE] Currval과 Nextval

    [ORACLE] Currval과 Nextval

    * 시퀀스가 생성되면 Currvar과 Nextval이라는 두 개의 수도 컬럼(Pseudo column)을 virtual 테이블 - DUAL - 로부터 Select 문장을 사용하여 쿼리 할 수 있다. Currval의 값을 가지고 있는 컬럼을 말하고 Nextval은 현재의 값 이후에 INcrement by 옵션에 의하여 생성되는 값을 가지게 되는 컬럼이다. -> Currval 값은 100이 저장되어진다. -> 다음 쿼리의 결과는 100 이후에 2 만큼 증가되는 다음 숫자를 보여주게 된다. 만약 500이라는 최댓값에 도달하게 되면 자동적으로 처음의 값으로 돌아가게 된다.

    [ORACLE] 시퀀스

    [ORACLE] 시퀀스

    * 시퀀스(Sequence)는 테이블을 생성할 때 자주 사용하는 오라클 데이터베이스이다. 대부분의 시퀀스가 요구되는 경우는 Primary key에 해당하는 일련의 정수들을 시퀀스 문장의 옵션들을 통해 자동적으로 발생한다. 컬럼에 저장시킴으로써 Primary key가 가져야 하는 조건 중 가장 중요한 유일성(Uniqueness)을 보장하기 위함이다. 특히 오라클 사용자 여러 명이 동시에 작업을 하게 되는 경우 Key 값을 설정해주기가 어려워질 수도 있기 때문이다. * 시퀀스를 생성하는 문장의 기본형식 CREATE SEQUENCE sequence name [ INCREMENTED BY number ] [ START WITH number ] [ {MAXVALUE number | NOMAXVALUE} ] [ {..

    [ORACLE] 뷰(View)를 통한 로우 데이터의 갱신과 추가

    [ORACLE] 뷰(View)를 통한 로우 데이터의 갱신과 추가

    * Simple 뷰를 사용하는 경우는 아무 문제없이 임의의 로우 데이터를 갱신할 수 있지만 Complex 뷰를 사용하는 경우는 다음의 조건 하에서는 로우 데이터의 갱신이 불가능하다. -> 그룹 함수와 Group by 절을 사용하여 만든 Complex 뷰인 경우 -> Distinct 옵션을 사용하여 만든 Complex 뷰인 경우 -> Rownum 키워드를 사용하는 경우 -> 컬럼 설정시 표현(Expression)을 사용하는 경우 * 뷰를 사용하여 로우 데이터를 추가할 때 Simple 뷰를 사용하는 경우는 위의 경우와 마찬가지로 아무 문제없이 임의의 로우 데이터를 추가할 수 있지만 Complex 뷰를 사용하는 경우는 다음의 조건 하에서는 로우 데이터의 추가가 불가능하다. -> 그룹 함수와 Group by 절..

    [ORACLE] 뷰(Simple 뷰, Complex 뷰)

    [ORACLE] 뷰(Simple 뷰, Complex 뷰)

    * 뷰(View) CREATE [ OR REPLACE ] [ FORCE | NOFORCE ] VIEW view name [ alias...] AS sub query [ WITH CHECK OPTION [ CONSTRAINT constraint name ] ] [ WITH READ ONLY [ CONSTRAINT constraint name ] ] * Force / Noforce -> 뷰를 생성하는 대부분의 경우는 베이스 테이블이 존재한다는 가정하에서 이루어진다. 하지만 베이스 테이블이 존재하지 않는 경우에도 뷰를 생성할 수가 있는데 이때는 Force 옵션을 적용할 수 있다. Noforce 옵션의 경우는 뷰를 생성할 때 반드시 베이스 테이블이 존재해야 한 한다는 것을 의미한다. 특별한 설정이 없다면 Nof..

    [ORACLE] 제약 조건 (Constraints)

    [ORACLE] 제약 조건 (Constraints)

    * 관계형 데이터베이스라고 하면 임의의 데이터베이스 내에 존재하는 여러 테이블들이 서로 관계를 가지며 운영된다는 것을 의미한다. "데이터의 무결성을 설정한다"의 의미와 같다. 처음 데이터베이스 설계하는 과정 가운데서 테이블 사이의 관계를 분명하게 설정하고 그에 대한 제약조건들을 사용하여 각각의 테이블에 저장되는 데이터 또는 테이블에 적용하는 것을 말한다. 결국 이러한 제약조건의 사용은 데이터베이스 내에 보다 정확하고 분명한 데이터들을 가질 수 있도록 해주는 기능을 제공한다. 오라클에서 부여해줄 수 있는 제약 조건은 크게 4가지이다. * Not null 제약 조건 * Primary key 와 Foreign key 제약 조건 * Unique 제약 조건 * Check 제약 조건 * Not null 제약 조건 ..

    [ORACLE] 데이터 잠금 (Locking)

    [ORACLE] 데이터 잠금 (Locking)

    * 데이터 잠금은 오라클 데이터베이스를 사용하면서 요구되는 중요한 개념이다. 데이터가 어느 시점에 있어서 동일한 값이 쿼리 되어야 한다는 측면에서 데이터 잠금은 중요한 역할을 한다. 일단 트랜잭션이 시작되면 그 트랜잭션이 커밋 또는 롤백되기 전까지는 그 해당 로우에 잠금이 걸리게 된다. 그러므로 트랜잭션을 수행하고 있는 사용자만이 새롭게 갱신된 또는 변경된 데이터를 볼 수가 있다. 다른 사용자들은 그 해당 로우에 대하여 갱신되기 전 다시 말하자면 해당 로우에 잠금이 걸려있기 때문에 이전 데이터를 쿼리 하게 된다. 이러한 잠금이 요구되는 이유는 여러 명의 사용자들이 동시에 접속해서 작업을 할 수 있다고 가정한다면 어느 시점에서 데이터의 일고 나성이 없어질 수가 있기 때문이다. 이러한 측면에서 데이터 잠금은..

    [ORACLE] 커밋(Commit)과 롤백(Rollback)

    [ORACLE] 커밋(Commit)과 롤백(Rollback)

    * 트랜잭션 -> 마지막으로 실행한 커밋 명령 이후부터 새로운 커밋 명령을 실행하는 시점까지 수행된 DML 명령들을 말한다. 예를 들어 2시간 전에 커밋을 실행하고 나서 3개의 DML을 수행했다고 보자. 그리고 이제 새로운 커밋을 실행하려고 한다면 그 2시간 동안 수행됐던 3개의 DML 명령들이 하나의 트랜잭션이라고 볼 수 있다. 트랜잭션이 어떤 명령이든 하나의 명령 실행을 이야기하는 것으로 오해하는데 하나의 트랜잭션은 하나 또는 여러 개의 DML 명령을 모두 묶어서 의미할 수 있다. 다시 말해 트랜잭션은 커밋과 커밋 사이에 발생한 모든 DML을 의미한다는 것이다. -> DDL 문장 같은 경우 하나하나의 문장이 수행될 때마다 내부적으로 자동 커밋이 발생하므로 하나하나의 문장이 하나의 트랜잭션이라고도 말할..

    [ORACLE] DML (With Check Option)

    [ORACLE] DML (With Check Option)

    * DML 문장을 실행할 때 종종 서브 쿼리를 사용하는데 한 가지 유의할 사항이 있다. 서브 쿼리 내부 Where 절에서 사용한 컬럼 이름은 반드시 서브쿼리 내부의 Select 절에 명시되어야만 한다. With Check Option은 바로 이 부분에 대하여 확인해주는 역할을 한다. 먼저 With Check Option 없이 문장을 사용하겠다. -> 현재 'LEWIS'라는 사원의 정보를 새롭게 추가할 때 부서번호(deptno)가 30이라는 값과 Select 절에 명시한 컬럼 값을 설정하고 있다. 원래의 의도는 부서번호(deptno) 값도 함께 추가하여야 하지만 실제 실행 결과는 다르게 나온다. Select 절에 부서번호(deptno)를 명시하지 않았기 때문에 deptno=30이란 값은 추가되지 못하여 널..