본문 바로가기

SQL Server 2005

(28)
Vardecimal Storage Format을 사용하여 데이터베이스 사이즈 줄이기 decimal 데이터 타입을 가변 길이형으로 저장하여 데이터베이스 사이즈를 줄이고 I/O를 개선할 수 있다. 단, CPU에 추가로 발생하는 오버해드를 고려해야 한다. 사용 조건 - SQL 2005 SP2 이상 - Enterprise, Developer, Evaluation Edition - ALTER DATABASE 권한 sp_db_vardecimal_storage_format [ [ @dbname = ] 'database' ] [ , [ @vardecimal_storage_format = ] {'ON' | 'OFF' }] [ ; ] 다음과 같은 경우 sp_db_vardecimal_storage_format이 실패합니다. - 데이터베이스에 활성 사용자가 있는 경우 - 데이터베이스를 미러링에 사용할 수 있..
NON-IDENTITY 컬럼을 IDENTITY 컬럼으로 바꾸기 (출처 : http://www.sqlservercentral.com/articles/T-SQL/61979/) SQL Server 2005의 "ALTER TABLE ~ SWITCH ~ TO ~" 구문을 응용한 방법만 발췌하여 소개합니다. 1. 원본 테이블을 참조하는 모든 참조키를 DROP 한다. 2. 원본 테이블을 SCHEMABINDING 하는 모든 개체를 수정한다. (SCHEMABINDING 하지 않도록~) 3. 원본 테이블의 모든 인덱스를 DROP 한다. 4. 원본 테이블과 동일한 레이아웃의 테이블을 생성한다. 단, IDENTITY 속성을 가지도록 한다. 5. 원본 테이블에서 사본 테이블로 파티션을 스위치한다. 6. 원본 테이블을 DROP 한다. 7. 사본 테이블의 이름을 원본 테이블의 이름으로 변경한..
[Sequel Safe] 에러 핸들링 (下) ErrorHandler 레이블 에러 핸들링을 위한 루틴은 아래와 같이 레이블(Label)로 만듭니다. ErrorHandler: IF XACT_STATE() 0 ROLLBACK TRANSACTION; IF @intReturnValue IS NULL OR @intReturnValue = 0 EXEC @intReturnValue = dbo.P_AddErrorLog; RETURN @intReturnValue; ErrorHandler 레이블에서의 프로세스는... 1. 현재 트랜잭션이 열려있으나 commit할 수 없는 상태이면, 트랜잭션을 rollback 한다. 2. @intReturnValue 변수의 값이 NULL이거나 0이면, P_AddErrorLog를 호출하고 해당 SP의 리턴 값을 @intReturnValu..
[Sequel Safe] 에러 핸들링 (上) Stored Procedure에서의 에러 핸들링은 매우 중요한 주제입니다. 따라서, 에러를 핸들링하는 방법은 그 규칙을 정해 모든 개발자가 지키도록 하는 것이 바람직하다고 생각합니다. 에러 핸들링을 아예 하지 않는 것도 좋지 않고, 개발자마다 각자의 방식을 사용하는 것도 좋지 않습니다. 누군가가 이 역할을 맡아 주어야 하는데, DBA가 해주면 좋지만 여건이 되지 않는다면 이 글을 읽고 계신 여러분이 직접 해 보는 건 어떨까요? 에러에는 어떤 종류가 있을까? 간단히 분류해 본다면, 논리적 에러와 시스템 에러가 있습니다. 여기서 시스템 에러를 다시 둘로 나누면, 에러는 다음과 같이 분류할 수 있습니다. 1. 논리적 에러 로직을 처리하는 과정에서 "예외 사항"로 분류하여 실행을 중단하거나 롤백 해야 하는 상황..
모든 테이블의 데이터 일괄 삭제하기 프로젝트 초기에 개발 DB에서 자주 사용할 만한 쿼리일 듯 ^^ EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL' EXEC sp_MSForEachTable 'DELETE FROM ?' EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL' EXEC sp_MSForEachTable 'ALTER TABLE ? ENABLE TRIGGER ALL' 출처 : http://www.devx.com/dbzone/Article/40967 하지만, 그대로 사용하기엔 좀 부족해 보인다. 아래 사항을 추가해서 ..
로그 DB 설계와 관리에 대한 컨셉 (슬라이딩 윈도우) 첫째, 로그를 DB에 적재하는 방법 1. 대량 로그이고 다음날 조회해도 되는 경우 => 로그를 파일로 쌓고, 필요한 것만 daily batch로 DB에 적재 2. 대량 로그이지만 실시간 조회가 필요한 경우 => 로그의 DB적재를 비동기 처리할 수 있는 미들웨어를 만듭니다. 3. 대량 로그가 아닌 경우 => Application Server에서 직접 DB에 INSERT 합니다. 둘째, DB에 적재한 로그 테이블의 용량을 관리하는 방법 1. 보통 슬라이딩 윈도우 기법을 사용합니다. A. 테이블을 일자 기준으로 파티셔닝하고, 기준 일자가 지난 데이터는 파티션을 스위치해서... 데이터를 다른 테이블로 옮기는 방식입니다 B. 이 방식을 사용하면 대량 데이터를 옮기는 동안에도 해당 테이블에 Lock이 걸리지 않습니..
Login을 각 Database의 User와 동기화하기 백업 파일로부터 DB를 새로 복원할 때 곤란한 점은 일일이 DB의 User와 SQL서버의 Login을 매핑해 줘야 한다는 점이다. 아래 스크립트를 사용하면 이 작업을 한번에 처리할 수 있다. 1. User와 Login의 Sync가 맞지 않는 내역이 있는지 확인 DECLARE @nvcCollation sysname; DECLARE @nvcStmt nvarchar(4000); DECLARE @tblTemp table ( DBName sysname NOT NULL, UserName sysname NOT NULL, LoginName sysname NOT NULL ); SET @nvcCollation = CAST(DatabasePropertyEx('master', 'Collation') AS sysname); S..
SQL Server 2005 Performance Dashboard Reports에서 Difference of two datetime columns caused overflow at runtime 에러 Fix하기 오늘 갑자기 Performance dashboard report에서 아래와 같은 에러가 발생했다. idle_connection_time을 구하는 과정에서 DATEDIFF함수로 두 날짜 사이의 차이를 Millisecond로 구하다보니... int값의 범위를 초과해 발생하는 에러였다. 처음 설치할때 사용한 setup.sql파일에서... sum(convert(bigint, datediff(ms, login_time, getdate()))) - sum(convert(bigint, s.total_elapsed_time)) as idle_connection_time, 위 구문을 아래 구문처럼 수정해 주고... sum(convert(bigint, cast(datediff(minute, login_time, getda..