SQL튜닝 26

Query Rule Off를 사용한 SQL Server 옵티마이저 비활성화

Query Rule Off를 사용한 SQL Server 옵티마이저 비활성화 Version : SQL Server 2012, 2014, 2016 SQL Server는 쿼리를 실행 할 때 다양한 비용을 계산하여 최적의 계획을 생성하고 사용한다. 여러 사용 가능한 실행 계획 중에 비용이 가장 적게 드는 하나의 실행 계획을 선택하는 프로세스를 최적화라 한다. 쿼리 처리에 대한 아키텍처는 아래 링크를 참고 한다. SQL Server 쿼리 처리 아키텍처 : http://sqlmvp.kr/140188321707 SQL Server에서 쿼리를 실행 할 때 옵티마이저가 최적의 실행 계획을 만들어 사용할 수도 있지만 쿼리를 튜닝하는 과정에서 옵티마이저의 최적화를 사용하지 않도록 비활성화 할 수 있다. 문서화 되지 않은 Q..

SOS_SCHEDURLER_YIELD 대기와 쿼리 식별

SOS_SCHEDURLER_YIELD 대기와 쿼리 식별 Version : SQL Server 2008, 2008R2, 2012 SOS_SCHEDULER_YIELD 대기 유형의 문제점 중 하나는 실제로 대기 유형이 아니다는 것이다. 이 대기 유형의 발생은 4ms 스케줄링 퀀텀에 따른 자발적인 CPU 양보로 인해 실행중인 스레드를 반환하고 실행 가능한 큐의 맨 아래로 이동하기 때문이다. 그리고 SOS_SCHEDULER_YIELD를 사용하여 대기 프로세스에 등록된다. 대기 유형에 대한 자세한 내용은 다음 포스트를 참고 한다. SOS_SCHEDULER_YIELD waits and the LOCK_HASH spinlock : http://www.sqlskills.com/blogs/paul/sos_scheduler..

트랜잭션 로그 백업을 읽고 트랜잭션 발생 시간 및 사용자 찾기

트랜잭션 로그 백업을 읽고 트랜잭션 발생 시간 및 사용자 찾기 Version : SQL Server 2005, 2008, 2008R2, 2012, 2014 데이터베이스에서 발생하는 행위는 모두 트랜잭션 로그에 기록된다. 트랜잭션 로그를 읽는 방법과 트랜잭션 로그에서 삭제된 데이터 복구, 삭제한 사용자 찾기에 대한 내용은 이전 아티클을 참고 한다. SQL Server 트랜잭션 로그 읽기 : http://sqlmvp.kr/140202102618 트랜잭션 로그 및 LSN을 이용한 삭제된 데이터 복구 : http://sqlmvp.kr/140206499367 SQL Server에서 Drop 및 Delete 사용자 찾기 : http://sqlmvp.kr/140202164558 변경된 테이블 이름 복구하기 : htt..

인덱스 유지관리 작업과 SQL Server 쿼리 성능

인덱스 유지관리 작업과 SQL Server 쿼리 성능 Version : SQL Server 2005, 2008, 2008R2, 2012, 2014 SQL Server 데이터베이스 엔진에서는 기본 데이터에 삽입, 업데이트 또는 삭제 작업을 수행할 때마다 인덱스를 자동으로 유지 관리한다. 이러한 수정이 거듭되면 시간이 흐름에 따라 인덱스의 정보가 조각화되어 데이터베이스 내에 흩어지게 될 수 있다. 조각화는 키 값을 기준으로 하는 인덱스의 논리적 페이지 순서가 데이터 파일 내의 물리적 순서와 일치하지 않을 때 나타난다. 심하게 조각화된 인덱스는 쿼리 성능을 저하시키고 응용 프로그램의 응답이 느릴 수 있다. 인덱스 조각화가 심할 경우에는 Reorganization 또는 Rebuild에 대한 고민을 하게 되는데 ..

Optimize for hint 쿼리 최적화

Optimize for hint 쿼리 최적화 Version : SQL Server 2005, 2008, 2008R2, 2012, 2014 SQL Server는 쿼리를 실행 할 때 다양한 비용을 계산하여 최적의 계획을 생성하고 사용 한다. 그리고 이렇게 생성된 실행 계획은 재사용 된다. 매개 변수 및 실행 계획 재사용 - http://sqlmvp.kr/140188831357 실행 계획 캐싱 및 다시 사용 - http://sqlmvp.kr/140188765472 SQL Server에서는 최적의 실행 계획을 선택하지 않고 하나 이상의 다른 실행계획을 사용할 수 있도록 강제 할 수 있는 힌트도 있다. 예를 들어 Where 절에 특정한 값이 사용됨에 따라 실행 계획이 변경되고 쿼리 실행 시간이 오래 걸리는 경우가..

전체 백업에서 포함되는 트랜잭션 범위

전체 백업에서 포함되는 트랜잭션 범위 Version : SQL Server 2005, 2008, 2008R2, 2012, 2014 SQL Server 전체 백업을 진행 할 때 마지막 포함된 트랜잭션 범위에 대해서 알아보자. 백업작업 시 체크포인트를 실행하여 버퍼풀에 있는 모든 더티 페이지를 강제로 디스크에 기록한다. 백업 작업은 데이터베이스에 할당된 페이지를 읽기 시작한다. 백업 작업이 페이지 X를 읽는다. 트랜잭션 A가 발생 한다. 트랜잭션 A가 페이지 X를 변경한다. 트랜잭션 B가 발생 한다. 트랜잭션 A가 끝나고 페이지 X에 대한 변경사항을 커밋한다. 백업 데이터 읽기 작업이 완료되고 트랜잭션 로그를 읽기 시작한다. 백업 데이터 읽기 작업이 완료된 시점에 트랜잭션 A에 대한 내용은 트랜잭션로그에 커..

REPL_SCHEMA_ACCESS 대기 유형

REPL_SCHEMA_ACCESS 대기 유형 Version : SQL Server 2005, 2008, 2008R2, 2012, 2014 SQL Server의 고가용성 솔루션인 복제 구성에서 트랜잭션 복제 지연 문제가 발생 할 때 나타나는 대기와 이를 해결 할 수 있는 방법에 대해서 알아본다. 이 포스트는 CSS SQL Server Engineers 팀 블로그의 내용을 읽고 이해한 것을 정리하였으며 번역의 오류나 기술적 오류 가능성이 있으므로 자세한 내용은 원문을 참고한다. DMV를 사용하여 현재 실행 중인 각 요청에 대한 정보를 확인 한다. REPL_SCHEMA_ACCESS 대기를 확인 할 수 있다. select * from sys.dm_exec_requests REPL_SCHEMA_ACCESS 대기는..

Database 손상시 Emergency 모드로 복구하기

Database 손상시 Emergency 모드로 복구하기 Version : SQL Server 2005, 2008, 2008R2, 2012, 2014 SQL Server에서 데이터베이스가 손상되었을 때 조치할 수 있는 방법에 대해서 알아본다. 데이터베이스가 손상되었을 때 유일하게 접속할 수 있는 방법은 Emergency 모드이다. 시나리오는 다음과 같다. Emergency 모드로 데이터베이스에 접근 한다. 새로운 트랜잭션로그를 구축하기 위해 문서화 되지 않은 DBCC REBUILD_LOG 명령을 사용한다. 데이터 파일에 대한 손상을 해결하기 위해 REPAIR_ALLOW_DATA_LOSS 옵션으로 DBCC CHECKDB를 실행 한다. 데이터복구가 완료되면 백업을 진행하고 Emergency 모드를 해제 한다..

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

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

Collation 변경

Collation 변경 Version : SQL Server 2005, 2008, 2008R2, 2012, 2014 SQL Server를 설치할 기본 데이터 정렬 구성은 Windows Server의 데이터 정렬을 참고 한다. 사용자 설정에 따라 기본 데이터 정렬을 변경 할 수도 있다. SQL Server 2014 설치 : http://sqlmvp.kr/140211418959 데이터베이스의 기본 데이터 정렬 설정에 따라 테이블을 생성할 때 문자열 타입의 경우 기본적으로 데이터베이스의 기본 데이터 정렬을 참고하여 생성된다. 이번 포스트는 테이블 컬럼에 Korean_Wansung_CI_AS 정렬에서 SQL_Latin1_General_CP1_CI_AS 정렬로 변경하는 방법에 대해서 알아 본다. 실습을 위해 문자..