전체 글

'DBA 업무'와 '알게되는 정보'를 기록하는 공간
병렬처리 기법단일 쿼리에서 다수의 CPU 를 사용할 수 있는 병렬처리 기법을 지원하고 있습니다.( Enterprise 버전에서 지원되고 있습니다. ) 병렬처리를 하게 되는 경우 CPU 사용률은 높아지지만 응답속도는 더 빨라질 수 있습니다.그렇다면 어떤 SP 가 병렬처리 되고 있는지 확인해 봅니다. SP 가 병렬처리되는지 확인하는 쿼리라이브에서 운영중인 쿼리는 대부분 SP 를 통해서 수행되고 있으며,어떤 SP 가 CPU 를 몇 개를 사용하는지 알 수 있는 DMV 를 제공하고 있습니다. 아래 쿼리는 플랜캐시를 통해 병렬처리되는 실행계획을 가지고 있는 DB 명, SP 명, CPU 사용 수를 반환합니다.실행계획에서만 확인할 수 있기 때문에 실행계획이 플랜캐시에 없는 경우 병렬처리 되는지 확인할 수 없습니다. 1..
TempDB 를 사용하는 경우1. 임시 테이블, 테이블 변수와 같은 임시 사용자 객체2. 커서3. 스풀이나 정렬을 위한 작업 테이블4. 스냅샷에서 isolation 을 위한 행 버전 관리5. 온라인 인덱스 재 구축 작업6. MARS ( Multiple Active ResultSets, 다수의 활성 결과 집합 )7. 트리거 등 TempDB 와 연관된 DMV 뷰dm_db_file_space_usage : tempdb 의 각 파일에 대한 공간 사용량 정보를 반환합니다.dm_db_session_space_usage : 각 세션에 의해 할당 및 할당 해제 된 페이지 수를 반환합니다.dm_db_task_space_usage : 작업 별 페이지 할당 및 할당 해제를 반환합니다. 이러한 뷰를 dm_exec_sessio..
Order By 없는 쿼리란데이터의 출력이 항상 일관되지 않다는 것을 의미합니다.즉, [ 1, 2, 3 ] 순으로 출력되던 결과가 [ 3, 1, 2 ] 로 출력 될 수도 있습니다. Order By 유무에 따른 쿼리아래와 같은 쿼리가 있습니다.이 쿼리는 데이터의 출력이 항상 일관되다는 것을 보장할 수 있을까요?병렬로 출력하게 된다면 출력버퍼에는 매번 다른값이 출력되고 TOP 20 으로 나온 값은 매번 다르게 될 것입니다.즉, 의도하지 않은 값이 임시테이블에 들어갈 수 있게 됩니다. 12345INSERT @TEMP_TABLESELECT TOP(20) C1FROM dbo.T1 WITH(NOLOCK)WHERE C1 > @C1AND C2 = @C2cs 그럼 이 쿼리를 어떻게 변경해야 할까요?ORDER BY 를 넣..
파티션사전적인 의미로 칸막이, 분할 등을 의미합니다.데이터베이스 관점에서 보면 테이블과 인덱스를 분할하여 저장하는 개념입니다. 테이블이나 인덱스를 정의할 때 컬럼 값 기준으로 분할함으로써 각 파티션이 물리적으로 다른 곳(파일그룹)에 위치하도록 할 수 있습니다. 1. SQL Server 는 현재 (2019) Range 파티션만 제공하며 파티션 키는 단일 컬럼만 가능합니다.2. Range 파티션 정의 시 left (경계값보다 작거나 같은) 와 right (경계값보다 작은) 옵션을 지정할 수 있습니다.3. 파티션을 N 개를 정의하면 N+1 번의 파티션이 자동으로 생성되며, N 파티션에 속하지 않은 모든 데이터가 들어갑니다. 파티션의 필요성월별 1억 건씩 10년치의 명세서가 저장되어 있는 테이블에서 특정 거래월..
· AWS/기타
결제가 된 발단AWS 계정을 생성하면 Free Tier 를 1년간 테스트 용도로 사용할 수 있습니다.몇가지 테스트 용도를 위해 1년전 계정을 생성하고 테스트 완료 후 인스턴스를 중지 시켜 놓았습니다. 이렇게 완전히 방치된 채로 1년이 지났습니다.갑자기 우리카드에서 AWS 로 결제가 되었습니다. 인스턴스 중지는 시켜놓았지만 볼륨은 차지하고 있었기에볼륨에 대한 비용이 청구가 된 것입니다. AWS 에 이에 대해 문의를 했고, 최종적으로는 환불을 받았습니다. AWS 고객센터 환불문의 방법1. AWS 에 로그인을 합니다.https://aws.amazon.com/ko/ 2. 지원 탭에서 지원센터를 누릅니다.3. 'Create Case' 버튼을 클릭합니다. 4. Account and billing support 를 ..
데이터 삭제 시 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..
꽁담
꽁담