나는 다음 실험을 시도하고 비슷한 결과를 얻었습니다. 두 경우 모두 fn_dblog ()는 롤백이 발생하고 시나리오 1에서보다 시나리오 1에서 더 빨리 발생하는 것으로 보입니다.
그건 그렇고, MDF와 LDF를 동일한 단일 외부 (USB 2.0) 디스크에 배치했습니다.
필자의 초기 결론은이 경우 롤백 작동에 차이가 없으며 아마도 명백한 속도 차이는 I / O 하위 시스템과 관련이 있다는 것입니다. 그것은 현재 나의 작업 가설입니다.
시나리오 1 :
- 1MB에서 시작하고 4MB 청크 단위로 커지며 최대 크기가 100MB 인 로그 파일로 데이터베이스를 작성하십시오.
- 명시 적 트랜잭션을 열고 10 초 동안 실행 한 다음 SSMS 내에서 수동으로 취소하십시오.
- fn_dblog () 수와 로그 예약 크기를보고 DBCC SQLPERF (LOGSPACE)를 확인하십시오.
시나리오 2 :
- 1MB에서 시작하고 4MB 청크 단위로 커지며 최대 크기가 100MB 인 로그 파일로 데이터베이스를 작성하십시오.
- 명시 적 트랜잭션을 열고 로그가 가득 찼을 때까지 실행하십시오. 오류가 표시됩니다.
- fn_dblog () 수와 로그 예약 크기를보고 DBCC SQLPERF (LOGSPACE)를 확인하십시오.
성능 모니터 결과 :
시나리오 1 :
시나리오 2 :
암호:
사용 [마스터];
가다
IF DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0 인 경우
시작
ALTER DATABASE [SampleDB] SET SINGLE_USER
롤백 즉시;
DROP DATABASE [SampleDB];
종료;
가다
기본 데이터베이스 생성 [SampleDB]
(
이름 = N'SampleDB '
, FILENAME = N'E : \ data \ SampleDB.mdf '
, 크기 = 3MB
, FILEGROWTH = 1MB
)
로그온
(
NAME = N'SampleDB_log '
, FILENAME = N'E : \ data \ SampleDB_log.ldf '
, 크기 = 1MB
, MAXSIZE = 100MB
, FILEGROWTH = 4MB
);
가다
사용 [SampleDB];
가다
-테이블 추가
테이블 만들기 dbo.test
(
c1 CHAR (8000) NOT NULL DEFAULT REPLICATE ( 'a', 8000)
) ON [1 차];
가다
-의사 단순 복구 모델이 아닌지 확인
백업 데이터베이스 SampleDB
디스크 = 'NUL';
가다
-로그 파일 백업
백업 로그 SampleDB
디스크 = 'NUL';
가다
-사용 된 로그 공간을 체크
DBCC SQLPERF (로그 스페이스);
가다
-fn_dblog ()로 몇 개의 레코드를 볼 수 있습니까?
SELECT * FROM fn_dblog (NULL, NULL); -내 경우에는 약 9
/ *************************************
시나리오 1
************************************* /
-새 거래를 연 다음 롤백
거래 시작
dbo.test에 삽입 기본 값;
GO 10000-10 초 동안 실행 한 다음 SSMS 쿼리 창에서 취소를 누르십시오.
-거래 취소
-완료하는 데 몇 초가 걸립니다
-취소가 이미 처리했기 때문에 트랜잭션을 롤백 할 필요가 없습니다.
-- 그냥 시도 해 봐. 이 오류가 발생합니다
-메시지 3903, 수준 16, 상태 1, 줄 1
-ROLLBACK TRANSACTION 요청에 해당하는 BEGIN TRANSACTION이 없습니다.
롤백 거래;
-사용 된 로그 공간은 무엇입니까? 100 % 이상
DBCC SQLPERF (로그 스페이스);
가다
-fn_dblog ()로 몇 개의 레코드를 볼 수 있습니까?
고르다 *
Ffn fn_dblog (NULL, NULL); -내 경우에는 약 91,926
-fn_dblog ()로 표시된 총 로그 예약?
[총 로그 예약]으로 SUM ([로그 예약]) 선택
Ffn fn_dblog (NULL, NULL); -약 88.72MB
/ *************************************
시나리오 2
************************************* /
-DB를 날려 버리고 다시 시작하십시오.
사용 [마스터];
가다
IF DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0 인 경우
시작
ALTER DATABASE [SampleDB] SET SINGLE_USER
롤백 즉시;
DROP DATABASE [SampleDB];
종료;
가다
기본 데이터베이스 생성 [SampleDB]
(
이름 = N'SampleDB '
, FILENAME = N'E : \ data \ SampleDB.mdf '
, 크기 = 3MB
, FILEGROWTH = 1MB
)
로그온
(
NAME = N'SampleDB_log '
, FILENAME = N'E : \ data \ SampleDB_log.ldf '
, 크기 = 1MB
, MAXSIZE = 100MB
, FILEGROWTH = 4MB
);
가다
사용 [SampleDB];
가다
-테이블 추가
테이블 만들기 dbo.test
(
c1 CHAR (8000) NOT NULL DEFAULT REPLICATE ( 'a', 8000)
) ON [1 차];
가다
-의사 단순 복구 모델이 아닌지 확인
백업 데이터베이스 SampleDB
디스크 = 'NUL';
가다
-로그 파일 백업
백업 로그 SampleDB
디스크 = 'NUL';
가다
이제 트랜잭션 내에서 로그 파일을 정리해 봅시다
거래 시작
dbo.test에 삽입 기본 값;
GO 10000
-롤백이 발생하지 않습니다. 시도 해봐. 오류가 발생합니다.
-메시지 3903, 수준 16, 상태 1, 줄 1
-ROLLBACK TRANSACTION 요청에 해당하는 BEGIN TRANSACTION이 없습니다.
롤백 거래;
-로그 파일이 100 % 가득 찼습니까?
DBCC SQLPERF (로그 스페이스);
-fn_dblog ()로 몇 개의 레코드를 볼 수 있습니까?
고르다 *
Ffn fn_dblog (NULL, NULL); -내 경우에는 약 91,926
가다
-fn_dblog ()로 표시된 총 로그 예약?
[총 로그 예약]으로 SUM ([로그 예약]) 선택
Ffn fn_dblog (NULL, NULL); -88.72MB
가다