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 |
>> 활용방안
통계 수집
기타..
'SQL Server 2005' 카테고리의 다른 글
SQL Server 2005의 Bulk Insert 성능 비교 (0) | 2009.10.16 |
---|---|
SQL 템플릿 관리,, (0) | 2009.07.16 |
끝 공백 문자들을 SQL에서는 어떻게 처리하는 걸까?? (0) | 2009.05.22 |
Login failed for user ’sa’ because the account is currently locked out. The system administrator can unlock it. (0) | 2009.05.13 |
::fn_dblog(null, null); (0) | 2009.04.16 |