쿼리튜닝 25

함수 통계 정보 확인 (sys.dm_exec_function_stats)

함수 통계 정보 확인 (sys.dm_exec_function_stats) Version : SQL Server 2016 SQL Server에서 쿼리를 사용할 때 함수를 사용하는 경우가 있다. 함수를 사용할 때 함수에 대한 성능을 확인하기 위해서 일반적으로 함수의 개별문을 실행하였다. 이번 포스트에서는 SQL Server 2016에서 새롭게 제공된 sys.dm_exec_function_stats DMV를 사용하여 함수에 대한 통계 정보를 확인해 본다. sys.dm_exec_function_stats는 모든 스칼라 함수 및 인메모리, CLR 스칼라 함수에 대한 통계 정보를 제공한다. 이 기능은 모든 스칼라 함수에 대한 캐시된 실행 계획을 반환한다. 인모메리 기능의 통계를 볼 때 논리적 물리적 IO에대한 칼럼..

RESOURCE_GOVERNOR_IDLE과 쿼리 성능

RESOURCE_GOVERNOR_IDLE과 쿼리 성능 Version : SQL Server 2005, 2008, 2008R2, 2012, 2014 이 글은 CSS SQL Server Engineers에 기재된 내용으로 원문을 읽고 해석한 것으로 필자의 이해력을 기반으로 기술하였습니다. 기술적 오류 또는 번역의 오류가 포함될 수 있으니 반드시 원문을 참고 바랍니다. 쿼리의 실행이 느릴 때 SQL Nexus(http://sqlnexus.codeplex.com/) 에서 다음과 같은 대기 유형을 캡처 했다. 대기 유형에서 RESOURCE_GOVERNOR_IDLE가 매우 높게 나타는것을 확인 하였다. 이 대기 유형은 CPU CAP 실행에 관련한 것이었다(CAP_CPU_PERCENT). CAP_CPU_PERCENT..

601 Error, Could not continue scan with NOLOCK due to SQL Server data Movement

601 Error, Could not continue scan with NOLOCK due to SQL Server data Movement 메시지 601, 수준 12, 상태 3, 프로시저 usp_SQLMVP, 줄 23 데이터 이동으로 인해 NOLOCK으로 계속 검색할 수 없습니다. Version : SQL Server 2005, 2008, 2008R2, 2012, 2014 데이터 조회 프로시저 호출에서 다음과 같이 601 에러가 발생 하였다. 601 에러는 어떨떄 발생 할까? 601에러는 READ UNCOMMITTED, NOLOCK 힌트를 사용하여 데이터를 조회 할 때 하나 이상의 데이터가 페이지가 없기 때문에 발생한다. 페이지 분할로 이동했거나 페이지가 삭제되었을 경우 발생 한다. 즉 SQL Serv..

Ad-hoc 쿼리와 실행계획

Ad-hoc 쿼리와 실행계획 Version : SQL Server 2005, 2008, 2008R2, 2012, 2014 Ad-hoc 쿼리를 실행 할 때 대소문자, 띄어쓰기, 스키마에 따라 기존의 실행 계획이 사용되지 않고 새로운 실행 계획이 생성되어 사용된다. Ad-hoc 쿼리는 컴파일 과정을 거치며 실행 계획을 생성하며 컴파일과 실행 계획 생성에 따른 성능 병목이 발생 할 수 있다. [대소문자, 공백에 따른 실행계획 생성] Ad-hoc으로 쿼리를 사용 할 경우 Case와 공백에 따라서도 다른 쿼리로 인식되어 새로운 실행계획이 생성된다고 하였다. 다음 예제를 통해 알아보자. USE AdventureWorks2014; DBCC FREEPROCCACHE WITH NO_INFOMSGS; GO SELECT S..

테이블 변수와 TF 2453

테이블 변수와 TF 2453 Version : SQL Server 2005, 2008, 2008R2, 2012 테이블변수에 데이터를 삽입하면 카디널리티는 항상 1 이다. 행이 적을 경우에는 큰 문제가 되지 않지만 행이 많을 경우에는 쿼리 계획을 효율적으로 생성하지 못하여 쿼리 성능이 저하될 수 있다. dbcc traceoff(2453,-1) go dbcc freeproccache go set statistics profile off go use tempdb go if OBJECT_ID ('t2') is not null drop table t2 go create table t2 (c2 int) go create index ix_t2 on t2(c2) go --insert 100,000 rows into t..

블록킹 세션을 찾아 우선순위 낮은 세션 종료하기

블록킹 세션을 찾아 우선순위 낮은 세션 종료하기 Version : SQL Server 2005, 2008, 2008R2, 2012, 2014 데이터베이스 서버를 운영하다보면 다양한 쿼리 요청으로 인해 블록킹이 발생 할 수 있다. 차단 및 교착이 발생하였을 때 이를 감지하고 블록킹이 발생한 세션 중 우선순위가 가장 낮은 프로세스를 종료 할 수 있다면 원치 않는 비즈니스 중단을 예방 할 수 있다. 시나리오는 다음과 같다. 매일 밤 실행되는 일괄 처리 작업이 다른 프로세스를 차단하는 현상이 발생 하였을 때 일괄 처리 되는 세션을 종료시키고 싶다. 일괄 처리되는 스크립트에 라벨링을 하여 해당 세션을 강제 종료하는 방법에 대해서 알아 본다. 세션 식별 목적을 위해 스크립트의 시작 부분에 CONTEXT_INFO 함..

스냅숏 격리 수준(SNAPSHOT ISOLATION LEVEL)

스냅숏 격리 수준(SNAPSHOT ISOLATION LEVEL) Version : SQL Server 2005, 2008, 2008R2, 2012, 2014 트랜잭션 격리 수준은 SQL Server에 연결하여 실행하는 T-SQL문의 잠금 및 행 버전 관리 기능을 제공한다. 격리 수준은 여러 종류가 있으며 격리 수준 기능은 다음과 같다. SNAPSHOT 격리 수준은 트랜잭션에서 읽은 데이터가 다른 트랜잭션으로부터 일관성이 유지되도록 한다. 트랜잭션은 시작되기 전에 커밋된 데이터 내용만 인식할 수 있다. 현재 트랜잭션이 시작된 후 다른 트랜잭션에서 수정한 데이터는 현재 트랜잭션에서 실행되는 결과에 표시되지 않는다. 따라서 트랜잭션의 결과는 트랜잭션 시작 당시 커밋된 데이터의 스냅숏을 가져오는 것처럼 보인다...

SQL Server에서 차단을 확인하는 다양한 방법

SQL Server에서 차단을 확인하는 다양한 방법 Version : SQL Server 2005, 2008, 2008R2, 2012 SQL Server는 많은 수의 동시 사용자 요청을 처리한다. 수 많은 클라이언트가 요청을 하면 여러 프로세스가 동일한 자원에 대해 동시에 액세스하기 때문에 충돌이 발생 할 수 있다. 이때 차단이 발생하는데 SQL Server에서 발생하는 차단에 대해서 확인 하는 여러 가지 방법에 대해서 알아 본다. [SSMS 작업 모니터] SSMS에서 제공하는 작업 모니터는 SQL Server의 리소스 및 프로세스에 대한 잠금 정보를 확인 할 수 있다. SSMS의 개체 탐색기에서 [서버] –[마우스 오른쪽 클릭] –[작업모니터]를 선택한다. 프로세스 탭을 클릭하면 페이지가 확장되고 현재..

SQL Server CPU 사용률이 높은 프로세서 및 쿼리 찾기

SQL Server CPU 사용률이 높은 프로세서 및 쿼리 찾기 Version : SQL Server 2005, 2008, 2008R2, 2012, 2014 SQL Server에서 CPU사용률이 높게 나타났다. 어떤 프로세스가 어떤 쿼리를 실행하여 CPU 사용률이 높은지 SPID와 KPID를 사용하여 알아보자. [시작] – [실행] - [perfmon] 또는 성능 카운터를 실행한다. [Thread] 카운터 목록에서 [% Processor Time], [ID Thread]를 선택하고 인스턴스에 [sqlservr]를 선택 한다. 카운터를 추가하면 다음과 같이 스레드를 모니터링 할 수 있으며 이때 프로세서 값이 높은 스레드를 찾는다. 아래 그림에서는 스레드 1776이 CPU를 많이 사용하고 있는 것을 확인 할..

인덱스 리빌드 동작 (Gather Streams from SORT)

인덱스 리빌드 동작 (Gather Streams from SORT) Version : SQL Server 2005, 2008, 2008R2, 2012, SQL2014 SQL Server에서는 인덱스 리빌드 작업을 통하여 조각난 인덱스를 다시 작성한다. SQL Server 데이터베이스 엔진에서는 기본 데이터에 삽입, 업데이트, 삭제 작업을 수행 할 때마다 인덱스를 자동으로 유지 관리한다. 이러한 수정이 빈번이 발생하면 시간이 흐름에 따라 인덱스의 정보가 조각화 되어 데이터베이스 내에 흩어지게 될 수 있다. 조각화는 인덱스의 논리적 페이지 순서가 데이터파일의 물리적 순서와 일치하지 않을 때 나타난다. 조각화가 심할 경우에는 쿼리의 성능이 저하될 수 있다. 이번 포스트는 CSS SQL Engineers에 게시..