트랜젝션의 네가지 속성


Atomicity (원자성) : 트랜잭션 내에 모든 작업이 완료되거나 모든 작업이 완료되지 않아야 한다.(?)
즉, 트랜잭션 내의 작업중 하나라도 에러가 발생하면 트랜잭션 내의 모든 작업이 롤백(Rollback) 되어야 한다.


Consistency(일관성) : 트랜잭션 중에 오류 없이 유효한 데이터만 데이터베이스에 저장되어야 한다.


Isolation(격리성) : 트랜잭션 중에 변경된 내용이 트랜잭션이 완료되기 전까지 다른 트랜잭션에 영향을 미쳐서는 안된다.


Durability(지속성) 트랜잭션이 완료된 경우 시스템 고장이나 네트워크 에러 등으로 데이터가 유실되지 않고 정상적으로 기록되어야 한다.





'~ 2014 > Database' 카테고리의 다른 글

클러스터드 인덱스 / 넌클러스터드 인덱스 / primary 인덱스  (0) 2014.06.15
트리거 trigger  (0) 2014.06.14
DDL / DML / DCL  (0) 2014.06.13

음.. 어렵다 이개념
보통 인덱스는 두가지 종류로 나뉘나 보다.

클러스터드 인덱스                         넌 클러스터드 인덱스

1. 물리적으로 행을 재배열한다            그렇지 않다
2. 비교적 용량이 작다                        비교적 크다
3. 최대 갯수가 테이블당 1개                테이블당 249개
4. 인덱스의 레벨이 작다                     1만큼 더 크다
5. 상대적으로 검색속도가 빠르다         느리다
   (범위조회에 유용)
6. 선택도가 낮다(밀도가 높다)            선택도가 높다(밀도가 낮다)



1. 클러스터드 인덱스는 우선 물리적으로 행을 재배열 한다
무슨 말이냐...

다음과 같은 테이블을 생성했다 쳤을 때

create table test_index{

log_data char(8) not null,
id char(1) not null,
.....

primary key(log_data,id)

}

물론 저 조합으로 만들어진 주키가 중복없이 재 기능을 한다는 가정하에
20130611 a data
20130612 a data
20130612 c data
20130612 b data
20130608 c data

이런 순서로 insert를 했다.
실제 db에는 어떻게 저장이 될까??

단일 속성으로 이루어진 주키라면 주키의 오름차순이나 내림차순으로 정렬이 되어 저장이 된다.
=>이게 물리적으로 행을 재배열 한다는 뜻

이 경우에는 2가지 속성으로 이루어진 합성키가 주키의 역할을 하고있는데 앞에 쓰여진 것일 수록 우선순위가 높은가보다. 날짜순 정렬 -> id 순 정렬.. 대충 이런개 클러스터드 인덱스이다.

20130608 c data
20130611 a data
20130612 a data
20130612 b data
20130612 c data

반대로 넌클러스터드 인덱스는 조회문 향상을 위헤 인덱스를 생성해서 사용한다. 하지만 이 인덱스는 물리적으로 데이터가 정렬되지 않는다.

이건또 무슨말이냐... 조회문이라.. 쉽게 생각해서 클러스터드 인덱스가 사전이라면 넌클러스터드 인덱스는 책장 맨뒤에 주요단어들 모아놓은 그런 책이라고 생각해보자.

중요단어.................... p139
중요단어2...................p73

이런거 있잖아... 데이터를 가지고 어떤 위치(인덱스)에 있는지 조회한다고나 할까. 여튼 인덱스 테이블을 따로 만들어서 순서없는 데이터 테이블과 함께 데이터를 조회한다.  


2.용량 !!!!!

넌클러스터드 인덱스는 인덱스 페이지와 데이터페이지를 따로 관리하기 떄문에 비교적 용량이 더 크다.
(인덱스페이지... 테이블이라고 생각하면 되겠다)

http://lng1982.tistory.com/144

여기저기에서 지식을 모아다 작성하고는 있으나 가장 비중있게 참고했던 블로그의 출처를 살며시..
(b+트리 구조에서 클러스터드 인덱스와 넌클러스터드 인덱스의 데이터 찾는 방법 그림도 있음)

(귀찮아서..) 클러스터드 인덱스와 넌클러스터드 인덱스 모두 b+트리의 구조를 사용한다.(db 데이터를 대부분 이렇게 관리한다고 들었음)

무튼 클러스터드 인덱스는 리프레벨의 페이지가 곧 인덱스이자 데이터이므로 넌클러스터드 인덱스에 비해 낮은 레벨의 트리구조로 이루어져있다 이거다.


3.인덱스의 최대 갯수

인덱스가 물리적으로 정렬되어 있어서 한개 이상의 클러스터드 인덱스가 존재하면 꼬인다.... 뭔소린지 모르겠지만 영어사전에 abcd 말고 또다른 인덱스가 있다면 겁나 했깔리긴 할것 같다.
반면 !! 넌클러스티드 인덱스는 인덱스 테이블을 별도로 생성하여 사용하기때문에 인덱스가 많아도 상관 없다.
당장 학교에서쓰는 두꺼운 전공책을 펴고 뒤에 보면 ㄱ~ㅎ순의 인덱스 검색이랑 a~z 인덱스 검색이랑 2개나 있는걸 생각해보면 좀더 이해가 쉽지 않을까? 근대 이게 DB에선 최대 249개 쓸수 있단다.(왜그런지 나중에 찾아봐야지)

즉 클러스터드 인덱스는 인덱스와 데이터가 뭉쳐다니니까 인덱스가 여러개있음 안된다는거고 넌클러스터드는 인덱스가 몇개이던 어짜피 데이터와 따로노니까 결과적으로 데이터의 주소값만 얻으면 된다 이거다. 


4.인덱스 레벨 !! 은 용량얘기할때 했다.

5.검색속도 !!!

기본적으로 검색트리의 레벨이 큰만큼 속도가 오래 걸리기 마련이다. 게다가 그것이 범위검색이라면?
가령 20130613~20130615 사이에 로그를 뒤진다던가.. 이런 연속된 데이터의 검색이라면 클러스터드 인덱스가 압도적으로 빠를것이다.(넌 클러스터드 인덱스는 여기저기 흩어져있음..)


6.선택도..(생략, 할말도 없고 졸립다)


그렇다면... 넌클러스터드 인덱스는 왜쓰는걸까...? 정리하다보니 겁나 좋은점이 하나도 없어보인다.
(방금 넌클러스터드의 장점을 검색해봤다..)
구지 가져다 붙히자면 입력할 때 인덱스 정렬하는 시간을 단축할 수 있으므로 입력시간이 빠르다..?
음 뭔가 택배로 엄청 쌓아놓고 창고에 다 때려밖으면 일단 내방은 빨리 청소할 수 있지 않는가.,?

아마도 주키(인덱스) 속성이 아닌 데이터를 찾는데 유용하지 않을까 싶다. 음..? 그럴싸한데?
나만해도 방금 트리거 찾는다고 DB책 목차를 보기보단 맨뒤에 색인보고 찾았음..헐

그러니까 대한민국 공대생들은 전공책은 재본을 뜨기보단 돈좀 더 내고 사는게 바람직 하다고 생각한다. 내 알고리즘책 제본했는데 과대가 돈아낀다고 앞뒤 목차 다빼놓고 필요한부분만 제본을... 인덱스가 없다

아쉽게도 주변에 심도있게 물어볼 전문가가 없다... 취직하고싶다 빨리


-----(추가)----
이것저것 찾다보니 primary index라는 개념이 또... 클러스터디인덱스의 다른 말이란다. 기본색인 이라고도 불리우며 이는 주 키를 인덱스의 검색키로 하는 경우가 많지만 반드시 그럴 필요가 있는것은 아니다. 이는 밀집인덱스와 희소 인덱스로 구분된다.

밀집인덱스(dense) : 인덱스 엔트리는 파일에 있는 모든 검색 키 값에 대해 나타난다.
희소인덱스(spare) : 인덱스 엔드티른 검색 키 값에 대해 단지 몇개만 나타난다

사전을 보면

[abcdefg......vwxyz]  ---- >레벨 1. 사전 옆면에 a~z까지 표시된거
 ㅣㅣㅣㅣ.....ㅣㅣㅣ      ----> (나름 트리의 가지를 나타낸것)
[apple]....[apach]...[need]  -----> 레벨2. 사전 각 페이지의 상단 모퉁이에 시작과 끝 단어를 나타낸 단어들,
ㅣㅣㅣ       ㅣㅣㅣ      ㅣㅣㅣ                      얘네들을 희소인덱스라고 한다.
[] [] [] [] [] [] []..... [] [] []  -----> 레벨3. 우리가 찾고자 하는 단어, 밀집인덱스라고 한다. 실제로 밀집                                                                   인덱스 들은 각 단어를 정의하는 풀이문장들과 연결되어있다.
                                                                  (데이터베이스에서 주키가 나머지 속성값들과 연결되있음)



'~ 2014 > Database' 카테고리의 다른 글

트랜잭션  (0) 2014.06.15
트리거 trigger  (0) 2014.06.14
DDL / DML / DCL  (0) 2014.06.13

db를 쓰다보면 영역제약이라는게 있다.
이를테면 고딩들 관리하기 위해 나이는 17~19살이라던지
물론 예외는 있지만 배제해놓고...

트리거 : 테이블에 대한 이벤트에 반응해 자동으로 실행되는 작업을 의미한다(위키백과)
           묵시적으로 실행되는 프로시저로서 DBMS에 의해 관리되는 규칙, db에 저장되어있다.

쉽게말해서 insert update delete 쿼리(select 문과 달리 데이터 값을 변경하는 쿼리문)를 
실행할 때 실행하기 전이나 후에 제약따위를 걸어 변경을 허락하지 않거나  변경 전후값을
출력할 때 사용된다.



행 트리거 : 컬럼의 각 행의 데이터 행 변화가 생길떄마다 실행되며, 그 데이터 행의 실제값을 제어할 수 있다.
문장 트리거 : 트리거 사건에 의해 단 한번 실행되며, 컬럼의 각 데이터 행을 제어할 수 없다.

사진 출처 : http://www.gurubee.net/lecture/1076


'~ 2014 > Database' 카테고리의 다른 글

트랜잭션  (0) 2014.06.15
클러스터드 인덱스 / 넌클러스터드 인덱스 / primary 인덱스  (0) 2014.06.15
DDL / DML / DCL  (0) 2014.06.13

DDL : database definition languange

CREATE

CREATE TABLE table1(
    부품번호 INTEGER,
    부품내역 VARCHAR(20),
     제고량 INTEGER
);

뭐 이따위로 정의한다.

테이터형
CHAR(n) : 최대 n자 까지의 고정길이 데이터 형
VARCHAR(n) : 최대 n자 까지의 가변길이 데이터 형
DECIMAL(m,n) : 소수점을 나타내기 위한 데이터 형 3.141592 => m = 7 , n = 6
INTEGER :양이나 음을 위한 데이터 형식
FLOAT : 부동 소수점 형태의 숫자를 위한 데이터형
BOOLEAN : 참거짓

--------------------------------------------------------------------------------------------

DML : database manipulation language

SELECT

SELECT 항목1,항목2
FROM 테이블
WHERE 조건;

-----

DISTINCT   ... distinct 명령어를 이용해서 중복된 행을 제거할 수 있다.

SELECT DISTINCT 항목1,항목2  
FROM...

-----

LIKE  ... 비슷한 char를 검색하는데 사용할 수 있다.

select..
from..
WHERE 공급자명 LIKE '%신%';

ex)
대%   => 대진공업, 대흥사 , 맨앞에 대가 들어가는 모든 문자열
%진% => 진아공업사, 삼진사, 진이 들어가는 모든 문자열
_신% => 2번째 글자에 신이 들어가는 문자열
삼진__ =>삼진으로 시작해서 총 4글자인 문자열

-----

BETWEEN .... 그 비트윈이다

select...
from...
WHERE 재고량 [NOT]BETWEEN 200 and 3000;

-----

IN

select..
from..
where 속성 [NOT] IN ('값1', '값2', '값3' );

-----

IS NULL ...항목명이 공값인지를 확인하기 위하여 사용된다.

select...
from...
where 부품내역 IS NULL;

-----

ODER BY ... 출력 항목들을 특별한 순서대로 정렬하고 싶을 때 사용

select..
from...
where...
ODER BY 항목명 [ASC/DESC], 두번째항목 [A/D]...

asc : 오름차순이며 디폴트는 이값을 가진다. 1234 ㄱㄴㄷㄹ
desc: 내림차순 321 ㄷㄴㄱ

-----

수식과 집단함수

집단함수 : SELECT 절이나 GROUP BY의 조건절 HAVING 문에서 사용


GROUP BY ... 요약할 항목을 지정하고 수식을 이용하여 표현. 중복된 값 제거

select 항목1, sum(항목명2).  MAX(항목명2) AS 최대값
from...
where...
GROUP BY 항목  --> 항목1 말고는 출력할 수 없다. 요약하고자 하는 정보 외의 행을 건드리지 않기위함일까??

수식
AVG(항목명)
COUNT(항목명 or *)
MAX(항목명)
MIN(항목명)
SUM(항목명)

수식 AS 행 제목  --> 을 통해서 수식의 결과를 나타내는 행에 제목을 부여할 수 있다.

도움글:
http://ryu1hwan.tistory.com/entry/SQL%EB%AC%B8-%EA%B8%B0%EC%B4%88%EC%97%90%EC%84%9C%EC%A4%91%EA%B8%89%EA%B9%8C%EC%A7%80L4GROUP-BY%EB%AC%B8


HAVING ... group by로 정렬 된 결과 테이블에 다시한번 조건문을 달 때 사용한다. 반드시 group by와 함께 사용한다.

ex) 부품번호가 140번 이하인 부품 중, 주문 단가 평균이 200원 이하인 부품의 번호와 주문 총액을 주문 총액이 적은 순으로 출력하라(주문액 = 단가 * 주문량)

SELECT 부품번호, SUM(단가 * 주문량)
FROM 주문 
WHERE 부품번호 <= 140
GROUP BY 부품번호
HAVING AVG(단가) < =200
ODER BY 2;

------

JOIN

select t1.속성1 , t2.속성
from table1 t1, table2 t2
where t1.속성 = t2.속성 ;

뭐 대충 이렇게 생겼다. 중요한건 서로다른 두 테이블들의 정보를 연결해서 조회한다는 것

이와같이 일반적인 JOIN문을 INNER JOIN, EQUI JOIN이라고 한다.


OUTER JOIN : join의 한 종류로서 기준이 되는 테이블의 데이터가 무조건 출력되도록 한다.

select t1.속성1 , t2.속성
from table1 t1, table2 t2
where t1.속성(+) = t2.속성 ;  => 기준이 되는 속성에 (+)를 붙여준다. (oracle)


또는

select t1.속성1 , t2.속성
from table1 t1 LEFT JOIN table2 t2
ON t1.속성 = t2.속성 ;                                

와같이 사용한다. RIGHT JOIN은 (+)의 위치와 LEFT 를 RIGHT로 바꿔주면 되곘다.

주의사항
select t1.속성1 , t2.속성
from table1 t1, table2 t2
where t1.속성(+) = t2.속성 
AND t1.속성2 = t2.속성2;

와 같이 한 문장에만 조인을 해버리면 and뒤에 문장 떄문에 일반 join문으로 처리된다.


FULL JOIN : 양쪽 다터

----
SELECT 중첩문

결합조건(조인)을 사용하면 복수테이블의 전체레코드를 검색하기 때문에 시간이 오래걸림
SELECT중첩문을 사용하면 검색조건에 부합하는 항목만 추출하여 상의질이에 전달하므로 보다 효율적인 검색 가능

select 공급자번호, 위치
from 공급자
where 공급자번호 IN(  select 공급자번호
                                from 주문
                                where 부품번호 IN (105 , 107)) ;

ll

select t1.공급자번호, t2.위치
from 공급자 t1, 주문 t2

where t2.부품번호 IN(105,107)
and t1.공급자번호 = t2.공급자번호


ALL / ANY / SOME
select 중첩문에서만 사용할 수 있는 연산자이며 비교연산자와 함께 사용한다.

selet 부품, 재고량
from 부품
where 재고량 > All (select 재고량
                            from 부품
                            where 부품내역 = '너트');


위와같은 중첩문이 있을떄 () 안의 결과가 

재고량
200
155

이라고 한다면 전체 문장의 결과는 '부품테이블의 제고량이 200도 넘고 155도 넘는 항목만 출력한다
some 이나 any를 사용한다면 200을 넘거나 155를 넘는 혹은 둘다 넘는 항목들이 출력되어진다.


자체결합 SELF JOIN
ex)

select s1.공급자번호, s1,공급자명, s1.위치
from 공급자 s1, 공급자 s2
where s1.공급자 = s2.공급자
and s1.공급자 <> s2.공급자; ====> != 의 의미

=> 같은 행의 중복이 안되도록 주의하자

상관내포절 : select 중첩문에서 하위질의와 상위질의의 평가가 같이 연결되어있는 경우

EXISTS : where [NOT] EXIST (중첩문)  , 중첩문의 결과가 있으면 true , 없으면 false

--------------------------------------------------------------------------------------------

DCL : database contrl Language

'~ 2014 > Database' 카테고리의 다른 글

트랜잭션  (0) 2014.06.15
클러스터드 인덱스 / 넌클러스터드 인덱스 / primary 인덱스  (0) 2014.06.15
트리거 trigger  (0) 2014.06.14

+ Recent posts