2013년 1월 23일 수요일

sql 전문가 가이드 요약 (과목 2, 4~5절)

4절 TCL

1. 트랜잭션 개요 : 트랜잭션은 데이터베이스의 논리적 연산단위. 밀접히 관련되어 분리될 수 없는 한 개 이상의 데이터베이스 조작을 가리킨다. 하나의 트랜잭션에는 하나 이상의 SQL 문장이 포함됨. 트랜잭션은 분할할 수 없는 최소의 단위.

올바르게 반영된 데이터를 데이터베이스에 반영시키는 것을 커밋(commit), 트랜잭션 시작 이저느이 상태로 되돌리는 것을 롤백(rollback)이라고 하며, 저장점(savepoint) 기능과 함께 3가지 명령어를 태랜잭션을 콘트롤하는 TCL(transaction control language)로 분류한다.


트랜잭션의 대상이 되는 SQL문 : update, insert, delete 등 데이터를 수정하는DML문

트랜잭션의 특징


 









계좌이체는 한 계좌에서 현금이 인출된 후에 다른계좌로 입금이 되는데, 현금이 인출되기 전에 다른 계좌에 입금이 되는 것은 문제를 발생시킬 수 있다. 그리고 이체가 결정되기 전까지는 다른 사람이 이 계좌의 정보를 변경할 수 없다. 이것을 보통 무넹 자물쇠를 채우듯 한다고 하여 잠금(locking)이라고 표현.

트랜잭션의 특성(특히 원자성)을 충족하기 위해 데이터베이스는 다양한 레벨의 잠금 기능을 제공하고 있는데, 잠금은 기본적으로 트랜잭션이 수행하는 동안 특정 데이터에 대해서 다른 트랜잭션이 동시에 접근하지 못하도록 제한하는 기법. 잠금이 걸린 데이터는 잠금을 실행한 트랜잭션만 독점적으로 접근할 수 있고 다른 트랜잭션으로부터 간섭이나 방해를 받지 않는 것이 보장된다. 그리고 잠금이 걸린 데이터는 잠금을 수행한 트랜잭션만이 해제 가능.


2. COMMIT

입력한 자료나 수정한 자료에 대해서 또는 삭제한 자료에 대해서 전혀 문제가 없다고 판단되었을 경우 COMMIT 명령어를 통해서 트랜잭션을 완료할 수 있다.

commit이나 rollback 이전의 데이터 상태는 다음과 같다
- 단지 메모리 buffer에만 영향을 받았기 때문에 데이터의 변경 이전 상태로 복구 가능하다.
- 현재 사용자는 select 문장으로 결과를 확인 가능하다
- 다른 사용자는 현재 사용자가 수행한 명령의 결과를 볼 수 없다
- 변경된 행은 잠금(locking)이 설정되어서 다르 낫용자가 변겨할 수 없다.

commit 이후의 데이터 상태
- 데이터에 대한 변경 사항이 데이터베이스에 반영된다
- 이전 데이터는 영원히 잃어버리게 된다
- 모든 사용자는 결과를 볼 수 있다
- 관련된 행에 대한 잠금(locking)이 풀리고, 다른 사용자들이 행을 조작할 수 있게 된다


SQL 서버 트랜잭션
- auto commit : DML, DDL을 수행할 때 마다 DBMS가 트랜잭션을 컨트롤 하는 방식. 명령어가 성공적으로 수행되면 자동으로 commit을 수행하고 오류가 발생하면 자동으로 rollback을 수행
- 암시적 트랜잭션 : 오라클과 같은 방식으로 처리. 트랜잭션의 시작은 DBMS가 처리하고 트랜잭션의 끝은 사용자가 명시적으로commit 또는 rollback으로 처리. 인스턴스 단위 또는 세션단위로 설정할 수 있다.
- 명시적 트랜잭션 : 트랜잭션의 시작과 끝을 모두 사용자가 명시적으로 지정하는 방식. begin transaction으로 트랜잭션 시작. commit transaction 또는 rollback transaction으로 트랜잭션 종료. rollback 구문을 만나면 최초의 begin transaction 시점까지 모두 rollback이 수행됨.


3.ROLLBACK
테이블 내 입력한 데이터나, 수정한 데이터, 삭제한 데이터에 대하여 commit 이전에는 변경사항을 취소할 수 있는데 데이터베이스에서는 롤백기능을 사용한다. 롤백은 데이터 변경 사항이 취소되어 데이터의 이전 상태로 복구되며, 관련된 행에 대한 잠금이 풀리고 다른 사용자들이 데이터 변경을 할 수 있게 된다.

rollback 후의 데이터 상태
- 데이터에 대한 변경 사항은 취소된다.
- 이전데이터는 다시 재저장 된다.
- 과녈ㄴ된 행에 대한 잠금(locking)이 풀리고, 다른 사용자들이 행을 조작할 수 있게 된다.

commit 과 rollback을 사용함으로써 다름과 같은 효과를 볼 수 있다.
- 데이터 무결성 보장
- 영구적인 변경을 하기 전에 데이터의 변경 사항 확인 가능
- 논리적으로 연관된 작업을 그룹핑하여 처리 가능


4. SAVEPOINT
저장점(savepoint)을 정의하면 롤백할 때 트랜잭션에 포함된 전체 작업을 롤백하는 것이 아니라 현 시점에서 savepoint 까지 트랜잭션의 일부만 롤백할 수 있다. 따라서 복잡한 대규모 트랜잭션에서 에러가 발생했을 때 savepoint까지의 트랜잭션만 롤백하고 실패한 부분에 대해서만 다시 실행할 수 있다. 복수의 저장점을 정의할 수 있으며, 동일 이름으로 저장점을 정의했을 때는 나중에 정의한 저장점이 유효하다.


*트랜잭션에 대해 재정리

- 해당테이블에 데이터의 변경을 발생시키는 입력(insert), 수정(update), 삭제(delete) 수행시 그 변경 되는 데이터의 무결성을 보장하는 것이 커밋과 롤백의 목적. 커밋은 "변경된 데이터를 테이블이 영구적으로 반영해라" 라는 의지. 롤백은 "변경된 데이터가 문제가 있으니 변경 전 데이터로 복귀하라" 라는 의미




5절 WHERE절

1. WHERE 조건절 개요
- 자료를 검색할 때 select 절과 from 절만을 사용하여 기본적인 SQL 문장을 구성한다면, 테이블에 있는 모든 자료들이 결과로 출력되어 실제로 원하는 자료를 확인하기 어려울 수 있다. 사용자들은 자신이 원하는 자료만을 검색하기 위해서 SQL 문장에 WHERE 절을 이용하여 자료들에 대하여 제한할 수 있다. WHERE 절에는 두 개 이상의 테이블에 대한 조인 조건을 기술하거나 결과를 제한하기 위한 조건을 기술할 수도 있다.
 현실의 데이터베이스는 많은 사용자나 프로그램들이 동시에 접속하여 다량의 트랜잭션을 발생하고이싿. WHERE 조건절을 사용ㅌ하지 않고 필요 없는 많은 자료들을 데이터베이스로 부터 요청하는 SQL 문장은 대향의 데이터를 검색하기 위해 데이터베이스가 설치되어 있는 서버의 CPU나 MEMORY와 같은 시스템 자원들을 과다하게 사용한다. 또한 많은 사용자들의 QUERY에 대해 바로바로 처리를 해주지 못하게 되고, 도한 검색된 많은 자료들이 네트워크를 통해서 전달됨으로써 문제점들을 발생시킨다. 이런 문제점을 방지하기 위해 WHERE절에 조건이 없는 FTS 문장은 SQL 튜닝의 1차적 검토대상이 된다.


WHERE 절은 FROM 절 다음에 위치하며, 조건식은 아래 내용으로 구성된다.
- 칼럼명
- 비교연산자
- 문자, 숫자, 표현식
- 비교 칼럼명



2. 연산자의 종류

WHERE 절에 사용되는 연산자는 3가지 종류가 있다.
- 비교연산자
- SQL 연산자
- 논리연산자


































3. 비교연산자











4. SQL 연산자






5. 논리연산자







6. 부정 연산자













7. ROWNUM, TOP 사용

*ROIWNUM
오라클의 ROWNUM은 칼럼과 비슷한 성격의 Psudo Column 으로서 SQL 처리 결과 집합의 각 행에 대해 임시로 부여되는 일련번호이며, 테이블이나 집합에서 원하는 만큼의 행만 가져오고 싶을 때 WHERE 절에서 행의 개수를 제한하는 목적으로 사용한다.



- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM = 1; 이나
- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <= 1; 이나
- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <2; 처럼 사용할 수 있다.
  
   두 건 이상의 N 행을 가져오고 싶을 때는 ROWNUM = N; 처럼 사용할 수 없으며
- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <= N; 이나
- SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <= N+1; 처럼 출력되    는 행의 한계를 지정할 수 있다.

   추가적인 ROWNUM의 용도로는 테이블 내의 고유한 키나 인덱스 값을 만들 수 있다.
- UPDATE MY_TABLE SET COLUMN1 = ROWNUM; 

 *TOP
 SQL 서버는 TOP 절을 사용하여 결과 집합으로 출력되는 행의 수를 제한할 수 있다.

댓글 없음:

댓글 쓰기