SQL Server 818

Tempdb 경합 확인 및 해결 (Tempdb Contention)

Tempdb 경합 확인 및 해결 (Tempdb Contention) Version : SQL Server 2005, 2008, 2008R2, 2012 SQL Server를 운영하는데 있어서 성능 문제를 일으키는 부분 중 하나가 임시데이터베이스라고 불리는 Tempdb 이다. Tempdb를 많이 사용하면 SQL Server에서 페이지를 할당하려고 할 때 경합이 발생 한다. 이는 메모리 접근에 대한 스레드 병목현상으로 I/O 병목과는 관련이 없다. Tempdb는 다음과 같은 작업이 있을 경우 사용된다. 임시 테이블(로컬 또는 전역)을 생성, 삭제 테이블 변수 CURSORS와 관련된 작업 테이블 ORDER BY GROUP BY HASH PLANS 실제 운영환경에서 Tempdb로 인한 서비스 영향도가 매우 큰데..

SQL Server IO 병목 확인과 오해

SQL Server IO 병목 확인과 오해 Version : SQL Server 2005, 2008, 2008R2, 2012 SQL Server의 작업 부하는 일반적으로 I/O 서브시스템이 디스크로부터 데이터를 읽거나 쓰는 작업에서 많이 발생 한다. SQL Servers는 내부 메커니즘에 의해(I/O 요청이 OS의 스케줄러에 의해 처리 되는) I/O 요청이 처리 된다. 이 때 작업의 규모나 시스템의 자원에 따라 요청에 대한 처리 속도에 영향을 받는다. 서비스하고 있는 서버의 I/O 부하는 어느 정도일까? 즉 요청 된 작업이 대기하는 시간은 어떻게 될까? 다음 스크립트를 통하여 요청에 응답하는 시간(대기 시간)이 기록되어 있는 통계를 확인 할 수 있다. SELECT DB_NAME(vfs.database_i..

SQL Version에 따른 sp_prepare 정보 반환

SQL Version에 따른 sp_prepare 정보 반환 Version : SQL Server 2008R2, 2012 SQL Server의 시스템 저장 프로시저인 sp_prepare는 매개 변수가 있는 T-SQL문을 준비하고 실행을 위해 핸들을 반환하는 기능을 한다. SQL Server Version에 따라 반환되는 정보가 어떻게 다른지 알아 보자. [단일 문 일괄처리에 대한 메타데이터 반환] 아래 표는 sp_prepare 문을 포함하는 일괄 처리에 대한 메타데이터를 반환 여부를 나타낸다. SQL Server 2012 이전 버전에서도 사용자에게 sp_prepare 메타데이터를 반환한다. 이것은 내부적으로 FMTONLY ON 문을 설정하고 실행하여 구현되었다. 클라이언트 버전 2012 이상이면 SQL 2..

DReplay 활성 세션 초과 에러

DReplay 활성 세션 초과 에러 Version : SQL Server 2012 SQL Server 2012 버전부터 Distributed Replay라는 새로운 기능이 도입 되었다. 이 기능은 SQL Server의 프로파일러와 마찬가지로 Distributed Replay를 사용하여 캡처된 추적을 업그레이드 된 테스트 환경에서 재생할 수 있다. Microsoft SQL Server Distributed Replay 기능은 여러 컴퓨터를 사용하여 추적 데이터를 생성하고 시뮬레이션을 할 수 있는 장점이 있다. 응용 프로그램 호환성 테스트, 성능 테스트 또는 용량계획을 예측하는데 Distributed Replay를 사용할 수 있다. 오늘 주제는 SQL Server 2012에 새로 도입된 SQL Server ..

저장 프로시저 내 임시 테이블 사용과 프로시저 재컴파일

저장 프로시저 내 임시 테이블 사용과 프로시저 재컴파일 Version : SQL Server 2005, 2008, 2008R2, 2012 SQL Server의 저장프로시저(Stored Procedure)는 보안이나 성능적인 측면에서 많은 이점을 제공한다. 성능적인 측면에서 가장 큰 장점은 프로시저가 처음 한번 실행 될 때 컴파일 되고 그 이후로는 컴파일 과정없이 재사용되는 것이다. 실제 저장프로시저의 컴파일(재컴파일) 비용은 매우 크므로 이 부분을 최대한 발생하지 않도록 해야 한다. 다음의 케이스는 어떤 저장프로시저가 실행 될 때 항상 재컴파일로 인하여 성능 문제가 발생했던 사례이다. 저장프로시저 안에서 사용된 임시 테이블을 ALTER 명령어를 통하여 수정하였을 때 재컴파일이 발생 한다. 다음 예제 스크..

NUMA 노드와 추척플래그 8048

NUMA 노드와 추척플래그 8048 Version : SQL Server 2008, 2008R2, 2012 SQL Server 2008 이상의 NUMA NODE 환경에서 노드당 CPU가 8개 이상 사용되는 서버에서 추적 플래그 8048이 필요한 경우를 살펴보자 이번 포스트는 CSS SQL Server Engineer 팀블로그에 게제된 내용으로 필자가 이해한 내용을 바탕으로 정리 하였으며 번역의 오류나 기술적 오류가 있음을 인지 한다. SQL Server 개발자는 메모리 사용에 따라 서로 다른 수준의 파티션 메모리를 할당하도록 선택 할 수 있다. 개발자는 글로벌, CPU, NODE, 작업 파티션 스키마를 선택 할 수 있다. SQL Server에서는 CMemPartitioned 할당을 사용한다. 이 파티션의..

온라인 인덱스 리빌드와 조각화 증가

온라인 인덱스 리빌드와 조각화 증가 Version : SQL Server 2005, 2008, 2008R2, 2012 데이터베이스를 설계하는 데 있어서 인덱스는 매우 중요하다. 처음 인덱스를 잘 설계 하더라도 운용하는 과정에서 데이터의 입력, 수정, 삭제 등으로 인하여 조각화가 발생하는 경우 성능이 저하 될 수 있다. SQL Server에서는 이러한 단편화를 제거하기 위해 인덱스 리빌드 라는 기능을 제공하고 있다. SQL Server Standard 에디션에서는 인덱스를 생성하고 다시 빌드하는 과정에서 테이블이 잠김으로 작업이 끝날 때 까지 SELECT, INSERT, UPDATE 작업이 원활하지 않을 수 있다. SQL Server Enterprise Edition을 사용할 경우 온라인 방식으로 인덱스를..

VARCHAR(MAX) and NTEXT 쿼리 성능

VARCHAR(MAX) and NTEXT 쿼리 성능 Version : SQL Server 2005, 2008, 2008R2, 2012 단일 컬럼에 크기가 큰 데이터(게시판 등)를 저장할 때 VARCHAR(MAX) 또는 NTEXT를 사용한다. varchar(max), nvarchar(max), varbinary(max)은 최대 2^31-1 바이트(약2GB)의 데이터를 저장 할 수 있으며 varchar(n), nvarchar(n), varbinary(n) 동작과 유사하여 SQL Server에서 큰 문자, 유니코드 및 이진 데이터를 보다 효율적으로 저장하고 검색 할 수 있다. . varchar(max), nvarchar(max), varbinary(max) 형식을 사용하면 이전 버전의 SQL Server에서 ..

CPU 리소스 상태에 따른 병렬 처리 제한

CPU 리소스 상태에 따른 병렬 처리 제한 Version : SQL Server 2005, 2008, 2008R2, 2012 우리는 SQL Server에서 코어가 2개 이상일 경우 병렬 처리를 수행 할 수 있다는 것은 잘 알고 있다. 그런데 동일한 쿼리이면서 병렬 실행계획까지 똑같은데 왜 실행 시간이 다를까? CPU와 병렬처리간에 어떤 상관관계가 있는지 알아 보자. 결론은 쿼리를 병렬로 컴파일 할 때 여러 스레드로 실행 된다는 보장은 없다. SQL Server는 시스템 부하에 따라 병렬로 수행하지 않도록 선택한다. 서버가 매우 바쁜 경우 불특정한 응답 시간을 나타낸다. 이번 포스트는 CSS SQL Server Engineer 팀블로그에 게제되어 있는 내용으로 필자가 읽고 이해한 내용을 바탕으로 정리 하였..

매개변수 값의 변경과 SQL 서버 성능 저하

매개변수 값의 변경과 SQL 서버 성능 저하 Version : SQL Server 2005, 2008, 2008R2, 2012 매개변수 값의 변경과 그에 따른 SQL Server의 성능문제에 대해서 살펴 본다. 해당 내용은 CSS SQL Server Engineer 팀블로그에 기재된 내용으로 원문을 참고로 하여 필자가 이해한 내용을 바탕으로 정리 하였으며 번역의 오류 및 기술적인 오류가 있을 수 있음을 미리 인지 한다. 매개변수 스니핑은 이미 많은 사용자들에게 알려져 있다. 하지만 매개변수 스니핑이 정확하지 않을 때가 있다. 예를 들어 사용자 프로시저 안에서 매개변수의 값을 변경하는 경우 SQL Server는 알 수가 없다. 따라서 프로시저가 처음에 컴파일 되면서 카디널리티를 예측한 매개변수의 값을 사용..