데이터 삭제 시 TabLock 의 이슈가 발생T1 테이블의 인덱스는 아래와 같이 구성되어 있습니다. 인덱스 종류 컬럼 Clustered Index + PK C1, C2, C3, C4 이 때, 라이브 중에 아래와 같은 쿼리를 사용하여 데이터를 삭제하려고 합니다.1DELETE FROM dbo.T1 WHERE C2 = 73985cs 문제는 T1 에 C2 의 인덱스가 없어서,TabLock 이 발생하게 되고 이 시간동안에는 다른 테이블이 접근할 수 없다는 점입니다. 이런 경우 TabLock 없이 어떻게 삭제 작업을 진행할 수 있을까요?시퀀스 (identity column)를 잘 활용해 봅시다.(T1 테이블에 너무 많은 데이터가 있다면 이 작업은 적절치 않을 수 있습니다.) TabLock 없이 삭제 방법1. 작업용..
분류 전체보기
PK 란 ? PK 로 구성된 컬럼은 해당 값은 고유하며 NULL 이 될 수 없다를 의미합니다.즉 PK 로 조회하거나 데이터 변경시에는 무조건 1건만 적용됩니다. 데이터 변경 시, 왜 PK 로 지워야 하나? 1. 원치않는 데이터가 지워지는 경우를 방지데이터 업데이트 혹은 삭제 작업을 할 때,일반적인 인덱스 혹은 테이블 스캔으로 조건을 지정하는 경우원치 않는 데이터가 지워질 수 있음을 방지할 수 있습니다.이 말인 즉 C1, C2 컬럼을 PK 로 가진 테이블의 C1 = 2, C2 = B 를 지우려고 의도하였으나,DELETE FROM T1 FROM C1 = 2 쿼리를 날리게 되어 C2 = A 도 지워질 수 있음을 방지할 수 있다는 것입니다. C1 C2 1 A 2 A 2 B 3 A 2. Lock 이슈PK 가 아닌..
서브쿼리에서 옵티마이저의 실행계획아래와 같은 쿼리가 있다고 가정해 봅니다. 123456SELECT TOP 20 * FROM T1 WHERE C2 IN ( SELECT C2 FROM T2 WHERE C3 = 'ABC' )ORDER BY C1cs 보통의 경우 옵티마이저는 아래와 같은 실행계획을 세우게 됩니다.1. T2 테이블 C3='ABC' 인 C2 컬럼 데이터를 가져온다.2. T1 테이블의 C2 컬럼에 가져온 데이터가 존재하는 데이터를 가져온다.3. 이렇게 최종적으로 나온 데이터를 C1 컬럼으로 정렬하여 20 건만 출력한다. 이번 포스팅은 조금 특수한 경우로 아래 쿼리의 경우,부모쿼리부터 데이터를 가져오면서 서브쿼리와 비교하는 실행계획을 세우게 된 케이스 입니다. 1234567SELECT TOP 20 T1..
foreign key (외래키)1. 관계를 맺고있는 릴레이션 R1, R2 가 있을 때 R1이 참조하고 있는 릴레이션 R2의 기본키와 같은 R1 릴레이션의 속성을 말합니다.2. 외래키는 참조되는 릴레이션의 기본키와 참조관계를 맺는데 중요한 Key 입니다. 말이 어려울 수 있으니 간단하게 테이블로 참조해보도록 하겠습니다. Blogs 테이블에는 BlogID 의 기본키가 있습니다. Posts 테이블에는 BlogID 를 외래키로 참조하여 구성하였습니다. 즉, 하나의 Blogs 에는 여러개의 Posts 를 구성할 수 있다는 관계를 나타내고 있습니다. 이처럼 DB 에서 설계, 관계도는 매우 중요합니다.그럼에도 많은 사이트에서 foreign key 를 사용하지 않는 경우가 많습니다. foreign key 를 왜 사용하..
syspolicy_purge_history 배치작업SQL Server 2008 버전부터 엔진을 설치하면 syspolicy_purge_history 배치잡이 생성되어 있습니다. 2008 버전에 PBM (Policy Based Management) 기능이 도입되면서 생성되었는데,PBM 이란 xp_cmdshell 이 활성화가 안되거나, Auto-shrink 검사 등의 조건을 정의해 놓는 정책을 말하며이 정책이 실행될 때마다 결과가 msdb 데이터베이스에 기록됩니다. 기록된 데이터 중 보관기간(HistoryRetentionInDays 속성)보다 오래된 데이터는 지우기 위해 자동으로 생성되는 작업이 syspolicy_purge_history 입니다. syspolicy_purge_history 배치작업 단계1. V..
CEIP 란 SQL Server 2016 이상 버전에서는 설치 시 'Microsoft 에 오류 전송 기능' 을 비활성 할 수 없습니다.이 기능은 CEIP (Customer Experience Improvement Program) 으로 불립니다.오류 전송 기능을 하기 위해 SQL Server 에 TELEMETRY 세션이 붙어 여러 정보를 수집해 갑니다. Microsoft 에 오류를 자동 전송해 기능 개선에 도움을 준다지만저희 입장에서는 별 쓸모가 없는 리소스만 잡아먹는 작업입니다. 기능 제거 방법1. SQL Server CEIP 서비스 확인1. 서비스로 들어갑니다.2. 네모박스로 보이는 CEIP 와 관련된 서비스가 있으면 아래 단계를 계속 진행합니다.(MSSQLSERVER) 는 인스턴스 명을 나타내며, 설..
SP 검수 시 체크해야 할 리스트 * SQL Server 기준으로 작성하였습니다. 1. Ad-hoc, 동적 쿼리 제거1. Ad-hoc, 동적 쿼리는 실행 시 쿼리가 어떻게 구성되는지 알 수 없습니다. 구성을 알 수 없으면 인덱스가 적절하게 구성되었는지, 실행계획이 잘못풀려 악성쿼리인지 아닌지를 판단할 수 없습니다. 2. where 절 체크 사항1. 동일한 데이터 타입끼리 비교되는지 확인합니다. 서로다른 데이터 타입끼리 비교 시 CONVERT 함수가 사용되기 때문에 인덱스 사용을 할 수 없습니다.2. OR 문은 UNION ALL 로 변경 OR 문은 상황에 따라 Scan 으로 풀릴 가능성도 있습니다. UNION ALL 로 쿼리를 Seek + Seek 하는 방식으로 변경이 가능한지 확인합니다.3. CASE 문..
데이터 대량 변경 작업 시 체크해야 할 리스트 1. 서비스 영향도 확인1. 시간이 얼마나 소요될지에 대해 파악되면 이에대한 영향도를 개발팀에 확인 요청합니다. 2. 데이터 프리징이 가능한지 확인1. TAB LOCK 으로 대량 변경 작업 진행 시 더 빠르게 처리할 수 있습니다. 이는 ROW Lock 과 TAB Lock 에서 트랜잭션 로그가 쌓이는 방식에 대해 이해하고 있어야 합니다.2. 이 때는 점검을 걸어야 하고, 서비스가 불가능 합니다. 3. 대량 DELETE 작업 시 INSERT 작업이 더 효율적인지 비교1. ROW 별로 DELETE 작업을 진행하는 것보다 DELETE 대상이 아닌 데이터를 새로운 테이블에 INSERT 하는 작업이 효율적일 수 있습니다. 프리징이 되었다는 가정에서 새로운 테이블로 IN..
컬럼 삭제 시 체크해야 할 리스트 1. SP, 배치작업, 타 서비스에서 컬럼을 사용하고 있는지 확인 2. 인덱스에 구성된 컬럼인지 확인1. 단일 인덱스에 구성된 컬럼인 경우 https://mozi.tistory.com/337 링크를 먼저 참고합니다.2. 복합 인덱스에 구성된 컬럼이면, 컬럼이 제거되면서 해당 인덱스로 구성된 다른 컬럼 순서가 계속 사용되는지 확인합니다. 예) A, B, C 로 구성된 인덱스에서 B 가 삭제되는 경우 A, C 로 구성된 인덱스를 계속 사용할 지 확인 - 인덱스에서 컬럼을 빼는 작업은 안되며, A, C 로 재구성 작업을 진행해야 합니다. 3. 컬럼을 바로 삭제하려고 하지마십시오.1. rename 으로 컬럼 명을 변경하여 삭제와 같은 상황만 만들어 둡니다. 유사 시 빠르게 복원..
인덱스 삭제 시 체크해야 할 리스트 * SQL Server 기준으로 작성하였습니다. 1. 쿼리 힌트에 인덱스가 사용되지는 않았는지 확인 2. 쿼리 실행계획이 변경될 가능성이 있는지 확인1. 기존 쿼리가 삭제될 인덱스를 사용하는 경우 실행계획이 변경되게 되고 이로인해 이슈가 될 수 있는지 확인합니다. 3. 인덱스에 접근하는 쿼리가 있는지 확인1. dm_db_index_usage_stats 의 동적뷰에 마지막 접근 시간이 기록됩니다. 해당 뷰를 조회해서 인덱스가 지금도 사용되고 있는지 확인합니다. 4. ★ 인덱스를 바로 삭제하려고 하지마십시오.1. rename 으로 인덱스 명을 변경하여 삭제와 같은 상황만 만들어 둡니다. 유사 시 빠르게 복원이 가능하도록 준비하고 있어야 합니다. ( 인덱스 재생성 시, 테이..