MSSQL의 복구 모델은 3가지가 있다


1.     Full 복구

DML(UPDATE, DELETE, INSERT) 동작에 대한 모든 변경된 모든 행들을 기록

2.     BULK_LOGGED 복구

BULK INSERT, BCP, CREATE INDEX, SELECT INTO~~ 에 대한 최소한의 로그 공간을 사용

3.     SIMPLE 복구

트랜잭션 로그는 정기적으로 잘려진다.

 

위의 3가지 중 OLTP 환경에서는 Full 복구 모델을 사용하고 있다. 로그는 SIMPLE 모델로 데이터의 속성에 따라 다르다.

 

DML문의 최소 로그 처리 방법이 무엇이냐? 

DML문이 동작을 하면 변경된 모든 행들을 트랜잭션 로그에 기록을 한다. 서버에서 주기적으로 배치 작업 형태의 INSERT, DELETE, UPDATE 등의 처리 속도를 향상시키는 방법은 배치 작업에 대한 트랜잭션 로그 수를 줄이게 된다면 처리 작업 진행에 대한 속도 향상 시킬 수 있다.  아래의 예제를 참고하자.

 

 

게임에서 주기적으로 통계,기타 등등의 배치 형태의 작업이 존재한다면 아래와 같은 방법으로 성능 개선해 보자.

 

샘플>>

SET NOCOUNT ON          

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

GO

 

USE master

go

 

create database t_log_test

go

 

use t_log_test

go

 

-- 트랜잭션로그를디스크에반영하구..

checkpoint;

go

 

 

select * from ::fn_dblog(null,null)

go

 

---- 체크포인트들만남았다.

--Operation        Context

--LOP_BEGIN_CKPT        LCX_NULL

--LOP_END_CKPT           LCX_NULL

--GO

 

-- 로그활성화

dbcc traceon (3604)

dbcc traceon (2588)

go

 

 

select @@version

go

 

--Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)   Nov 24 2008 13:01:59   Copyright (c) 1988-2005 Microsoft Corporation  Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)

 

 

if object_id('tblx') is not null

             drop table dbo.tblx

go

 

create table dbo.tblx

(

             cola varchar(10)

             ,colb varchar(10)

             ,colc varchar(10)

)

go

 

 

-- 순간적으로한꺼번에반영할수있는데이타들을스피드하게처리할수가있을까?

truncate table tblx

go

 

checkpoint;

go

 

 

-- 10개의row

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('d','e','f')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

go

 

 

select * from ::fn_dblog(null,null)

go

 

-- 한로우마다insert할때아래와같은트랜잭션로그가기록이된다.

--Operation        Context

--LOP_BEGIN_XACT        LCX_NULL

--LOP_INSERT_ROWS     LCX_HEAP

--LOP_COMMIT_XACT     LCX_NULL

go

 

 

 

truncate table tblx

go

 

checkpoint;

go

 

 

-- 10개의row

begin tran

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

insert into tblx values('d','e','f')

insert into tblx values('a','b','c')

insert into tblx values('a','b','c')

commit tran

 

if @@trancount > 0 rollback tran

go

 

 

select

[rowlog contents 0],

[rowlog contents 1],

[rowlog contents 2],

*

 

from ::fn_dblog(null,null)

 

go

-- 31

 

 

 

--- 많은양의로그량을줄일수가잇다.

--LOP_COMMIT_XACT

--LOP_INSERT_ROWS

--LOP_SET_FREE_SPACE

--LOP_INSERT_ROWS

--LOP_INSERT_ROWS

--LOP_INSERT_ROWS

--LOP_INSERT_ROWS

--LOP_INSERT_ROWS

--LOP_INSERT_ROWS

--LOP_INSERT_ROWS

--LOP_INSERT_ROWS

--LOP_INSERT_ROWS

--LOP_COMMIT_XACT

 

 

>> 적용 방안의 예

begin tran

             exec dbo.u_a

             exec dbo.u_a

             exec dbo.u_a

             exec dbo.u_a

             exec dbo.u_a

             exec dbo.u_a

             exec dbo.u_a

             exec dbo.u_a

             exec dbo.u_a

             exec dbo.u_a

commit tran

 

if @@trancount > 0 rollback tran

 

>> 활용방안

통계 수집

기타..