본문 바로가기

SQL/도움말 팁들!

대량의 테이블 N개 단위로 끊어서 삭제하기 몇천만건 정도되는 테이블을 정리하기 위해 삭제 작업을 하거나, 두 개 이상의 테이블을 조인해서 삭제하는 작업이 오래 소요될 것으로 예상될 경우 만건 단위나 십만건 단위로 작업을 하고 싶을 때가 있다. 이렇게 단위별로 나눠서 작업을 하게되면 아래와 같은 장점이 있다. 가령 특정 테이블을 삭제하는 Action을 했는데 예상외로 12시간 이상 삭제가 진행될 경우 이걸 Rollback 하기도, 끝나기를 기다리기도 애매하게 된다. (12시간 삭제 진행하다가 Rollback하게되면 거의 그만큼을 시간이 Rollback 하는데 소요된다.) 이럴 때 특정 건수 단위로 나눠서 했다면, 끊고 새로 시작한 시점까지만 Rollback 하면 된다. SET ROWCOUNT 10000 --// 삭제할Row 갯수단위 SET NOCO.. 더보기
로그파일 LDF 크기 줄이기 로그파일 사이즈가 너무 커져서 배보다 배꼽이 큰 경우가 간혹 발생한다. (DB MDF 사이즈는 4Gb 인데 LDF가 40Gb가 넘는... -_ -) 그럴 때 DBCC SHRINKFILE 혹은 SHRINKDB 를 사용하는데, 어라? 이걸 해도 용량이 하나도 줄지 않네? 라는 상황이 발생하는 분들이 있을거다. 이유인 즉슨, 해당 DB의 백업 정책이 Full 이면 SHRINK 가 동작하지 않는다. 그래서 임시로 Simple로 변경 후에 SHRINK를 해줘야 한다. 아래는 예시다. -- Truncate the log by changing the database recovery model to SIMPLE. ALTER DATABASE insa SET RECOVERY SIMPLE; GO -- Shrink the t.. 더보기
Sql Server 2000 에서 사용자 로그인계정 정보 가져오는 SP - sp_help_revlogin A blog on Australia's leading SQL Server consultants, trainers and Business Intelligence specialists sp_help_revlogin - 'LOGINPROPERTY' is not a recognized function name. sp_help_revlogin - 'LOGINPROPERTY' 인식할 수 없는 함수명입니다. The Microsoft Knowledge Base Article 246133 - How to transfer logins and passwords between instances of SQL Server details how to create the Stored Procedure sp_help_revlogin... 더보기
[mssql] 복제(Replication) 구성시 고려 할 점 - Distribution Cleanup에 관하여 출처 :: Gravity DB Team http://gdbt.tistory.com/40 SQL Server는 참으로 친절 하며 사용자에게 참으로 여러 가지 편의를 제공하여 감동을 준다!! 그중 본인을 가장 크게 감동 시키는건 머니머니 해도 "복제 마법사"가 데시겠다!!ㅇ0ㅇ!! 이건 머 배포 마법사, 게시 마법사, 구독 마법사 차례로 하나씩 들어가서 친절한 설명과 함께 시키느대로 다음~다음 클릭 하다보면 어느덧 복제된 데이터베이스 하나가 뚝딱 완성 되버리신다!!! 그렇게 얼마전 한대의 서버에 5개의 데이터베이스를 복제하여 쓰는 배포 겸 구독 서버를 구성해놓고 복제 구성은 별거 아니라고 생각하며 점점 잊혀져 가는데.. 어느날 복제 구성하며 쌓인 정이 생각나 서버에 들어가 보니 이 서버가 팝핀춤을 추며 버벅.. 더보기
[MSSQL] 자주 사용하는 전역변수(Global Variables) mssql에서 T-SQL을 사용할때 mssql의 현재 정보가 필요할때가 있습니다. 버전 정보라든지 현재 lock에 걸려있는 유저 정보라던지 아니면 중첩 트랜젝션중에 현재 트랜잭션이 몇번 중첩 되어 있는가 라던지 등등등... 이럴때 간단하게 현재 SQL SERVER 의 정보를 알 수 있게 해주는 아이들이 있습니다 이름하여,,,,, [전역 변수] 이죠..^^ 오늘은 이 전역 변수들중에 제가 자주 쓰는 아이들의 소개와 나머지 전역 변수들 중에는 어떤것을이 있는지에 대해서 알아 보겠습니다. 1. @@ERROR (사용자 접속에대해 시스템이 발생시킨 마지막 에러 번호 ) 먼저 @@ERROR 입니다. SQL 로 프로그래밍 할때 예외 처리는 기본이겠죠. 그렇게에러가 났을때 에러 정보를 담고있는 아이 입니다. 저에게 있.. 더보기
SQL Server 메모리 부족현상에 대한 대처 테스트 서버를 사용중에 발생한 현상이었다. 메모리 3G 정도에 사용자가 하나도 없는 한가한 상태의 서버였는데, 대용량의 테이블 복사와 인덱스 생성, Linked 서버와 연결시켜 이런 저런 작업을 하는데 왠지 모르게 서버가 버벅데는것 처럼 느껴졌다... 뭐지? 원격으로 접속하여 살펴보니.. 메모리가 95% 사용중.. 숨이 꼴딱꼴딱 넘어가기 일보직전인 것이다.. 그렇다고 SqlServr.exe를 죽일수도 없고.. 요걸 쑤욱~ 줄이는 방법이 없을까 살펴봤더니! sp_configure 'max server memory', 2048 ← MB가 default 인듯.. 2005 환경에서 실행했더니, 구성 옵션 'max server memory'이(가) 없거나 고급 옵션입니다. 라고 뱉어주더군.. 그래서 SSMS로 속.. 더보기
대용량 INSERT .. SELECT 작업 중 중지했을 때 대처 방안 8천만 건 정도의 Row를 가진 테이블을 가지고 작업 중에 난관에 봉착했다! target_table을 TRUNCATE 하고, 인덱스를 재정비 한 후, INSERT INTO target_table SELECT * FROM source_table 작업을 했는데 예상보다 시간이 너무 오래걸리는 것이다.. 8천만 건 넘기는데 대략 40시간..... OTL... (SELECT INSERT했을 때는 11분 정도 걸려서 너무 가볍게 봐버렸건 거다..) 하는 수 없이 SELECT INSERT 하고 인덱스 작업을 하는 것이 나을거라 판단하여, 기존 트랜젝션을 중지시켰는데, 이것이 죽질 않는다.. 강제로 죽여봤는데도 데이터는 계속 쌓여만 가네? 어라? sp_who 를 해보니 세션이 그대로 살아서 INSERT 작업을 진행중.. 더보기
테이블 row count 빠르게 계산하는 방법 흔히 테이블 레코드수를 계산하기 위하여 SELECT COUNT(*) FROM TABLE_NAME이런 쿼리를 사용한다. 이 쿼리는 레코드 개수가 얼마 안 될 경우에는 문제가 없으나,레코드 수가 많을 경우에는 상당히 부담이 가는 쿼리이다. 만일, 테이블의 PK에 인덱스가 있다면 아래의 시스템 테이블을 이용한 쿼리를 사용하는 것도 좋을 성 싶다. table_name에 실제 테이블명을 적어 주면 된다. SELECT si.rows FROM INFORMATION_SCHEMA.TABLES t INNER JOIN sysindexes si on (OBJECT_ID('table_name') = si.id and si.indid 더보기
SQL Server 2005에서 사용하지 않는 테이블을 찾아 정리하는 방법 SQL Server 2005에서 사용하지 않는 테이블을 찾아 정리하는 방법 1. sp_depends 아래 그림은 sp_depends 실행결과이다. tblCall10 번을 참조하는 프로시저들이 얼마나 있는지를 알 수 있다. 2. sysobjects 와 syscomments 두 개의 시스템 테이블을 이용하여 tblCall10 이라는 텍스트를 가진 모든 프로시저들의 목록을 볼 수 있다. 많을수록 여러 군데에서 참조하고 있음을 알 수 있다. SELECT DISTINCT a.name FROM sysobjects AS a INNER JOIN syscomments AS b ON a.id=b.id AND b.text LIKE '%tblCall10%' 3. sp_depends 프로시저 응용 편 특수한 시스템 테이블 몇 .. 더보기
DATETIME에서 지원하는 가장 빠른 날짜가 1753년인 이유는? 알아두면 좋은 MS-SQL 관련 토막상식01 DATETIME에서 지원하는 가장 빠른 날짜가 1753년인 이유는? - Tibor Karaszi, SQL Server MVP, Solid Quality Learning 좋은 질문이다. 이 제한사항에는 역사적인 이유가 있다. 서양에서는 두 개(줄리안력과 그레고리안력)의 달력을 사용해왔다. 어느 세기를 보느냐에 따라 줄리안력과 그레고리안력은 몇 일 정도의 차이가 났었고, 줄리안력에서 그레고리안력으로 표준을 변경하면서 약 10-13일 정도가 제거되었다. 대영제국에서는 1752년 줄리안력에서 그레고리안력으로 표준을 변경하였다.(그래서 1752년에는 1752년 9월 2일 다음 날이 1752년 9월 14일이 되었다.) Microsoft SQL Server의 전신인 Syb.. 더보기