[ MSSQL ] 데이터의 물리적 구조

Posted by 알 수 없는 사용자
2015. 6. 2. 08:13 프로그래밍/데이터베이스

CREATE DATABASE TEST

'TEST' 데이터베이스 생성시
TEST라는 논리적 이름을 가진 물리적 파일이 존재하게 된다.

위 그림과 같이
*.mdf, *.ndf ( 데이터파일 ) : 실제 데이터들이 저장된다.
*.ldf : 로그파일이 저장된다.
로 구성된다.

[ 데이터파일 / 로그파일 바로가기 ]

 

 데이터의 저장 구조를 살펴보면

위 그림과 같이 사용자는 SQL Server Management Studio 와 같은 인터페이스를 통하여 데이터파일과 로그파일에 데이터를 저장한다.
데이터 저장 시 데이터 파일은 로그파일과 다르게 순차적으로 저장되지 않는다.

데이터 파일Page(8KB) 라고 불리는 최소 저장 단위에 저장된다.
즉, 실제 내용인 행 데이터들은 각 페이지에 저장되는 것이다.

그리고 하나의 테이블이나 인덱스는 물리적으로 연속 8페이지로 구성된 Extend(64KB)에 저장된다.

[ Page / Extend 바로가기 ]

 

헌데, 한 행의 크기가 8KB가 넘는 데이터들은 어떻게 페이지에 저장될까?
이 경우 SQLServer는 IAM(Index Allocation Map)이라 불리우는 페이지에 해당 데이터를 저장한다.

IAM 페이지는 할당 단위에 사용되는 데이터베이스 파일의 4GB 부분에 Extent를 매핑한다.
할당 단위의 유형은 아래 세 가지가 있다.
  • IN_ROW_DATA : 힙 또는 인덱스의 파티션을 포함
  • LOB_DATA : 데이터의 LOB(Large Object) 데이터 형식을 포함
  • ROW_OVERFLOW_DATA : 8KB의 행 크기 제한을 초과한 가변 길이의 데이터를 포함

로그 파일은 Insert, Update 등 데이터를 변경하는 동작을 처리 할때 로그를 남긴다.
데이터가 변경될 때 데이터 파일에 변경된 데이터를 쓰고 성능이 저하됨에도 불구하고 로그파일에도 쓰는 이유는 무엇일까?
이유는 DBMS의 가장 근본적인 목적 중 하나인 데이터베이스의 무결성 때문이다.
즉, 트랜잭션 로그파일을 통해 잘못된 작업일 경우 Rollback tran을 선언하여 트랜잭션을 취소시켜 데이터를 작업 이전에 데이터로 보존 할 수 있다.

 

 

 

출처 : http://egloos.zum.com/sweeper/v/3003333

 

 

 

 

 

'프로그래밍 > 데이터베이스' 카테고리의 다른 글

NOSQL  (322) 2015.11.06
[ MSSQL ] 데이터 파일(.mdf/.ndf)과 로그파일(.ldf)  (4) 2015.06.02
[ MSSQL ] Page와 Extend  (4) 2015.05.27
MSSQL vs MySQL vs Oracle  (318) 2015.04.10

[ MSSQL ] 데이터 파일(.mdf/.ndf)과 로그파일(.ldf)

Posted by 알 수 없는 사용자
2015. 6. 2. 08:12 프로그래밍/데이터베이스

.MDF, .NDF, .LDF 파일은 데이터베이스의 데이터파일과 로그파일을 의미한다.
데이터파일과 로그파일은 데이터베이스의 의해 개별적으로 관리된다.

MSSQL에서 관리되는 파일은 다음과 같이 3가지 타입이다.

* Primary Data File
주 데이터 파일은 데이터베이스의 시작 지점이며 데이터베이스의 나머지 파일을 가리킵니다. 모든 데이터베이스에는 하나의 주 데이터 파일이 있습니다. 권장되는 주 데이터 파일 확장명은 .mdf입니다.

* Secondary Data File
보조 데이터 파일은 주 데이터 파일이 아닌 모든 데이터 파일을 구성합니다. 데이터베이스에 따라 보조 데이터 파일이 없을 수도 있고 여러 개 있을 수도 있습니다. 권장되는 보조 데이터 파일 확장명은 .ndf입니다.

* Log File
로그 파일에는 데이터베이스를 복구하는 데 사용되는 모든 로그 정보가 들어 있습니다. 데이터베이스에 로그 파일이 두 개 이상 있을 수 있으며 데이터베이스마다 적어도 하나의 로그 파일이 있어야 합니다. 권장되는 로그 파일 확장명은 .ldf입니다.


위 그림과 같이 데이터베이스 파일은 반드시 Primary 파일그룹을 가지고 Primary 파일그룹안에는 반드리 .mdf 파일이 존재해야 한다.
그리고 .ldf 파일 역시 반드시 존재해야하고, .ndf 파일은 보조 데이터 파일이기 때문에 반드시 존재할 필요는 없다.

데이터베이스에 생성되는 주 데이터 파일인 .mdf 파일과 함께 보조 데이터 파일인 .ndf 파일을 생성하는 이유는 무엇일까?

데이터파일에 저장 시 파일그룹을 나눠 저장하면 하나의 파일그룹을 사용할 때 보다 좋은 효과를 낼 수 있다.
예를 들어,
어떤 데이터베이스에 테이블이 10개가 있다. 3개의 테이블을 가장 많이 사용하고 나머지 7개의 테이블은 거의 사용을 안한다고 생각해 보자.
이때 데이터베이스를 파일 그룹으로 생성하고 많이 사용하는 3개의 테이블을 프라이머리 파일그룹에 생성해 물리적인 하나의 디스크에 구축한다
아울러 자주 사용하지 않는 7개의 테이블을 보조 파일 그룹에 생성해 또 다른 물리적인 디스크에 구축하는 것이다.
그렇게 되면 물리적으로 다른 디스크를 사용하게 되니 하나의 디스크를 사용 할 때 보다 데이터파일 사용의 경쟁이 줄 것이다.

이렇듯 보조 데이터 파일을 생성하여 데이터 관리를 효율적으로 하게되면 데이터 베이스의 성능을 높힐 수 있을 것이다.


데이터파일과 달리 데이터가 순차적으로 저장되는 로그파일이 있다.

앞서 언급한 바와 같이 데이터파일에 쓰고 난 후 로그파일에 까지 쓰면서 데이터베이스의 성능이 낮아질 수 있다.
그런데도 불구하고 로그파일을 쓰는 이유는 무엇인가?

그것은 바로 완전한데이터, 즉 데이터베이스의 무결성 때문이다.

가장 흔한 예로 "게임의 아이템 거래"를 들 수 있다.
A가 B에게 "+10 일본도"를 거래창을 통해 건네준다고 가정해 보면, 기본적인 처리 흐름은 아래와 같을 것이다.
B의 인벤에 "+10 일본도를 추가할 수 있는지 예외 처리
  1. B의 인벤에 "+10 일본도"를 삽입
  2. A의 인벤에서 "+10 일본도"를 제거
그런데, 만약 2번 과정까지만 정상적으로 처리되고, 정전이나 하드웨어 문제가 발생한다면 어떻게 될까?
B의 인벤에도 "+10 일본도"가 생기고, A의 인벤에서도 "+10 일본도"가 남아 있다면?

위 그림과 같이 이런 일을 제대로 된 트랜잭션 처리 + 트랜잭션 로그 파일을 통해 막을 수 있다.
SQLServer는 트랜잭션 로그 파일을 사용함으로써, 다시 전기가 들어왔을 때
  • B의 인벤에서 "+10 일본도"를 다시 제거하거나,
  • A의 인벤에서 "+10 일본도"를 제대로 제거해 주어야 한다.
물론 B의 인벤에서 "+10 일본도"가 제거된다면, A와 B는 다시 거래 과정을 거쳐야겠지만, 
고가의 아이템이 복사되는 대형 사고는 발생하지 않을 것이다.

이것이 데이터베이스의 무결성이며 , 로그파일을 사용하는 이유이다.

그리고 로그파일은 모든 행위에 대하여 기록을 남기는 것이 아니라, insert나 update등 데이터의 변화가 생길 시 기록을 남긴다.
즉 select와 같이 데이터의 변화없이 조회를 하는 행위는 로그파일에 기록되지 않는다.




출처 : http://www.tiptech.net/lecture/sql/sql2000/dbase2.html

'프로그래밍 > 데이터베이스' 카테고리의 다른 글

NOSQL  (322) 2015.11.06
[ MSSQL ] 데이터의 물리적 구조  (4) 2015.06.02
[ MSSQL ] Page와 Extend  (4) 2015.05.27
MSSQL vs MySQL vs Oracle  (318) 2015.04.10

Python 데코레이터(Decorator)

Posted by jungbbong
2015. 5. 30. 03:11 프로그래밍/Python

파이썬에서 가장 중요한 구문중 하나인 데코레이터


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


데코레이터를 쓸때 사용하는 키워드인 @


@를쓰는 파이썬의 데코레이터는 자바의 어노테이션과는 다르게 사용된다 ->해당글은 파이썬의 데코레이터만 다루기 때문에 자바의 어노테이션은 생략한다


디자인 패턴중 하나로도 알려진 데코레이터는 이름에서 직관적으로 알수 있듯, 함수의 선언할때붙어서 해당 함수를 꾸며주는 기능이다


아래의 코드는 파이썬의 데코레이터의 샘플 코드이다 




코드에서 보면 알수 있듯 function앞에 @decorator가 붙어서 함수앞에 부가적인 작업을 하도록 하는것이다.


python은 함수마저도 객체로 사용된다 그렇기때문에 함수안에 내용을 덧붙이지않고 해당 객체와는 다르게 돌아가도록 섞이지는 않지만 꾸며줄수는 있도록 


원래의 작업앞에 필요한 작업을 하도록 한다.



출력내용

hello world


이제 python의 decorator를 이용하여 elapsed time을 찍어주는 프로그램으로 변화시켜보도록하겠다



출력내용

welcome to

hello world

with python


출력내용을 보면 알수 있듯 decorator는 함수의 수행할때 함수객체를 파라메터값으로 받아서서 함수의 앞뒤를 꾸며줄수도 있으며 함수의 전처리과정에 개입을 하는 역할을 하기도한다.



html에 쓰이는 tag표시를 할때에 많이 쓰이는 기법이기도 하다 




여기에서는 덧붙임 말을 표현하고 있지만 다른 응용의 예로는 함수의 수행시간을 계산할때에도 사용된다.




참고사이트