플랜캐시 & 실행계획SQL Server는 한번 실행된 쿼리는 처음 만들어진 실행계획을 플랜캐시에 등록하여 이후에 재사용합니다.특정 조건을 만족하여 쿼리의 실행계획이 재 컴파일 되기 전까지는 말이죠. 실행계획이 재 컴파일 되어 새로운 실행계획이 만들어지는경우 기존의 실행계획은 삭제되어 확인할 수 없습니다. 그럼 현재 플랜캐시에 있는 실행계획을 확인해 보도록 하겠습니다.플랜캐시에서는 아래와 같은 정보를 확인할 수 있습니다.- 쿼리 구문- 수행 횟수- CPU 시간- 수행 시간- 논리적 읽기- 논리적 쓰기- 쿼리 플랜 현재 플랜캐시에 있는 실행계획을 확인하는 쿼리21, 22 라인의 조건을 기호에 맞게 수정하여 특정 데이터베이스에서 특정 시간에 생성된 실행 계획을 확인할 수 있습니다.주석처리를 하여 전체 실행계획..
SQL Server
병렬처리 기법단일 쿼리에서 다수의 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년치의 명세서가 저장되어 있는 테이블에서 특정 거래월..
SSISDB - SSIS Server Maintenance Job 배치작업SSISDB 는 SSIS Server Maintenance Job 배치작업을 가지고 있습니다.이 배치작업은 오래된 배치기록을 제거하는 역할을 하며 매일 00:00 분에 수행됩니다. cleanup_server_retention_window SP 의 execution_cursor 오류SSIS Server Maintenance Job 배치작업은 cleanup_server_retention_window SP 를 호출합니다.그런데 간혹 아래와 같은 오류가 발생합니다. execution_cursor 오류 해결 방법SSISDB 를 생성 시 발생하는 문제로,아래와 같은 구조로 인해 WHILE 문이 반복되는 경우 CURSOR 를 찾을 수 없기 때문..
트리거란특정 이벤트가 발생하였을 때 동작합니다.특정 이벤트에 포함되는지 검사하기 위해 쿼리 수행마다 트리거를 확인하는 작업이 필요합니다. 트리거가 미치는 성능 테스트트리거 생성 전 테스트트리거를 생성하지 않고 trg_table 을 생성 한 후 20,000 건을 INSERT 합니다. SET NOCOUNT ON CREATE TABLE trg_table (C1 INT, C2 VARCHAR(500))GO DECLARE @ST DATETIMEDECLARE @ET DATETIMEDECLARE @I INTSET @I = 1SET @ST = GETDATE()WHILE @I
트랜잭션 로그와 VLFSQL Server 는 각 트랜잭션 및 데이터베이스 수정 내용을 기록하는 트랜잭션 로그가 있습니다.트랜잭션 로그 파일은 VLF (Virtual Log File) 로 구성됩니다. 지금은 VLF 개수에 따른 성능 차이를 포스팅하는게 목적이기 때문에 개념에 대해서는 설명하지 않습니다.아래 URL 에서 개념에 대해 파악할 수 있습니다.https://docs.microsoft.com/ko-kr/sql/relational-databases/logs/the-transaction-log-sql-server?view=sql-server-2017https://docs.microsoft.com/ko-kr/sql/relational-databases/sql-server-transaction-log-arc..
VARCHAR(MAX) 와 NVARCHAR(MAX) 의 단점VARCHAR 와 NVARCHAR 는 유니코드 라는 점에서 다르기 때문에 VARCHAR 로 설명하겠습니다. VARCHAR(N) 컬럼에 데이터를 저장할 때에는 물리적으로 같은 방식으로 저장됩니다.이 말은, 어떤 특정한 동작없이 블록에 바로 쓰인다는 말을 뜻합니다. 그러나 VARCHAR(MAX) 컬럼에 저장하는 경우에는 TEXT 타입처럼 다뤄지게 됩니다.이는 저장을 위한 추가적인 절차가 필요하다는 뜻입니다. ( 단, 저장되는 데이터길이가 8000 자 이상인 경우 ) 왜 8000 자 이상인가? 8K 블록에는 최대 8000 자를 저장할 수 있으며, 이를 넘어가게 되는 경우 오버플로우가 발생하게 됩니다.out of row 라고 말하며, 이를 저장하기 위해..
WITH(NOLOCK)SQL Server 에서 WITH(NOLOCK) 의 힌트를 제공합니다. WITH(NOLOCK) 의 의미는 다음과 같습니다.락이 잡혀있는 데이터에 접근하여 데이터를 읽는다.락이 잡혀있다는 말은 트랜잭션 중이라는 의미이고, 트랜잭션 내에서 데이터는 변경된 데이터를 읽습니다.즉 잠금을 무시한 Dirty Read 이며 트랜잭션이 Rollback 되는 경우에는 잘못된 데이터를 읽을 수 있게 됩니다. 그럼에도 불구하고 WITH(NOLOCK) 옵션은 SELECT 가 대기해야 하는 불상사를 막을 수 있기 때문에 자주 사용됩니다. WITH(NOLOCK) 테스트WITH(NOLOCK) 이 없는 일반 구문을 사용하는 경우,C1 = 1 의 데이터에 대해서 LOCK 이 잡혀있기 때문에 SELECT 는 대기하..