728x90

Reference URL :

http://www.microsoft.com/korea/TechNet/sql/Technote/dat410ef.asp?bPrint=True



개발자를 위한 MS SQL Server 성능 조정 및 최적화, 제 1부: 성능 문제 개요

DAT 410
Tech-Ed 97에 소개됨

Adam Shapiro
Program Manager
Microsoft Corporation

성능 조정의 목적

성능 조정의 목적은 네트워크 소통량과 CPU 시간을 최소화하고 디스크 I/O를 줄여 쿼리마다 적절한 응답 시간을 제공함으로써 모든 사용자의 프로세스에 대해 최대 처리량을 제공하는 것입니다. 이 목적을 달성하기 위해 응용 프로그램 요구 사항을 철저하게 분석하고, 데이터의 논리적 구조와 실제 구조를 파악하고, 온라인 트랜잭션 처리(OLTP)와 의사 결정 지원 서비스처럼 서로 충돌하는 데이터베이스 사용에 대해 그 기회 비용을 평가하고 협상합니다.

응답 시간 대 처리량

응답 시간이란 결과 집합의 첫째 행을 반환하는 데 필요한 시간을 말합니다. 일반적으로 응답 시간은 쿼리가 처리되고 있다는 것을 사용자가 가시적으로 확인받을 때까지의 시간입니다.

처리량이란 주어진 시간 동안 서버가 처리할 수 있는 전체 쿼리 수를 말합니다.

사용자 수가 늘어나면 사용자 간의 경쟁이 커지며 이 때문에 응답 시간이 느려지고 전체적인 처리량이 줄어듭니다.

성능 측정 방법

성능은 트랜잭션을 처리하는 데 필요한 I/O 양, CPU 시간 및 응답 시간을 사용하여 측정할 수 있습니다. 성능은 각각의 환경에 따라 그리고 응용 프로그램, 아키텍처 및 리소스, 서버, 동시 작업 등에 따라 달라집니다.

성능에 영향을 미치는 요소

시스템 리소스

메모리

SQL Server의 성능을 높이려면 RAM이 충분히 있어야 합니다.

프로세서

프로세서의 개수와 속도는 전체적인 성능에 직접적인 영향을 미칩니다.

디스크

디스크 드라이브의 개수, 속도, 종류를 비롯하여 사용하는 컨트롤러 종류도 성능에 영향을 미칩니다.

네트워크

동시에 이뤄지는 네트워크 작업이 SQL Server의 성능에 영향을 미칠 수 있습니다. 네트워크 대역폭과 데이터 전송률도 중요합니다.

Windows NT 운영 체제

스레드

스레드 우선 순위를 조정하면 SQL Server가 자신의 요구 사항을 다른 서비스의 요구 사항 그리고 Microsoft Windows NT® 운영 체제 자체의 요구 사항과 조화시킬 수 있습니다. SQL Server가 할당하는 스레드 수가 성능에 영향을 미칠 수 있습니다.

페이징 파일

페이징 파일의 개수, 크기, 위치가 시스템 성능에 큰 영향을 미칠 수 있습니다.

서비스

Windows NT에서 실행되는 다른 서비스들과 SQL Server는 서로 리소스를 사용하기 위해 경쟁합니다. 따라서 불필요한 서비스를 종료하면 성능이 향상될 수 있습니다.

디스크 관리

Windows NT는 성능에 영향을 미칠 수 있는 스트라이프, 미러링 등 많은 디스크 관리 기능을 제공합니다. 이들이 항상 성능을 향상시키는 것은 아닙니다.

동시 작업

클라이언트 프로그램이나 컴파일러 등에서 수행하는 다른 작업들과 SQL Server는 서로 CPU 주기, 디스크 액세스 및 네트워크 대역폭을 사용하기 위해 경쟁할 수 있습니다.

SQL Server

구성

많은 SQL Server 구성 변수가 서버 성능에 직접적인 영향을 미칠 수 있습니다.

잠금

데이터베이스 리소스(테이블 및 개별 페이지)를 사용하려는 경합 때문에 프로세스가 차단될 수 있고 다중 사용자 시스템의 전체 성능이 큰 영향을 받을 수 있습니다.

로깅

로그에 기록되지 않는 특정 동작을 제외하고 모든 데이터베이스에 대한 수정 사항은 로그에 기록되어야 합니다. 로그 쓰기 자체가 성능에 영향을 미칠 수 있으며 트랜잭션 로그(syslogs)가 경합의 진원지가 될 수 있습니다.

동시 작업

백업 및 복원, DBCC, 인덱스 구축 같은 유지 관리 작업이 시스템 동작을 방해할 수 있습니다.

데이터베이스 응용 프로그램

논리 설계 및 실제 설계

정규화 수준 및 비정규화 수준이 쿼리 성능에 영향을 미칠 수 있습니다. 실제 설계는 인덱스 선택을 포함하며 아주 상세하게 정의됩니다.

교착 상태 방지

반복적인 교착 상태 때문에 응용 프로그램 속도가 떨어질 수 있습니다. 교착 상태의 발생 가능성을 줄일 수 있는 프로그래밍 방법이 있습니다.

트랜잭션 제어

트랜잭션, 잠금 및 교착 상태는 서로 아주 긴밀하게 관련되어 있습니다. 응용 프로그램이 사용하는 트랜잭션 제어 수준이 잠금 지속 시간 및 응용 프로그램의 전체 처리량에 큰 영향을 미칠 수 있습니다.

쿼리

저장 프로시저에서 개별 쿼리를 캡슐화하는지 여부를 포함하여 개별 쿼리를 쓰는 방식에 따라 최적의 성능을 제공하는 최적의 계획이 사용되느냐 그렇지 않느냐가 결정될 수 있습니다.

클라이언트 응용 프로그램

사용자 요구 사항

필요한 수정 사항 및 실행할 쿼리에 대한 사용자 요구 사항이 응용 프로그램의 성능에 큰 영향을 미칠 수 있습니다.

교착 상태 처리

클라이언트 프로그램은 다양한 방식으로 SQL Server 교착 상태에 응답할 수 있습니다. 가장 효율적인 응답 방식을 사용하면 클라이언트 시스템의 성능을 크게 향상시킬 수 있습니다.

트랜잭션 제어

클라이언트 응용 프로그램에서도 트랜잭션을 제어할 수 있습니다. 또한 일부 클라이언트 응용 프로그램은 프로그래머나 사용자가 인식하지 못하는 상태에서 트랜잭션 제어 문을 발급할 수 있습니다.

커서

다양한 방법을 사용하여 커서를 정의하고 조작할 수 있으며 각 방법마다 성능에 미치는 영향이 다릅니다.

성능을 향상시키는 방법

성능 조정 작업은 과학보다 예술에 가깝습니다. 성능 조정의 목적은 I/O, CPU 또는 네트워크와 관련된 병목 현상을 제거하여 성능을 향상시키는 것입니다. 이를 위해 서버 조정, 데이터베이스 조정, 프로세스 조정, 데이터에 대한 경합 최소화 등의 방법을 사용하여 시스템 처리 시간을 줄일 수 있습니다.

하드웨어 추가

  • 보통 이 방법보다 비용이 적게 드는 방법이 있겠지만 이 방법이 유용할 때도 있습니다.

SQL Server 조정

  • 구성 옵션 값을 조정합니다.

데이터베이스 조정

  • 논리 설계와 실제 설계를 개선합니다.
  • 더 나은 쿼리를 씁니다.
  • 유용한 인덱스를 만듭니다.

경합 및 동시 작업 문제 해결

  • 읽기 작업과 쓰기 작업을 조화시킵니다.
  • 잠금 경합을 최소화합니다.
  • 교착 상태를 방지합니다.

클라이언트 응용 프로그램 조정

  • 임의 쿼리 대신 저장 프로시저를 사용합니다.
  • 트랜잭션 믹스를 분석하고 우선 순위를 지정합니다.
  • 해당되는 경우 서버에서 데이터 및 프로세스를 오프로드합니다.

Windows NT의 이점

SQL Server는 Windows NT 운영 체제에 제공되는 향상된 기능을 이용합니다.

확장 가능한 아키텍처

SQL Server는 노트북 컴퓨터로부터 Intel® 및 RISC(간략화된 명령어 집합 컴퓨팅) 프로세서를 지원하는 대칭 다중 프로세서 슈퍼 서버에 이르기까지 확장할 수 있도록 하는 Windows NT의 확장성을 이용할 수 있습니다.

대용량

SQL Server는 Windows NT가 사용자 프로세스에 허용하는 최대 2GB의 메모리를 사용할 수 있습니다. 하드 디스크 파티션의 크기는 대략 170억 GB(NTFS 사용)까지 가능합니다.

SMP(대칭 다중 프로세싱)

Windows NT는 SMP가 가능한 운영 체제입니다. Windows NT는 사용 가능한 모든 프로세서에서 운영 체제 코드와 사용자 코드 모두를 실행할 수 있습니다. 실행할 스레드가 실행에 사용할 프로세서보다 많으면 SMP 운영 체제는 멀티태스킹을 수행하여 대기 중인 모든 스레드 간에 각 프로세서의 시간을 분할합니다.

SQL Server는 Windows NT의 멀티스레딩 기능을 이용합니다. SQL Server는 자체의 스레딩 엔진을 구현하는 대신 별도의 Windows NT 기반 스레드를 사용하여 각 클라이언트에 서비스를 제공합니다. Windows NT는 자동으로 프로세서 간의 스레드 로드를 조정하고 일정을 설정합니다.

SMP 컴퓨터에서는 SQL Server를 사용하여 모든 CPU 리소스를 SQL Server 전용으로 지정할 수 있습니다.

멀티스레드 단일 프로세스 아키텍처

SQL Server는 스레드 수준에서 SMP를 지원하며 아래와 같은 측면에서 Windows NT 스레딩의 혜택을 받습니다.

  • 멀티스레드 단일 프로세스 아키텍처는 시스템 오버헤드와 메모리 요구 사항을 줄입니다.
  • 멀티스레드 응용 프로그램은 단일 주소 공간을 사용합니다. 모든 스레드가 같은 프로세스에 속하기 때문에 공유 메모리 프로세스를 조정할 필요가 없습니다.

비동기 I/O

Windows NT는 비동기 I/O를 사용합니다. 비동기 I/O에서는 응용 프로그램이 I/O 요청을 발급한 다음 장치가 데이터를 전송하는 동안에도 계속 실행됩니다. 이는 I/O 요청이 완료될 때까지 응용 프로그램에 제어를 반환하지 않는 동기 I/O 시스템과 구별됩니다. SQL Server는 Windows NT의 비동기 I/O를 이용하여 처리량을 증가시킵니다.

Windows NT 서비스 사용

SQL Server는 스레딩, 일정 설정, 이벤트 알림, 프로세스 동기화, 비동기 I/O, 예외 처리, 통합 보안 등에 Windows NT 서비스를 사용합니다.

SQL Server는 아래와 같은 특징을 가집니다.

  • SQL Server 오류 로그 외에 Windows NT 이벤트 로깅도 사용합니다.
  • Windows NT의 자동 로드 조정을 이용합니다.
  • Windows NT 성능 모니터와 완전히 통합되어 있습니다.
  • Windows NT 보안을 사용하여 통합 로그인 및 암호를 제공할 수 있습니다.

성능 조정 방법

이 성능 조정 방법을 출발점으로 삼아 데이터베이스를 성공적으로 조정하여 성능을 향상시킬 수 있습니다. 또한 이 방법은 이 과정에 포함된 항목들의 기본 토대 역할도 합니다.

성능 조정 방법(계속)

데이터베이스 환경의 운용 단계에 따라 이 방법에 포함된 단계를 여기에 소개된 순서와 다르게 수행하거나 일부 단계를 생략할 수 있습니다.

성능 조정에 대한 접근 방법

두 가지 방식으로 성능 조정에 접근할 수 있습니다.

이 과정에서는 SQL Server가 어떻게 데이터에 액세스하고, 여러 사용자의 동시 작업을 제어하고, 운영 체제와 상호 작용하는지에 대해 설명합니다. 여기에서 얻은 지식을 토대로 최적의 성능을 얻을 수 있도록 논리 설계와 실제 설계를 계획하고, SQL Server를 구성하고, 트랜잭션 계획을 수립하고, 쿼리를 쓸 수 있습니다.

또는 특정 문제를 다룸으로써 성능 조정에 접근할 수도 있습니다. 예를 들어, 쿼리 실행 속도와 처리량이 필요한 것보다 낮을 수 있습니다. 그러면 SQL Server의 동작 방식에 대한 정보를 수집하고 쿼리와 시스템 구성을 필요에 맞게 조정하여 최적의 성능을 얻을 수 있습니다.

두 접근 방식이 모두 필요합니다. 서버, 사용자, 데이터, 프로세스 등에 대한 세부 지식은 있지만 성능에 대한 정보가 없다면 이론적으로 잘 설계된 응용 프로그램이 최적의 성능을 발휘하지 못하더라도 그 사실을 인식하지 못할 것입니다. 반대로, 성능 정보는 빠짐없이 가지고 있지만 응용 프로그램이나 서버에 대한 정보가 없다면 성능 문제를 인식할 수는 있어도 그 해결 방법을 찾지 못할 것입니다.

개요 – 인덱싱 전략

목표

  • 다양한 쿼리 유형에 유용하게 사용되는 인덱스를 선택합니다.
  • 의사 결정 지원 시스템(DSS)과 온라인 트랜잭션 처리(OLTP)에 대한 인덱싱 전략을 비교합니다.
  • 효과적인 인덱스를 만듭니다.
  • 선택도와 조인 밀도를 서로 구분합니다.
  • 인덱스가 도움이 되지 않는 상황을 확인합니다.
  • 인덱스의 유용성을 테스트합니다.

DSS 및 OLTP

Dat14c

대부분의 쿼리는 이 두 범주 중 하나에 속합니다. 이들의 인덱싱 문제가 크게 다를 수 있기 때문에 두 범주에 대해 따로 설명합니다.

의사 결정 지원 시스템

의사 결정 지원에는 대개 여러 검색 인수와 테이블이 관련됩니다. 쿼리는 집계, 그룹화, CUBE 및 ROLLUP 연산을 사용하는 매우 복잡한 쿼리가 될 수 있습니다. 이를 온라인 분석 처리(OLAP)라고도 합니다.

쿼리는 예측할 수 없는 임의적인 쿼리일 수 있으며 원하는 행을 지정하기 위해 거의 모든 열을 사용할 수 있습니다.

이런 종류의 쿼리에서는 가져오기 및 결과 반환 속도가 가장 중요한 요소입니다.

온라인 트랜잭션 처리(OLTP)

OLTP에는 주로 단일 테이블만 관련되며 대개 소수의 행만 영향을 받습니다. INSERT의 경우 OLTP 응용 프로그램 트랜잭션은 단일 행만 삽입할 것입니다.

의사 결정 지원에 비해 OLTP에서는 보통 쿼리의 예측 가능성이 높습니다.

OLTP 쿼리에서는 데이터 수정 속도가 가장 중요한 요소입니다.

가져오기를 위한 인덱싱

유용한 인덱스 만들기

성능을 향상시키기 위해 할 수 있는 가장 중요한 작업은 아마 유용한 인덱스를 만드는 것일 것입니다. 사용자의 요구 사항과 데이터 자체에 대한 철저한 이해를 바탕으로 인덱스의 종류와 수 그리고 인덱싱할 열을 신중하게 선택해야 합니다. 간단하게 테이블을 쿼리하든 데이터를 수정하든 인덱스는 유용합니다. 어떤 경우이든 인덱스를 사용하면 읽기 또는 쓰기를 위해 데이터에 더 빠르게 액세스할 수 있습니다.

사용자 분석

일반적으로 수행되는 쿼리의 종류와 빈도 그리고 데이터에 대한 사용자 요구 사항을 파악해야 합니다. 사용자 요구 사항을 철저하게 파악하면 어떤 부분에 중점을 둬야 할지 결정하는 데 도움이 됩니다. 중요한 쿼리들의 성능 균형을 조정할 때는 특정 쿼리의 성능을 높이기 위해 다른 쿼리의 처리 속도를 어느 정도 희생해야 할 것입니다.

데이터 분석

논리 설계와 실제 설계에서 데이터 자체는 물론 그 데이터의 구성 방식을 이해해야 합니다.

SQL Server의 작업 방식 이해

SQL Server의 작업 방식을 깊이 이해할수록 시스템을 더 효율적으로 설계할 수 있고 더 적합한 결정을 내릴 수 있습니다. SQL Server가 데이터를 어떻게 저장하고 가져오는지 그리고 쿼리 최적화 프로그램이 어떻게 가장 효율적인 실행 계획을 선택하는지에 대해 이해하는 것이 여기에 포함됩니다.

일반적인 고려 사항

  • 쿼리 최적화 프로그램은 대개 쿼리마다 테이블 당 하나의 인덱스만 사용합니다.
  • 대형 테이블에 대한 쿼리를 빠르게 실행하려면 WHERE 절에 포함된 열을 인덱싱하는 것이 좋습니다.
  • 적절한 인덱스 수를 결정하려면 업데이트 빈도 대 가져오기 빈도를 고려해야 합니다.
  • 앞으로 실행할 WHERE 절 또는 조인의 종류에 따라 인덱스를 선택해야 합니다.
  • 인덱스 선택에서 가장 중요한 것은 인덱스의 종류와 수를 적절히 선택하는 것입니다. 유지 관리로 인해 성능이 떨어지도록 방치하지 말고 만들어야 할 인덱스의 최소 개수를 미리 결정하십시오. 이를 위해서는 가장 유용한 인덱스를 결정해야 합니다.
  • 사용하지 않을 인덱스는 만들지 마십시오.
  • 쿼리 최적화 프로그램이 인덱스 사용 여부에 관한 최종 결정을 내립니다.

선택도

결과 집합을 추정하면 특정 트랜잭션 집합을 위해 테이블에 만들 인덱스 종류를 선택하는 데 도움이 됩니다.

쿼리 선택도란 SELECT, UPDATE 또는 DELETE 문이 액세스하는 테이블 행의 백분율입니다. 선택도가 높으면 검색 조건을 충족하는 단일 행이 반환될 수 있습니다. 선택도가 낮으면 식별력이 떨어지기 때문에 테이블의 수많은 행이 반환될 수 있습니다.

선택도와 관련된 개념으로 조밀도가 있으며 이는 인덱스 내 중복 행의 평균 백분율을 말합니다. 중복 행이 많이 포함된 인덱스는 조밀도가 높고 고유 인덱스는 조밀도가 낮습니다.

테이블 스캔

테이블 스캔은 결과 집합에 테이블이 많이 포함된(선택도가 낮은) 쿼리에 유용합니다.

데이터 분포

데이터 분포는 특정 테이블의 값 범위 그리고 그 범위에 포함되는 행 수를 나타냅니다. 대개의 경우 결과 집합에 반환될 데이터의 백분율을 대략적으로 계산할 수 있습니다. 예를 들어, 검색 조건이 남성/여성이라면 여성에 해당하는 결과 집합을 50% 정도로 추정할 수 있습니다.

아래와 같은 쿼리를 사용하여 열 분포를 확인할 수 있습니다.

SELECT column, count(*)
FROM table
GROUP BY column

선택도: 예제

위 예제에서, 두 결과 집합에 포함된 X의 개수는 같지만 그 백분율(선택도)은 서로 다릅니다.

이들 쿼리의 선택도를 계산해 보십시오. 예를 들어, member 테이블에 10,000개의 행이 있고 member의 범위는 1-10,000이며 모두 고유한 값이라고 가정합니다.

조인 밀도

조인 밀도란 외부 테이블의 특정 행과 일치하는 내부 테이블의 평균 행 수를 말합니다. 중복 행의 평균 개수를 조인 밀도라고 생각해도 됩니다.

고유 인덱스를 가진 열의 경우 조밀도는 낮고 조인 선택도는 높을 것입니다. 중복 행이 많이 포함된 열의 경우 조밀도는 높고 조인 선택도는 낮습니다.

조인 열의 인덱스는 조인의 내부 테이블에만 유용합니다. 조인 밀도가 낮으면 종류에 상관없이 모든 인덱스가 유용할 것입니다. 조인 밀도가 높으면 클러스터된 인덱스만 유용할 것입니다.

적절한 인덱스 종류 생성

클러스터된 인덱스가 유용한 상황

고려 사항

클러스터된 인덱스에 사용되는 열이 데이터의 실제 순서를 결정합니다. 실제 순서에서 가장 자주 요구되는 데이터 열에 클러스터된 인덱스를 배치하십시오.

사용하는 SELECT 문의 종류에 따라 인덱스를 선택해야 합니다.

외래 키는 일반적으로 고유하지 않으므로 이러한 키에는 클러스터된 인덱스를 사용하는 것이 좋습니다.

클러스터된 인덱스는 테이블마다 하나만 가질 수 있습니다.

참고 특히 데이터가 단순한 경우, 기본 키에 클러스터된 인덱스를 배치하는 것은 좋은 방법이 아닙니다. 기본 키는 고유 인덱스를 가져야 합니다. 대부분의 경우, 클러스터되지 않은 고유 인덱스도 클러스터된 고유 인덱스만큼 효율성을 제공할 수 있습니다.

클러스터되지 않은 인덱스가 유용한 상황

데이터 수정 시 클러스터되지 않은 인덱스를 유지하려면 상당한 오버헤드가 필요하므로 이러한 인덱스는 반드시 필요할 때만 추가해야 합니다.

사용하지 않을 인덱스는 만들지 마십시오.

고려 사항

  • 저장소 공간 요구 사항
  • 데이터 수정의 영향
  • 대상 열의 휘발성
  • 쿼리의 선택도. 선택도가 낮은 쿼리에는 테이블 스캔이 더 적절합니다.
  • 대상 열의 고유성. 중복 수준이 높으면 인덱스의 효율성이 떨어집니다.
  • 범위가 테이블의 일부만 차지하는 경우를 제외하고 범위 쿼리에는 클러스터되지 않은 인덱스가 적합하지 않습니다.

복합 인덱스가 유용한 상황

복합 인덱스는 다중 열 정렬 키를 가진 인덱스일 수 있습니다. 클러스터된 인덱스와 클러스터되지 않은 인덱스 모두 복합 키를 가질 수 있습니다.

고려 사항

  • 키의 첫째 열이 WHERE 절에 지정된 경우 복합 인덱스가 유용합니다.
  • 범위가 너무 넓은 인덱스 그리고 WHERE 절에 둘째 열이나 셋째 열만 지정된 인덱스는 적절하지 않습니다.

예를 들어, lastname, firstname의 인덱스는 성, 이름을 선택하는 데는 유용하지만 이름을 선택하는 데는 유용하지 않습니다.

복합 인덱스와 복수의 단일 열 인덱스

  • 복수 인덱스를 사용하면 데이터 수정 문의 성능이 떨어질 수 있습니다.
  • 일반적으로, 쿼리에서 테이블마다 하나의 인덱스만 사용되므로 복수 인덱스는 복합 인덱스만큼 유용하지 않습니다.
  • 단일 테이블의 여러 열에 액세스하는 모든 쿼리에는 복합 인덱스가 더 유용할 수 있습니다.

참고 WHERE 절에 지정하는 열의 순서는 복합 인덱스의 사용 방식에 영향을 미치지 않습니다. 복합 인덱스의 맨 왼쪽 열이 WHERE 절에 포함된 경우에만 문제가 됩니다.

인덱스 정렬 키의 맨 왼쪽(순서가 빠른) 열이 WHERE 절에 포함되지 않은 경우에도 복합 인덱스를 사용할 수 있습니다. 이 경우 SELECT 목록과 WHERE 절에서 참조되는 모든 열이 인덱스 정렬 키에 있어야 합니다. 자세한 내용은 이어지는 포함 인덱스 부분을 참조하십시오.

포함 인덱스

고려 사항

  • 일부 인덱스에 열을 추가하여 대부분의 쿼리를 포함합니다.
  • 인덱스 키의 범위를 너무 넓게 지정하지 마십시오. 그렇지 않으면 인덱스 크기가 증가하여 성능이 떨어집니다. 행 범위가 너무 넓으면 전체 페이지 수와 마찬가지로 수준 수가 늘어납니다. 페이지 수가 늘어나면 인덱스를 스캔하는 데 필요한 시간도 늘어납니다.
  • 클러스터되지 않은 인덱스를 더 많이 추가하면 업데이트 성능이 떨어집니다.
  • 두 인덱스를 하나의 복합-포함 인덱스로 결합하는 것이 효과적인 경우도 있습니다.
  • 선택도가 낮은 쿼리를 포함하는 클러스터되지 않은 인덱스의 경우, 데이터 페이지에 대한 액세스가 없고 그에 따라 테이블 스캔이 이루어지지 않기 때문에 처리 속도가 매우 빠릅니다.
  • 순서가 빠른 인덱스 정렬 키의 열이 WHERE 절에 포함되지 않은 경우에도 포함 인덱스가 유용할 수 있습니다.

클러스터된 인덱스와 클러스터되지 않은 인덱스

쿼리에 맞게 인덱싱

일정 범위의 데이터에 대한 인덱싱: 예제

테이블에 인덱스가 없는 경우
  • 테이블 스캔(53,000 I/O)이 클러스터되지 않은 인덱스보다 효율적입니다.
price 열에 클러스터된 인덱스가 있는 경우
  • 클러스터된 인덱스에서 최소 값(여기서는 $20.00)을 검색합니다.
  • $20.00로 시작하는 행을 읽고 $30.00에서 검색을 중지합니다.
  • price 열이 클러스터되어 있기 때문에 데이터의 실제 순서는 가격에 따라 정렬됩니다. 이 범위에 속하는 모든 데이터가 이어지는 페이지에 순차적으로 정렬되어 있기 때문에 데이터를 쉽게 검색할 수 있습니다.
  • 이 검색에서는 10,000페이지(190,000/페이지 당 19행)를 읽어야 합니다.
price 열에 클러스터되지 않은 인덱스가 있는 경우
  • 각 행이 검색 조건에 맞는지 확인하기 위해 클러스터되지 않은 인덱스를 행 단위로 검색합니다.
  • 조건에 맞는 모든 행에 대해 행이 저장된 각 페이지에서 데이터를 가져와야 합니다.
  • 190,000개의 데이터 페이지(모든 인스턴스마다 하나씩)는 물론 인덱스의 잎 수준을 읽어야 하기 때문에 이 검색은 효율성이 가장 떨어집니다. 캐시에서 각 데이터 페이지가 여러 번 읽힙니다.
price, title 열에 포함 인덱스가 있는 경우
  • pricetitle 열이 인덱스에 포함되어 있기 때문에 데이터 페이지를 검색할 필요가 없고 따라서 I/O가 줄어듭니다.
  • price, title 인덱스에는 잎 페이지마다 평균 38개의 인덱스 행이 있습니다. 이 검색에서는 5,000페이지(190,000/페이지 당 38행)를 읽어야 합니다.

AND에 대한 인덱싱: 예제

위 예제를 대충 살펴보십시오. 연구 노트에 나열된 선택 항목을 사용하여 이 문에 가장 적합한 인덱스 종류를 확인할 수 있습니다. 조건에 맞는 모든 행이 포함될 것이므로 4번이 가장 적합합니다. 6번은 쿼리를 포괄하지만 키 범위가 넓기 때문에 인덱스가 커질 것입니다. 7번은 dept에 대한 클러스터된 인덱스와 같지만 훨씬 큽니다.

흔히 WHERE 절에 나열된 열 순서가 복합 인덱스의 사용 방식에 영향을 미친다고 생각하지만 이는 오해입니다. 사실은 그렇지 않습니다. 복합 인덱스의 맨 왼쪽 열이 WHERE 절 안에 있는 경우에만 문제가 됩니다.

또한 지금은 비교적 일반적인 데이터 분포를 가정하고 있다는 것도 고려해야 합니다. 모든 사람의 소득이 50000을 넘거나 반대로 50000을 넘는 사람이 없는 경우 또는 회사 전체를 조사 대상에 포함한 경우 이 인덱싱 전략은 바뀔 수 있습니다.

두 조건 모두 충족되면 행이 검색 조건을 만족하는 것입니다.

위 예제에서 평가할 선택 사항

  1. dept에 대해 클러스터된 인덱스 또는 클러스터되지 않은 인덱스
  2. salary에 대해 클러스터된 인덱스 또는 클러스터되지 않은 인덱스
  3. dept에 대해 하나, salary에 대해 하나
  4. dept, salary에 대해 클러스터된 복합 인덱스
  5. salary, dept에 대해 클러스터된 복합 인덱스
  6. dept, salary, name, address에 대해 클러스터되지 않은 인덱스(포함 인덱스)
  7. dept, salary, name, address에 대해 클러스터된 인덱스

OR에 대한 인덱싱

OR는 AND와는 상황이 많이 다릅니다.

AND로 결합된 여러 조건은 필요한 데이터의 자격 조건을 조금씩 더 엄격하게 만듭니다. AND 조건 중 어느 하나를 만족하는 모든 행의 집합이 있다면 최종 결과 행이 그 집합에 있을 것입니다.

그러나 OR 조건에서는 그렇지 않습니다. OR 조건 중 어느 하나를 만족하는 모든 행의 집합이 있을 때, 이 결과 집합에 포함되지 않았어도 OR 조건 중 또 다른 조건을 만족하는 행들이 있을 수 있습니다.

OR에 대해서는 이 장의 뒷부분에서 자세히 설명합니다.

SELECT *에 대한 인덱싱: 예제

SELECT *는 모든 열의 정보를 반환합니다.

인덱스 선택과 선택되는 항목은 아무 관련이 없습니다. 인덱스 선택은 자격이 부여되는 항목에 대해서만 중요합니다. 인덱스는 행의 위치를 찾는 데 도움을 주지만 행의 정보를 선택하는 데는 영향을 미치지 않습니다. 모든 열이 정렬 키에 포함되지 않는 한 클러스터되지 않은 인덱스가 SELECT *를 포괄할 수 없습니다.

실제로 필요한 데이터보다 많은 데이터를 검색하려는 경우 SELECT * 쿼리 유형을 사용해서는 최적의 성능을 얻을 수 없습니다.

위 예제에서 평가할 선택 사항

  • au_id 열에 대해 클러스터된 인덱스. au_id 열에 대해 클러스터된 인덱스를 만들면 행이 그 순서대로 저장됩니다.
  • au_id 열에 대해 클러스터되지 않은 인덱스. 이를 위해서는 데이터 페이지에 액세스해야 하며 I/O가 또 하나 증가할 것입니다.
  • au_id, au_lname에 대해 클러스터되지 않은 인덱스

복수 쿼리에 대한 인덱싱

이전 예제에서는 개별 쿼리에 따라 가장 적합한 인덱스 종류를 선택했습니다. 한 쿼리에 가장 적합한 인덱스가 다른 쿼리에는 그렇지 않을 수 있기 때문에 복수 쿼리에 대한 인덱싱은 더 복잡합니다. 목표는 우선 순위가 높은 모든 쿼리에 대해 적절한 성능을 얻는 것입니다.

위 예제에서 평가할 선택 사항

가정: 쿼리 1은 테이블의 15%를 사용합니다. 쿼리 2는 선택도가 높습니다. 즉, 한 행만 액세스합니다.

선택 사항 1

  • price에 대해 클러스터된 인덱스
  • title에 대해 클러스터되지 않은 인덱스

쿼리 1이 매우 빠르게 실행됩니다. 쿼리 2도 빠르지만 클러스터된 인덱스가 title 열에 있으면 I/O가 하나 더 필요합니다.

선택 사항 2

  • price에 대해 클러스터되지 않은 인덱스
  • title에 대해 클러스터된 인덱스

쿼리 1은 선택 사항 1보다 느리게 실행되고 쿼리 2는 매우 빠르게 실행됩니다.

선택 사항 3

  • price에 대해 클러스터된 인덱스
  • title, price에 대해 클러스터되지 않은 인덱스

쿼리 1은 빠르게 실행되고 쿼리 2는 매우 빠르게 실행됩니다.

선택 사항 4

  • price, title에 대해 클러스터되지 않은 인덱스
  • title에 대해 클러스터된 인덱스

이 선택 사항이 최적의 옵션입니다. 쿼리 1과 쿼리 2 모두 매우 빠르게 실행됩니다.

업데이트 고려 사항

온라인 트랜잭션 처리(OLTP) 쿼리는 행을 먼저 찾아야 수정할 수 있다는 점 때문에 데이터 검색 항목을 일부 포함합니다. 그러나 가장 중요한 쿼리가 OLTP 쿼리인 경우 아래 사항을 추가로 고려해야 합니다.

  • 인덱스를 유지 관리해야 합니다. 인덱스된 테이블을 수정하면 최소한 하나의 인덱스 그리고 어쩌면 이보다 많은 인덱스를 업데이트해야 할 것입니다. 인덱스에 열이 많이 포함될수록 유지 관리 작업이 더 많이 필요합니다.
  • 수정되는 각 데이터 행은 물론 수정되는 각 인덱스 행도 로그에 기록해야 합니다.

지침

  • 주로 OLTP에 사용되는 응용 프로그램에 대해서는 인덱스 수를 최대한 줄입니다.
  • 클러스터된 인덱스 열은 휘발성이 없어야 합니다.

인덱싱 지침

인덱스 유지 관리

Dat34c

클러스터된 인덱스

테이블에 클러스터된 인덱스가 있으면 클러스터된 인덱스 키의 순서대로 행을 삽입해야 합니다. 페이지에 공간이 없으면 페이지를 분할해야 하며 이 때문에 추가 오버헤드가 발생할 수 있습니다.

클러스터되지 않은 인덱스

클러스터되지 않은 인덱스는 모든 데이터 행에 대한 포인터를 가집니다. 행을 삽입하거나 삭제할 때마다 클러스터되지 않은 모든 인덱스를 업데이트해야 합니다.

UPDATE가 전체 DELETE/INSERT이거나 지연된 UPDATE인 경우, 삭제된 행과 삽입된 행 모두에 대해 클러스터되지 않은 모든 인덱스를 업데이트해야 합니다. UPDATE가 지정되어 있거나 같은 페이지에 있더라도 변경되는 열의 모든 인덱스를 업데이트해야 합니다. 광범위한 복합 인덱스가 있는 경우 이 작업 때문에 많은 오버헤드가 발생할 수 있습니다.

인덱스 생성에 관한 지침

모든 쿼리의 우선 순위 결정

  • 데이터 및 데이터의 사용 방식을 철저히 파악합니다.
  • 먼저 처리해야 할 데이터베이스 트랜잭션을 결정합니다.

각 쿼리의 선택도 결정

  • WHERE 절의 각 부분에 대한 선택도를 결정합니다.

각 테이블에 대한 작업 차트 작성

  • 테이블의 각 열에서 수행되는 작업을 분석합니다.

인덱싱해야 하는 열 결정

  • WHERE 절에 해당 열이 사용됩니까?

    쿼리의 WHERE 절이나 데이터 수정 문에서 열이 전혀 참조되지 않는 경우 그 열에는 인덱스를 만들 필요가 없습니다.

  • 열이 조인 키로 사용됩니까?

    조인 키로 사용되는 열에 인덱스를 만들면 쿼리 최적화 프로그램이 테이블 스캔을 수행하는 대신 인덱스를 사용할 수 있게 되므로 조인 성능이 향상됩니다.

  • 자주 검색되는 열입니까?

클러스터된 인덱스에 가장 적합한 열 선택

  • 일정 범위의 데이터에 액세스합니까? 트랜잭션 문에 LIKE 일치 조건이 포함됩니까?
  • 클러스터된 인덱스는 일정 범위를 가진 쿼리에 가장 효과적으로 작용합니다.
  • 데이터가 항상 정렬됩니까?

    특정 열의 데이터가 자주 정렬되는 경우 그 열에 클러스터된 인덱스를 배치하면 정렬 오버헤드가 줄어듭니다.

  • 열에 고유한 값이 포함된 경우 고유 인덱스가 유용합니까?
  • 클러스터되지 않은 인덱스를 만들기 전에 클러스터된 인덱스를 만듭니다.
  • 특히 데이터가 단순한 경우, 클러스터된 인덱스를 기본 키에 배치하는 것이 반드시 최상의 선택은 아닙니다.
  • 조인 키 열에는 클러스터된 인덱스가 필요하지 않습니다.

필요한 다른 인덱스 결정

  • 각 테이블에 대해 만들 수 있는 최소 인덱스 수를 결정합니다.
  • 인덱스의 성능 이득과 업데이트 유지 관리 비용 간에 균형을 유지합니다.
  • 우선 순위가 가장 높은 쿼리의 WHERE 절에서 참조되는 열이 인덱스되었는지 확인합니다.
  • 쿼리를 자주 실행하지 않는 경우 특정 작업 기간 동안 인덱스를 만든 다음 이를 삭제하는 방법도 고려할 수 있습니다. 예를 들어, 모든 보고 또는 요약 분석이 월말이나 연말에 이루어지는 경우 작업 기간 동안만 인덱스를 만든 다음 나중에 이를 삭제할 수 있습니다.

생성할 클러스터되지 않은 인덱스 종류 결정

  • 복합 인덱스가 단일 열 인덱스보다 효율적입니까?
  • 인덱스가 쿼리를 포괄할 수 있습니까?
  • 쿼리의 선택도가 정확한 일치입니까?

    클러스터되지 않은 인덱스는 정확한 일치(한 행만 반환), 조인 또는 고유한 기본 키 열에 유용합니다.

  • 열에 고유한 값이 포함된 경우 고유 인덱스가 유용합니까?

쿼리 성능 테스트

  • 인덱스를 만든 후 우선 순위가 가장 높은 쿼리의 성능을 테스트합니다.
  • SET SHOWPLAN ON, SET STATISTICS IO ON, SET STATISTICS TIME ON을 지정한 다음 각 쿼리를 실행합니다.

인덱싱하지 않아야 할 때

인덱싱하지 않아야 할 상황도 있습니다. 예를 들면 아래와 같습니다.

  • 최적화 프로그램이 인덱스를 결코 사용하지 않는 경우
  • 행의 10-20% 이상이 반환되는 경우
  • 열에 1개에서 3개의 고유 값만 포함된 경우(선택도가 낮은 경우)
  • 인덱스될 열이 20바이트보다 긴 경우
  • 인덱스 유지 관리로 인한 오버헤드가 이득보다 큰 경우
  • 테이블이 매우 작은 경우

DSS와 OLTP 간의 균형 유지

DSS 환경과 OLTP 환경의 인덱싱 요구 사항은 크게 다르기 때문에 두 환경 모두 필요한 경우 인덱싱 전략을 결정하기가 매우 어려울 수 있습니다.

완전히 똑같은 데이터에 대해 검색과 수정이 동시에 이루어지지 않도록 별도의 데이터 복사본을 만들 수 있습니다. 이 경우 데이터 조정 전략이 필요합니다. 서로 다른 두 환경에 가장 적합한 인덱스를 만드는 데 드는 비용과 이를 통해 얻을 수 있는 이점은 두 데이터 집합을 유지 관리하고 조정하는 데 드는 비용을 기준으로 측정해야 합니다.

쿼리 최적화 프로그램 소개

SQL Server 쿼리 최적화 프로그램은 어떤 인덱스가 정말로 유용한 인덱스인지 그리고 특정 쿼리에 대해 어떤 인덱스를 사용하는 것이 가장 좋은지 결정합니다. 또한 복수 테이블의 조인을 어떻게 처리할 것인지 결정하여 테이블 순서와 방법을 선택합니다. 또한 업데이트 작업을 수행하기 위한 최적의 방법도 결정합니다.

3부에서는 SQL Server 최적화 프로그램이 사용 가능한 정보를 어떻게 취사 선택하고 이를 사용하여 어떻게 최적의 실행 계획을 결정하는지에 대해 자세히 설명합니다.

© 1997 Microsoft Corporation. All rights reserved.

이 문서에 포함된 정보는 문서를 발행할 때 논의된 문제들에 대한 Microsoft Corporation의 당시 관점을 나타냅니다. Microsoft는 변화하는 시장 환경에 대처해야 하므로 이를 Microsoft 측의 책임으로 해석해서는 안 되며 발행일 이후 소개된 어떠한 정보에 대해서도 Microsoft는 그 정확성을 보장하지 않습니다.

이 설명서는 오직 정보를 제공하기 위한 것입니다. Microsoft는 이 요약에서 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.

Microsoft 및 Windows NT는 Microsoft Corporation의 등록 상표입니다. Intel은 Intel Corporation의 등록 상표입니다.

여기에 인용된 다른 제품이나 회사 이름은 해당 소유자의 상표일 수 있습니다.
 

최종 수정일 : 2000.5.12

728x90

Reference URL :

http://www.microsoft.com/korea/TechNet/sql/Technote/dat411.asp

 

개발자를 위한 MS SQL Server 성능 조정 및 최적화, 제 2부: 쿼리 최적화 프로그램

DAT 411
Tech-Ed 97에 소개됨

Adam Shapiro
Program Manager
Microsoft Corporation

개요

Dat1d

목표

  • 쿼리 처리 단계를 나열합니다.
  • 검색 인수와 비검색 인수를 구분합니다.
  • 쿼리 최적화 프로그램에서 쿼리 계획을 작성하기 위해 인덱스 통계를 사용하는 방법을 설명합니다.
  • 쿼리 최적화 프로그램에서 쿼리 비용을 계산하는 방법을 설명합니다.
  • 조인을 처리하는 방법을 설명합니다.

쿼리 최적화 프로그램 개요

Dat2d

쿼리 최적화 프로그램은 각 SQL 문을 평가하여 최적의 실행 계획을 결정합니다.

쿼리 최적화 프로그램이 작동하는 방식을 이해하는 것이 더 나은 쿼리를 작성하고 유용한 인덱스를 만드는 데 도움이 됩니다.

쿼리 최적화 프로그램의 목적

Dat3d

가장 효율적인 계획 결정

쿼리 최적화 프로그램은 데이터 검색과 SELECT, INSERT, UPDATE 및 DELETE와 같은 데이터 조작 쿼리의 실행 순서에 대한 최적의 계획을 결정합니다. 쿼리 최적화 프로그램은 쿼리를 수행하기 위해 필요한 일련의 개략적인 단계를 생성합니다. 최적화 프로그램은 행 찾기, 행 조인 및 행 정렬의 과정만 최적화할 수 있습니다.

비용 기준 최적화를 사용하는 SQL Server

비용 기준 최적화 프로그램은 생성된 각 쿼리 계획을 평가하여 반환된 행 수와 각 관계형 작업에 필요한 실제 디스크 입출력 양으로 계획 실행 비용을 예측합니다.

비용 기준 최적화 프로그램은 기반 데이터와 테이블 크기, 테이블 구조 및 사용 가능한 인덱스와 같은 저장소 구조에 대한 지식을 사용합니다. 또한 각 인덱스에 유지된 통계에 기준한 각 관계형 작업의 선택도를 예측합니다.

비용 기준 최적화 프로그램은 결과 집합을 생성하는 데 필요한 관계형 작업의 다양한 순서를 평가하여 시스템 오버헤드의 형태로 가장 낮은 예측 비용을 갖는 실행 계획에 도달합니다.

비용 예측은 각 관계형 작업의 선택도를 예측하는 통계 데이터를 많이 사용할수록 정확해집니다.

질의 성능은 개별 기술의 속도와 효율적인 조인 순서 선택 여부에 따라 결정됩니다. 쿼리 최적화 프로그램은 합리적인 시간 내에 실행할 수 있도록 고려할 선택의 수를 제한합니다.

또한 성능은 논리 및 실제 페이지 액세스의 양으로도 측정됩니다.

쿼리 최적화 프로그램은 쿼리 계획의 비용을 평가하기 위해 논리 및 실제 액세스를 모두 고려합니다. 또한 고정된 비율의 페이지가 캐시에 있다는 것도 고려합니다.

쿼리 최적화 프로그램은 전략을 평가하여 누적 CPU 및 입출력 시간이 가장 작은 것을 찾습니다. 이 측정에는 실제 입출력 양이 사용됩니다. 목표는 실제 입출력 양을 줄이는 것입니다.

쿼리 최적화 프로그램이 작동하는 방식을 이해하면 더 나은 쿼리를 작성하고 더 좋은 인덱스를 선택하고 성능 문제를 감지하는 데 유용한 세부 사항을 파악할 수 있습니다.

최적화가 적합한 단계

쿼리는 SQL Server로 제출된 후 몇 단계에 걸쳐 원본 쿼리를 최적화 프로그램이 해석할 수 있는 형식으로 변환됩니다. 다음은 쿼리를 처리하고 결과 집합을 반환하기 위해 발생해야 하는 단계의 개요입니다.

구문 분석 과정

구문 분석 과정에서는 수신 쿼리의 구문이 올바른지 확인하고 구문을 관계형 데이터베이스 관리 시스템에서 이해할 수 있는 구성 요소 부분으로 분해합니다. 이 단계의 출력은 구문 분석된 쿼리 트리입니다.

표준화 과정

표준화 과정에서 쿼리는 최적화에 유용한 형식으로 전환합니다. 발견된 모든 필요 없는 구문 절은 제거됩니다. 가능하다면 하위 쿼리는 평면화됩니다. 이 단계의 출력은 표준화된 쿼리 트리입니다.

쿼리 최적화

쿼리 최적화 프로그램은 쿼리를 처리하는 효율적인 쿼리 계획을 생성합니다. 이 단계에는 3개의 하위 단계(쿼리 분석, 인덱스 선택 및 조인 선택)가 있습니다. 쿼리 최적화 프로그램은 자동으로 가능한 실행 계획의 수를 제한합니다. 이 단계의 출력을 실행 계획 또는 쿼리 계획이라고 합니다.

컴파일

코드가 실행 가능한 코드로 컴파일됩니다.

데이터베이스 액세스 루틴

최적화 프로그램은 선택적으로 테이블 검색을 수행하거나 사용 가능한 인덱스를 사용하여 데이터를 액세스하는 가장 좋은 방법을 결정합니다. 그 방법이 이제 적용됩니다.

쿼리 최적화 프로그램 정보

Dat5d

쿼리 최적화 프로그램은 사용 가능한 정보를 분석하여 가장 좋은 쿼리 계획을 결정합니다.

sysindexes 테이블

최적화 프로그램은 sysindexes에서 다음과 같은 정보를 사용할 수 있습니다.

열 이름
설명
indid
인덱스의 ID. 가능한 값:
0 테이블(클러스터되지 않은 테이블)
1 클러스터된 인덱스
>1 클러스터되지 않은 인덱스
255 텍스트나 이미지 데이터가 있는 테이블 항목
dpages
indid = 0이거나 indid = 1인 경우, dpages는 사용된 데이터 전용 페이지의 수입니다. indid = 255인 경우, rows는 0으로 설정됩니다. 그렇지 않으면 dpages는 잎 수준 인덱스 페이지의 수입니다.
rows
indid = 0 또는 indid = 1에 기준한 데이터 수준 행의 수. 이 값은 indid > 1일 때까지 반복됩니다. indid = 255의 경우, rows는 0으로 설정됩니다.
distribution
배포 페이지에 대한 포인터(항목이 인덱스인 경우)
rowpage
페이지당 최대 행 수
minlen
행의 최소 크기
maxlen
행의 최대 크기
maxirow
잎이 아닌 인덱스 행의 최대 크기
keys1
키 열의 설명(항목이 인덱스인 경우)
keys2
키 열의 설명(항목이 인덱스인 경우)
soid
인덱스와 함께 만들어진 정렬 순서 ID, 키에 문자 데이터가 없으면 0
csid
인덱스와 함께 만들어진 문자 집합 ID, 키에 문자 데이터가 없으면 0

키 값의 통계적 배포

이 정보는 배포 페이지에 있습니다.

실행할 쿼리

쿼리는 최적화 프로그램에서 가장 유용한 인덱스를 결정하는 데 필요한 선택 기준을 제공합니다. 쿼리에 표현된 행 한정 방법이 최적화 프로그램의 결정에 영향을 미칠 수 있습니다.

SHOWPLAN

이 SET 문 옵션은 각 테이블에 사용하기 위해 선택된 인덱스에 대한 최적화 프로그램의 최종 결정, 테이블을 조인할 순서 및 선택한 업데이트 모드 등을 보고합니다. 작업 테이블과 다른 전략 또한 SHOWPLAN 출력에 보고됩니다.

1단계: 쿼리 분석

Dat6d

쿼리 최적화 프로그램의 첫째 단계를 쿼리 분석이라고 합니다. 이 단계에서 최적화 프로그램은 구문 분석된 각 절을 조사하여 최적화될 수 있는지 결정합니다. 최적화할 수 있는 절은 검색 인수나 조인 절을 포함한 절과 같이 스캔을 제한하는 절입니다. 최적화 프로그램은 최적화할 수 있는 이러한 절에 대해서 적절한 인덱스가 있는지 결정합니다.

검색 인수

Dat7d

검색 인수는 특정 정보를 요청하는 것이기 때문에 검색을 제한합니다. 정확히 일치, 값의 범위 또는 AND 연산자로 조인된 둘 이상의 항목 결합을 지정합니다. 검색 인수에는 연산자를 사용하여 열에 작동하는 상수 식을 포함합니다.

  • 검색 인수의 형식은 다음과 같습니다.

    <열> <포함 연산자> <상수> [AND...]
    또는
    <상수> <포함 연산자> <열> [AND...]

  • 공용 연산자는 >, <, =, BETWEEN, LIKE를 포함합니다.
  • 모든 열은 같은 테이블에 있어야 합니다.
  • AND와 연결된 경우, 검색 인수는 여러 조건을 포함할 수 있습니다.
예제

name = 'jones'

salary > 40000

60000 < salary

department = 'sales'

name = 'jones' AND salary > 100000

비검색 인수

Dat8d

식이 검색을 제한하지 않으면 비검색 인수로 취급됩니다. 이것에는 포함 식보다는 단독 식이 포함됩니다.

예를 들어, 같지 않음(!=) 식은 검색 기준에 맞지 않는 데이터를 결정하려면 먼저 데이터를 조사해야 합니다.

다른 예는 다음과 같은 열 간의 비교입니다.

salary = commission

두 열이 테이블 자체에 포함되기 때문에 인덱스가 유용하지 않을 수 있습니다.

또 다른 예는 데이터 액세스에 앞서 계산을 필요로 합니다. 다음 예를 참조하십시오.

salary * 12 > 36000

이 경우, SQL Server에서 행의 자격 여부를 결정하려면 먼저 salary 열을 액세스하여 계산을 수행해야 합니다.

토론 과제

다음 쿼리에서 검색 인수는 무엇입니까?

SELECT COUNT(*)
FROM dept, empl, job
WHERE empl.age > 30
AND (dept.floor = 2 OR dept.floor = 3)
AND job.rate > $20.00
AND empl.jobno = job.jobno

비검색 인수 변환

Dat9d

많은 경우에 비검색 인수는 검색 인수로 다시 작성할 수 있습니다. 검색 인수를 포함하는 쿼리는 최적화 프로그램이 인덱스를 선택하는 기회를 늘려줍니다.

열에 대한 계산과 관련된 식은 열을 격리하여 검색 인수로 변환될 수 있습니다.

_
비검색 인수
WHERE price * 12 = 100
_
검색 인수
WHERE price = 100/12

쿼리를 작성할 때 연산자의 한 쪽에 열 정보를 유지하고 다른 쪽에 검색 기준을 유지합니다.

BETWEEN과 LIKE와 같은 일부 식은 쿼리 최적화 프로그램에 의해 내부적으로 검색 인수로 수정됩니다.

  • BETWEEN 절은 경계를 정의하는 > = 및 < =로 표현된 범위와 동등합니다.
  • LIKE 식은 name LIKE 'jo%'의 예와 같이 식의 첫째 문자가 상수라면 인덱스에 의해 처리될 수 있습니다. 이것은 name >= 'jo' AND name < 'jp'와 같습니다. name LIKE '%jo' 식은 검색을 제한하지 않기 때문에 검색 인수가 아닙니다.
인덱스 사용을 피하기 위한 비검색 인수의 사용

검색 절에 비검색 인수를 사용하면 쿼리 최적화 프로그램에서 특정 인덱스를 선택하지 않게 할 수 있습니다. 예를 들어, 다음과 같이 열에 0을 추가합니다.

salary + 0 > 30000

이 문은 최적화 프로그램에서 salary에 대한 인덱스를 평가하지 않도록 보장합니다.

OR 절

Dat10d

OR 절은 쿼리 분석의 일부로 간주되기 때문에 여기서 설명합니다. 하지만 이후에 더 자세히 다룰 것입니다.

조인 절

Dat11d

둘 이상의 테이블에서 데이터를 검색하려면 조인 절이 필요합니다. 조인 절은 같은 데이터베이스나 다른 데이터베이스에 있는 다양한 테이블에서 데이트를 연결합니다.

자기 조인 역시 조인 절의 예입니다.

예제

SELECT e1.manager_name, e2.name
FROM empl e1, empl e2
WHERE e1.emplno = e2.manager_no

2단계: 인덱스 선택

Dat12d

인덱스 선택은 쿼리 최적화의 둘째 단계입니다. 이 단계 중에 쿼리 최적화 프로그램은 절을 위한 인덱스가 있는지 확인하고 절의 선택도를 확인하여 유용성을 평가(반환되는 열의 수)하고 한정된 열을 찾는 데 필요한 페이지 액세스 수(논리 및 실제 모두)를 예측합니다.

유용한 인덱스의 유무 결정

Dat13d

유용한 인덱스가 있는지 파악하는 첫째 단계는 인덱스가 절과 일치하는지 확인하는 것입니다.

다음과 같은 경우에 인덱스가 유용합니다.

  • 인덱스의 첫째 열은 검색 인수에 사용됩니다.
  • 검색 인수는 검색을 제한하기 위해 하한, 상한 또는 둘 모두를 설정합니다.

고려 사항

WHERE 절에 고차(high-order) 열이 지정된 경우, 쿼리 최적화 프로그램은 클러스터되지 않은 인덱스를 사용하여 평가할 수 있습니다.

쿼리 최적화 프로그램은 인덱스된 열이 WHERE 절에 지정되어 있는지 여부에 관계 없이 항상 관련 인덱스를 평가합니다.

절의 선택도 결정

Dat14d

통계를 사용할 수 있는 경우

절과 일치하는 유용한 인덱스를 찾은 후에 그 유용성은 절의 선택도를 결정하여 평가됩니다. 유용한 인덱스가 존재하는 경우에도 최적화 프로그램에서 해당 인덱스 액세스가 최선의 액세스 방법이 아니라고 결정하면 사용되지 않을 수 있습니다. 선택도는 절을 만족시키는 행의 수를 예측하여 결정됩니다. 통계를 사용할 수 있으면 서버는 배포 단계를 사용하여 인덱스를 평가합니다.

통계를 사용할 수 없는 경우

사용할 수 있는 통계가 없는 경우, 서버는 연산자에 따라 고정된 비율을 사용합니다.

통계를 사용할 수 없다면 최적화 프로그램은 다음과 같은 기본값을 사용합니다.

연산자
행의 가정 비율
=
10%
>
33%
<
33%
BETWEEN
25%

특수한 경우는 최적화 프로그램이 WHERE 절에 등가성이 있다는 것과 인덱스가 고유하다는 것을 인식한 경우입니다. 이것은 정확히 일치하고 항상 한 열만 반환하기 때문에 최적화 프로그램은 통계를 사용할 필요가 없습니다.

테이블에 데이터가 없을 때 또는 테이블이 잘린 후에 만들어진 인덱스라면 사용할 수 있는 통계가 없을 것입니다.

인덱스 통계

Dat15d

최적화 프로그램이 인덱스의 유용성을 예측하기 위해 사용하는 통계는 검색을 제한하거나 여러 테이블 쿼리를 위한 조인 순서를 결정합니다. 통계는 모든 인덱스에 대해 유지되어 주어진 인덱스의 분산 값에 대한 정보를 제공합니다.

SQL Server에서는 인덱스 통계를 위해 분산 값이 유지됩니다. 단계 당 행 수는 키 값 범위가 변경되어도 일정하게 유지됩니다. 표준 분산에서 키 값 범위는 범위 당 숫자가 변경되어도 일정하게 유지됩니다. 균일한 분산을 사용하면 쿼리 최적화 프로그램에서 테이블 전체 행의 비율로 자격이 있는 열의 수를 추정하여 쉽게 쿼리의 선택도를 결정할 수 있습니다.

분산 페이지

Dat16d

분산 페이지는 인덱스에 포함된 값의 표본 추출을 나타냅니다.

인덱스에 대한 분산 페이지가 만들어졌는지 확인하려면 sysindexes 테이블에서 distribution 열을 쿼리합니다. distribution 열 값이 0이면 해당 인덱스에 사용할 수 있는 통계가 없다는 것을 나타냅니다. 그 외의 다른 숫자는 분산 페이지의 위치를 나타냅니다.

UPDATE STATISTICS를 실행하여 테이블에서 각 인덱스에 대한 분산 페이지를 만듭니다.

조밀도는 중복의 평균 값을 나타냅니다. 남아 있는 각 열에 기반한 하위 집합에 대한 개별 값이 복합 인덱스에 유지됩니다.

분산 단계

Dat17d

인덱스 키의 크기는 각 인덱스를 위한 분산 단계의 총 수를 결정합니다. 분산 페이지에 적합한 값의 수로 제한이 부과됩니다. 인덱스의 첫째 및 마지막 키 값은 항상 포함됩니다.

  • 데이터는 동등한 단계로 나누어지고 그 각각은 같은 수의 행을 포함합니다.
  • 단계의 수는 인덱스 키의 크기에 따릅니다.
  • 단계 당 하나의 인덱스 키가 있습니다.

참고 첫째 인덱스 키가 항상 분산 페이지에 포함되기 때문에 페이지 당 인덱스 키의 수에서 하나를 빼면 분산 단계의 총 수를 구할 수 있습니다.

그런 다음 분산 단계의 총 수는 인덱스 키의 총 수로 나뉘어 각 단계에 포함될 키의 수를 결정합니다. 각 단계에서 분산 페이지에 대한 하나의 인덱스 키가 기록됩니다.

SQL Server는 단계의 크기를 계산합니다.

Dat17d2

페이지 당 인덱스 키의 수에서 1을 빼면 분산 단계의 수와 같습니다. 단계의 수가 많을수록 정보가 더 정확합니다. 인덱스의 키가 작을수록 통계가 더 정확합니다. 단계의 수가 행의 총 수와 같으면 완전한 정보입니다.

복합 인덱스의 경우, 첫째 열의 키만 분산 단계 결정에 사용됩니다.

분산 단계: 예제

Dat18d

분산 단계의 수 계산

인덱스 키 크기 = 250바이트

페이지 당 인덱스 키 8개 - 1 = 7개의 분산 페이지

인덱스 키의 총 수 = 22

Dat18d2

단계 당 3개의 키가 있는 총 7단계가 있습니다.

테이블의 1/7이 각 단계에 있습니다.

각 단계(세째 행마다)에서 하나의 인덱스 키가 분산 페이지에 놓입니다.

클래스 예제

인덱스 키 크기 = 18바이트

페이지 당 인덱스 키의 수는?__________________________________

분산 단계의 수는?_____________________________________

인덱스 키의 총 수 = 94,795

단계 당 키의 수는?________________________________________

각 단계에서 테이블이 포함되는 양은?______________________________

분산 단계 조사

Dat19d

구문

DBCC SHOW_STATISTICS (테이블_이름, 인덱스_이름)

지정한 테이블(테이블_이름)에 대한 인덱스(인덱스_이름)의 분산 페이지에서 모든 통계 정보를 표시합니다. 반환된 결과는 인덱스의 선택도를 나타내며(반환된 조밀도가 낮을수록 선택도는 높음) 최적화 프로그램에서 인덱스가 유용한지 여부를 결정하는 기준을 제공합니다.

엔터프라이즈 관리자

SQL 엔터프라이즈 관리자를 사용하여 Manage 메뉴에서 Indexes를 누르거나 테이블 이름으로 드릴다운하여 이름을 마우스 오른쪽 단추로 누른 다음 Indexes를 누릅니다. 두 경우 모두에 데이터베이스의 모든 테이블에 대한 모든 인덱스를 검사할 수 있는 대화 상자가 나타납니다.

Distribution 단추를 누르면 DBCC SHOW_STATISTICS가 제공하는 정보와 같은 양의 정보를 볼 수 있습니다.

UPDATE STATISTICS

Dat20d

UPDATE STATISTICS [[데이터베이스.]소유자.]테이블_이름 [인덱스_이름]

테이블_이름 매개 변수는 인덱스가 관련된 테이블을 지정합니다. SQL Server에서는 데이터베이스의 인덱스 이름이 고유할 필요가 없기 때문에 이 매개 변수가 필요합니다.

인덱스_이름 매개 변수는 업데이트될 인덱스를 지정합니다. 인덱스 이름을 지정하지 않으면 지정한 테이블의 모든 인덱스를 위한 분산 통계가 업데이트됩니다. 인덱스 이름과 설명의 목록을 보려면 테이블 이름과 함께 sp_helpindex 시스템 저장 프로시저를 실행합니다.

구문

STATS_DATE (테이블_id, 인덱스_id)

이 함수는 지정한 인덱스(인덱스_id)에 대한 통계가 최종적으로 업데이트된 날짜를 반환합니다.

예제

테이블에서 모든 인덱스에 대해 통계가 업데이트된 날짜를 보려면 다음과 같은 명령을 사용합니다.

SELECT 'Index Name' = i.name, 'Statistics Updated' =
stats_date(i.id, i.indid)
FROM sysobjects o, sysindexes i
WHERE o.name = 'charge' AND o.id = i.id

통계 사용에 대한 예외

Dat21d

통계를 사용하지 않는 일부 경우가 있습니다. 이러한 일은 통계를 사용할 수 없거나 WHERE 절에 알 수 없는 값이 있을 때 발생합니다. 테이블에 데이터가 입력되기 전에 인덱스를 만들고 UPDATE STATISTICS를 실행하지 않았거나 테이블이 잘렸다면 통계를 사용할 수 없습니다.

알 수 없는 값

예제

DECLARE @var int
SELECT @var = 15
SELECT X FROM Y WHERE col = @var

WHERE 절에 알 수 없는 값이 포함되기 때문에 인덱스 통계의 키 값을 사용할 수 없습니다. 하지만 연산자가 =라면 SQL Server는 조밀도 정보를 사용하여 자격이 있는 행의 수를 예측합니다.

통계가 없다면 고정 비율은 사용되는 기본값과 약간 다릅니다.

연산자
행의 가정 비율
=
조밀도가 결정
<, >, BETWEEN
33%

참고 통계를 사용할 수 있다는 것이 최신 정보라는 의미는 아닙니다.

페이지 액세스 양 결정

Dat22d

절의 선택도 결정의 두 번째 부분으로 쿼리 최적화 프로그램은 행 추정에 기준한 논리 페이지 추정을 계산합니다. 이것은 특정 절을 선택하기 위한 최선의 인덱스를 결정합니다. 클러스터된 인덱스와 클러스터되지 않은 인덱스에 대한 페이지 추정 간에 큰 차이가 있을 수 있습니다. 클러스터되지 않은 인덱스를 사용하면 쿼리 최적화 프로그램은 가장 나쁜 경우를 가정합니다. 그것은 각 행을 다른 페이지에서 찾게 되는 것입니다. 쿼리 최적화 프로그램은 이러한 요인을 비용 기준 최적화 계산에 고려합니다.

인덱스가 없는 경우

논리 페이지 액세스 = 테이블의 데이터 페이지 총 수

클러스터된 인덱스의 경우

논리 페이지 액세스 = 인덱스의 수준 수 + 스캔할 데이터 페이지 수(데이터 페이지 = 한정된 행 수/데이터 페이지 당 행)

클러스터되지 않은 인덱스의 경우

논리 페이지 액세스 = 인덱스의 수준 수 더하기 잎 페이지의 수(한정된 행/잎 페이지 당 행) 더하기 한정된 행 수(각 행이 별도의 페이지에 있다고 가정)

첨부 인덱스의 경우

논리 페이지 액세스 = 인덱스의 수준 수 더하기 잎 페이지의 수(한정된 행/잎 페이지 당 행)

고유 인덱스의 경우

쿼리가 고유 인덱스 키의 모든 부분에 대해 등가성을 검색 중인 경우, 논리 페이지 액세스 = 1 더하기 인덱스 수준 수

3단계: 조인 선택

Dat23d

조인 선택은 쿼리 최적화 단계의 세 번째 주요 단계입니다. 복수의 테이블 쿼리나 자기 조인이 있다면 최적화 프로그램은 조인 선택을 평가합니다. 최적화 프로그램은 절이 정렬되는 방법을 비교하여 논리 페이지 입출력의 형태로 추정 처리 비용이 가장 낮은 조인 계획을 선택합니다.

조인 절의 선택도 결정

Dat24d

조인 선택도는 테이블 A에서 테이블 B의 한 열과 조인되는 열 수를 결정합니다. 이것은 검색 인수와 일치하는 열 수를 결정하는 것과 다릅니다. 조인 선택도는 조인을 처리하는 순서를 결정하는 유용한 요소입니다.

통계를 사용할 수 있으면 조인 선택도는 인덱스 조밀도에 기반합니다. 통계를 사용할 수 없으면 추론은 1을 더 작은 테이블의 행 수로 나눈 것입니다.

조인 선택도는 조인 절에서 예상되는 행 수를 참고합니다. 이 값은 계산하여 얻거나 조밀도(중복 행의 평균 비율)에 기준합니다.

조인 절 예제

WHERE dept.deptno = empl.deptno

가정:

1,000 employee 100 department

직관적으로 department 당 10명의 employee가 있다고 추정할 수 있습니다. 그러나 쿼리 최적화 프로그램은 직관이 없기 때문에 다른 방법을 통해 선택도를 계산해야 합니다.

위 절의 선택도는 1/100 또는 .01입니다.

department 테이블의 행이 주어지면 employee 테이블에서 조인될 행 수는 1,000 * .01 = 10입니다.

employee 테이블의 행이 주어지면 department 테이블에서 조인될 행 수는 100 * .01 = 1입니다.

조인의 중첩 반복

Dat25d

쿼리에 조인 절이 있으면 최적화 프로그램은 테이블, 인덱스 및 조인의 수를 평가하여 중첩 반복의 최적 순서를 결정합니다.

전략
  • 최적 조인 순서를 결정하기 위해 한 번에 4개의 테이블을 평가합니다.
  • 외부 테이블의 다음 한정된 행에서 내부 쿼리로 값을 투영합니다.
  • 외부 테이블 검색 인수는 검색을 제한하므로 인덱스를 사용할 수 있습니다.
  • 이전에 설명한 전술에 따라 단일 테이블 쿼리를 처리합니다.
지침
  • 더 많은 조인 절을 추가할수록 최적화 프로그램에서 더 많은 쿼리 계획을 선택할 수 있습니다.
  • 중복되는 절을 추가합니다.

조인의 중첩 반복: 예제

Dat26d

최적화 프로그램은 조인의 중첩 반복을 수행하도록 선택할 수 있습니다. 이 전략을 선택하면 SQL Server는 첫 번째 테이블에서 행을 찾은 후에 다음 테이블 스캔에 해당 행을 사용하고 일치된 결과가 마지막 테이블 스캔에 사용될 때까지 계속하여 중첩된 루프의 집합을 구성합니다. 반복하여 테이블에서 테이블로 진행됨에 따라 결과 집합은 더욱 좁혀집니다.

쿼리 계획은 사용할 중첩된 테이블의 정렬 집합을 지정합니다. 다른 가능한 계획의 수는 테이블, 인덱스 및 조인의 수와 관련됩니다.

titles의 titleauthor 조인: 예제

Dat27d

예제

SELECT title
FROM titles, titleauthor
WHERE titles.title_id = titleauthor.title_id
AND titleauthor.royaltyper > 50

처리 단계
  1. titles의 다음 행을 가져옵니다.
  2. title_id의 값을 가져옵니다.

    title_id에 대한 인덱스를 사용하여 titleauthor에서 각 일치하는 행을 찾습니다.

    royaltyper의 값을 비교하여 50보다 크면 행을 반환합니다.

  3. 외부 테이블에서 한정된 행을 액세스할 수 있을 때까지 1단계와 2단계를 반복합니다.

titleauthor의 titles 조인: 예제

Dat28d

예제

SELECT title
FROM titles, titleauthor
WHERE titles.title_id = titleauthor.title_id
AND titleauthor.royaltyper > 50

처리 단계
  1. titleauthor WHERE royaltyper > 50의 다음 행을 가져옵니다.
  2. title_id에 대한 인덱스를 사용하여 titles를 검색하고 행을 반환합니다.
  3. 외부 테이블에서 한정된 행을 액세스할 수 있을 때까지 1단계와 2단계를 반복합니다.

3방향 조인: 예제

Dat29d

예제

SELECT t.title, a.au_lname
FROM titles t, authors a, titleauthor ta
WHERE t.title_id = ta.title_id
AND a.au_id = ta.au_id
AND a.au_lname = 'Green'

예제 1

titles to ta (titleauthor) to authors (shown above)

3개의 titles가 있기 때문에 titleauthor를 세 번 검색하고 authors를 여섯 번 검색합니다.

예제 2

authors to ta (titleauthor) to titles (shown above)

하나의 author = Green만 있기 때문에 titleauthor를 한 번만 검색하고 titles를 두 번 검색합니다.

이 예제들의 차이점은 authors가 첫 번째 경우에는 여섯 번, 두 번째 경우에는 한 번만 검색된다는 것입니다.

핵심 사항
  • 테이블 수가 증가함에 따라 내부 테이블의 반복 수가 증가합니다.
  • 테이블 검색의 비용은 유용한 인덱스가 있는지 여부에 따라 달라집니다.
  • 또한 검색 비용은 테이블의 크기와 각 수준에서 반환된 행 수에 관련됩니다.

최선의 계획 선택

Dat30d

총 비용 계산

  • 각 치환에 대해 쿼리 최적화 프로그램은 최선의 인덱스와 조인 전략을 계산합니다.

    각 조인 순서에 대한 비용을 계산합니다.

  • 각 테이블에 대해 쿼리 최적화 프로그램은 논리 페이지 액세스 수를 계산합니다.

    쿼리 최적화 프로그램은 인덱스가 고유하고 WHERE 절이 특정 값과 같은지 검사하여 비용이 항상 페이지 액세스 하나와 인덱스 수준의 수를 더한 값이 됩니다.

  • 쿼리 최적화 프로그램은 캐시에 비례한 각 테이블의 크기를 고려합니다.

쿼리 처리 단계 요약

SHOWPLAN 출력

Dat32d

SET 문의 SHOWPLAN 매개 변수 출력은 쿼리 처리를 위해 쿼리 최적화 프로그램이 선택한 최종 액세스 방법을 자세히 설명합니다. 아래는 출력 메시지에 대한 설명입니다.

STEP n

이 문은 모든 쿼리에 대한 SHOWPLAN 출력에 포함됩니다. 일부 경우에 SQL Server는 단일 단계에서 유효한 결과를 검색할 수 없기 때문에 쿼리 계획을 여러 단계로 나눕니다.

The type of query is <쿼리 종류>

이 문은 각 단계에서 사용된 쿼리의 종류(SELECT, INSERT, UPDATE 또는 DELETE)를 설명합니다. 다른 명령을 호출하는 동안 SHOWPLAN을 켜면 <query type>이 호출된 명령을 반영합니다.

The update mode is deferred

이 문은 선택된 업데이트 모드가 지연된 것을 나타냅니다.

The update mode is direct

이 문은 선택된 업데이트 모드가 직접인 것을 나타냅니다.

GROUP BY

이것은 GROUP BY 절이 포함된 모든 쿼리에 대해 SHOWPLAN 출력에 나타납니다. GROUP BY는 항상 작업 테이블에서 한정된 행을 선택하여 그룹화하는 단계와 결과를 반환하는 단계의 최소 두 단계가 필요합니다.

Scalar Aggregate

이것은 SELECT 문에 집계 함수가 사용된 것을 나타냅니다. 단일 값이 반환되기 때문에 포함된 행 수에 관계 없이 첫째 단계는 집계를 계산하고 둘째 단계는 최종 값을 반환합니다.

Vector Aggregate

GROUP BY 절이 집계 함수와 함께 사용되면 질의 최적화 프로그램은 벡터 집계를 사용합니다. 각 그룹에 대해 단일 값이 반환됩니다.

FROM TABLE

이 문은 쿼리가 액세스 중인 테이블 이름을 나타냅니다. FROM TABLE 다음에 나열된 테이블의 순서는 쿼리를 처리하기 위해서 함께 조인된 테이블의 순서를 나타냅니다.

TO TABLE

이것은 수정될 대상 테이블을 나타냅니다. 일부 경우에 테이블은 데이터베이스의 실제 테이블이 아니라 작업 테이블입니다.

Worktable

이것은 쿼리의 중간 결과를 유지하기 위해 임시 테이블이 작성된 것을 나타냅니다. 이 출력은 행을 정렬해야 할 때 발생합니다. Worktable은 항상 tempdb 데이터베이스에 만들어지고 결과가 반환된 후에 자동으로 삭제됩니다.

Worktable created for <쿼리 종류>

이것은 쿼리를 처리하기 위해 worktable을 만들었다는 것을 나타냅니다. query type은 SELECT_INTO, DISTINCT 또는 ORDER BY가 될 수 있으며 또는 REFORMATTING의 목적으로 worktable을 만들 수 있습니다.

This step involves sorting

이것은 쿼리의 중간 결과가 사용자에게 반환되기 전에 정렬되어야 함을 나타냅니다. 이것은 DISTINCT를 지정하거나 또는 ORDER BY를 포함하는 쿼리에 대한 유용한 인덱스가 없을 때 발생합니다.

Using GETSORTED

이것은 SQL Server가 결과 집합에서 행을 정렬하기 위해 임시 worktable을 만들었다는 것을 나타냅니다. 정렬된 수선에서 행을 반환하는 모든 쿼리가 이 단계를 사용하는 것은 아닙니다.

Nested iteration

중첩 반복은 최적화 프로그램의 기본 기법이며 이 구는 모든 SHOWPLAN 출력에 나타납니다.

EXISTS TABLE: nested iteration

이 문은 존재 검사의 일부로 사용된 테이블에 대한 중첩 반복을 나타냅니다. Transact-SQL에서 존재 검사는 EXISTS, IN 또는 =ANY로 작성할 수 있습니다.

Table Scan

이것은 쿼리 최적화 프로그램에서 결과를 검색하기 위해 테이블 스캔 전략을 선택했다는 것을 나타냅니다.

Using Clustered Index

이것은 쿼리 최적화 프로그램에서 결과 집합 검색을 위해 클러스터된 인덱스를 사용하고 있다는 것을 나타냅니다.

Index: <인덱스 이름 >

이것은 쿼리 최적화 프로그램에서 결과 집합을 검색하기 위해 사용 중인 클러스터되지 않은 인덱스의 이름을 나카냅니다.

Using Dynamic Index

이것은 최적화 프로그램에서 OR 처리 전략의 일부로 고유한 인덱스를 작성하도록 선택했다는 것을 나타냅니다.

STATISTICS IO 출력

Dat33d

STATISTICS IO의 출력은 다음과 같은 값을 포함합니다.

  • Logical Reads

    이 값은 해당 쿼리를 처리하기 위해 액세스된 페이지의 총 수를 나타냅니다. 모든 페이지 액세스는 데이터 캐시를 통해 액세스되기 때문에 캐시에서 아직 페이지를 사용할 수 없다면 읽어와야 합니다.

  • Physical Reads

    이 값은 디스크에서 읽은 페이지의 수를 나타냅니다. 이 값은 항상 Logical Reads 값보다 작거나 같아야 합니다.

    Cache Hit Ratio의 값은 다음과 같이 위의 두 값에서 계산될 수 있습니다.

    Cache Hit Ratio = (Logical Reads – Physical Reads) / Logical Reads

  • Read Ahead Reads

    이 값은 Read Ahead Manager가 캐시로 읽은 페이지의 수를 나타냅니다. 이 값이 크다는 것은 Physical Reads에 대한 값이 더 낮다는 것을 의미하며 미리 읽기를 사용할 수 없다면 Cache Hit Ratio가 더 높습니다.

  • Scan Count

    이 값은 대응하는 테이블을 액세스한 횟수를 나타냅니다. 외부 테이블은 항상 1의 스캔 카운트를 가집니다. 내부 테이블의 경우, Logical Reads의 수는 Scan Count에 각 스캔에서 액세스된 페이지의 수를 곱해 결정됩니다.

Dat34d

목표

  • 최적화 프로그램에서 최선의 계획을 선택했는지 확인합니다.
  • 사용 가능한 통계를 검사합니다.
  • 추적 플래그를 사용하여 최적화 프로그램의 결정 방법을 확인합니다.
  • 최적화 프로그램 참고를 사용하는 방법과 사용하는 시점을 설명합니다.
  • FORCEPLAN을 사용하여 최적화 프로그램의 조인 순서를 무시할 수 있는지 결정합니다.

최적화 프로그램의 선택 분석

Dat35d

대부분의 경우에 최적화 프로그램은 처리할 쿼리에 대해 최선의 인덱스와 최선의 조인 순서를 선택합니다.

최적화 프로그램이 최선의 선택을 했는지 의심스러운 경우, 최적화 프로그램에서 선택한 이유를 분석하는 데 사용할 수 있는 도구가 있습니다. 때로는 이유를 아는 것만으로도 올바른 선택을 했다고 납득할 수 있습니다.

다른 경우에는 확신이 서지 않을 수도 있습니다. 따라서 최적화 프로그램을 무시하는 데 사용할 수 있는 도구도 있습니다. 이러한 도구들을 사용하여 사용자의 선택이 최적화 프로그램의 선택보다 더 나은지 확인할 수 있습니다.

통계 관리 도구

Dat36d

DBCC UPDATEUSAGE

이 명령은 sp_spaceused 시스템 저장 프로시저에서 잘못된 공간 사용량 보고서를 만들 수 있는 sysindexes 테이블의 부정확성을 보고하고 교정합니다.

이 문은 U(사용자 정의 테이블) 또는 S(시스템 테이블) 형식의 개체에 대한 모든 클러스터된 인덱스에 대해 sysindexes 테이블의 used, reserveddpages 열을 고칩니다. 클러스터되지 않은 인덱스에 대해서는 크기 정보가 유지되지 않습니다. 이 문은 정확한 사용량 정보가 반환되도록 sysindexes의 공간 사용 카운터를 동기화하는 데 사용할 수 있습니다. 데이터베이스_이름 대신 0을 사용하면 현재 데이터베이스에서 업데이트가 수행됩니다.

구문

DBCC UPDATEUSAGE ({0 | 데이터베이스_이름} [, 테이블_이름 [, 인덱스_id]])
[WITH COUNT_ROWS]

WITH COUNT_ROWS 옵션은 sysindexesrows 열이 테이블에 있는 행 수의 현재 카운트로 업데이트되도록 지정합니다. 이것은 0이나 1의 인덱스_id를 갖는 sysindexes에 적용됩니다. 이 옵션은 큰 테이블에 대한 성능에 영향을 줄 수 있습니다.

참고 저장 프로시저 sp_spaceused는 @updateusage 한정자와 함께 사용되어 DBCC UPDATEUSAGE와 같은 기능을 제공할 수 있습니다. sp_spaceused 저장 프로시저는 실행에 더 오랜 시간이 걸립니다. 큰 테이블에 이 옵션을 사용하는 것은 테이블의 모든 행을 계산해야 하기 때문에 오랜 시간이 걸릴 수 있습니다.

DBCC SHOW_STATISTICS

이 명령은 지정한 테이블에 대한 인덱스의 분산 페이지에 모든 통계 정보를 표시합니다. 반환된 결과는 인덱스의 선택도를 나타내며(반환된 조밀도가 낮을수록 선택도는 높음) 최적화 프로그램에서 인덱스가 유용한지 여부를 결정하는 기준을 제공합니다. 반환된 결과는 인덱스의 분산 단계에 기준합니다.

구문

DBCC SHOW_STATISTICS (테이블_이름, 인덱스_이름)

STATS_DATE 함수

이 함수는 지정한 인덱스에 대한 통계가 최종적으로 업데이트된 날짜를 반환합니다.

구문

STATS_DATE (테이블_id, 인덱스_id)

위의 모든 정보는 엔터프라이즈 관리자에서 Manage Indexes 대화 상자를 통해 이용할 수 있습니다. (Manage 메뉴에서 Indexes를 누릅니다.)

추적 플래그

Dat37d

추적 플래그

SQL Server 추적 플래그는 SQL Server 작업에 대한 추가 정보를 제공하거나 대개 하위 호환성에 대한 것인 특정 작동을 변경합니다. 일반적으로 추적 플래그는 영구적인 해결 방법이 나타나기 전에 문제를 임시적으로 해결하는 방법으로만 사용해야 합니다. 추적 플래그가 제공하는 정보가 문제 진단을 도와줄 수는 있지만 추적 플래그가 지원되는 기능 집합의 일부가 아니라는 사실에 유념하십시오. 이것은 장래의 호환성이나 지속적인 사용이 보장되지 않는다는 것을 의미합니다. 또한 Microsoft를 포함한 기본 지원 공급자는 대개 자세한 정보가 없으며 추적 플래그나 그 출력에 관련된 질문에 응답할 수 없습니다. 즉, 이 절에서 제공하는 정보를 사용하는 것은 사용자에게 책임이 있습니다.

최적화 프로그램 추적 플래그

추적 플래그
정보
302
통계 페이지의 사용 여부, 실제 선택도(사용 가능한 경우) 및 인덱스에 대해 SQL Server가 추정한 실제 및 논리 입출력에 대한 정보를 제공합니다. 실제 조인 순서를 보기 위해서는 추적 플래그 302와 추적 플래그 310을 함께 사용해야 합니다.
310
조인 순서에 대한 정보를 제공합니다. SET 문에서 설명한 것처럼 SET SHOWPLAN ON을 사용하여 더 읽기 쉬운 형식으로 인덱스 선택 정보를 사용할 수도 있습니다.
325
클러스터되지 않은 인덱스 사용이나 ORDER BY 절을 처리하는 정렬 비용에 대한 정보를 제공합니다.
326
정렬의 추정 및 실제 비용에 대한 정보를 제공합니다.
330
SET SHOWPLAN 옵션을 사용할 때 조인에 대한 자세한 정보를 제공하는 완전한 출력을 사용합니다.
3604
클라이언트로 추적 결과를 보냅니다. 이 추적 플래그는 DBCC TRACEON 및 DBCC TRACEOFF와 함께 추적 플래그를 설정했을 때만 사용할 수 있습니다.
3605
오류 로그로 추적 결과를 보냅니다. SQL Server를 명령 프롬프트에서 시작했다면 출력이 화면에도 표시됩니다.

대체 시작 옵션

SQL Server를 설치할 때 setup 프로그램은 다음과 같은 키 아래에 있는 Windows NT 레지스트리에 기본 시작 옵션 집합을 기록합니다.

HKEY_LOCAL_MACHINE
\SOFTWARE
\Microsoft
\MSSQLServer
\MSSQLServer

예를 들어, 단일 사용자 모드로 SQL Server를 시작하거나 특정 추적 플래그 집합으로 시작하기 위해 레지스트리에 시작 옵션의 대체 집합을 만들고 저장하려면 MSSQLServer 아래에서 MSSQLServer 키를 새로운 키로 복사한 다음 목적에 맞는 새 키로 옵션을 편집합니다. 각 추적 플래그를 포함한 각 시작 옵션은 SQLArg0, SQLArg1 등의 순서로 MSSQLServer 키의 Parameters 항목에서 별도의 매개 변수로 저장됩니다. 매개 변수의 순서는 중요하지 않습니다.

레지스트리 편집은 대개 좋은 방법은 아니며 부적당하거나 잘못된 변경은 시스템에 심각한 구성 문서를 일으킬 수 있습니다.

SingleUser라는 새 키를 만든 다음 이 항목을 편집하여,

HKEY_LOCAL_MACHINE
\SOFTWARE
\Microsoft
\MSSQLServer
\SingleUser
\Parameters

추가적인 -m 시작 옵션을 넣을 수 있습니다. SingleUser 키에 대한 전체 Parameters 항목은 다음과 같아 보일 것입니다.

HKEY_LOCAL_MACHINE
\Software
\Microsoft
\MSSQLServer
\SingleUser
\Parameters
SQLArg0 : REG_SZ : -dC:\SQL\DAT\MASTER.DAT
SQLArg1 : REG_SZ : -eC:\SQL\LOG\ERRORLOG
SQLArg2 : REG_SZ : -m

이 대체 키를 사용하여 SQL Server를 시작하려면 다음 예제와 같이 -s 시작 옵션을 사용하여 명령 프롬프트에서 SQL Server를 시작합니다.

sqlservr -c -sSingleUser

최적화 프로그램 추적 플래그 사용

Dat38d

최적화 프로그램 추적 플래그는 대개 Microsoft 엔지니어를 위한 많은 정보를 제공합니다. 다음과 같이 조사해 볼 수 있는 특정 항목이 있습니다.

  • 모든 검색 인수(SARG)가 올바른 연산자와 관련되어 있습니까?
  • 모든 인덱스를 고려합니까?
  • 통계 페이지를 사용할 수 있습니까?
  • 행 추정이 실제 값과 유사합니까?
  • 페이지 추정이 합리적입니까?
  • 모든 조인 순서를 고려합니까?
  • 각각의 서로 다른 조인 순서로 적절한 인덱스를 검사했습니까?

예제

다음은 Transact-SQL 코드의 일부와 그 출력입니다. 위 질문에 대해 답하는 출력은 굵은 글꼴로 표시됩니다.

DBCC TRACEON(3604, 302)
SET SHOWPLAN ON
SET NOEXEC ON
GO
SELECT * FROM charge
WHERE charge_no > 99950

DBCC execution completed.DBCC에서 오류 메시지를 표시하면 시스템 관리자에게 문의하십시오.

*******************************
Leaving q_init_sclause() for table 'charge' (varno 0).
The table has 100000 rows and 3408 pages.
Cheapest index is index 0, costing 3408 pages per scan.

*******************************
Entering q_score_index() for table 'charge' (varno 0).
The table has 100000 rows and 3408 pages.
Scoring the search clause:
AND (!:0xb8e492) (andstat:0xa)
GT (L:0xb8e47e) (rsltype:0x38 rsllen:4 rslprec:10 rslscale:0
opstat:0x0)
VAR (L:0xb8e4d0) (varname:charge_no varno:0 colid:1
coltype(0x38):INT4 colen:4 coloff:2 colprec:10 colscale:0
vartypeid:101 varusecnt:2 varstat:0x4001 varlevel:0 varsubq:0)
INT4 (R:0xb8e464) (left:0xb8e46c len:4 maxlen:4 prec:5 scale:0
value:99950)

Scoring clause for index 6
Relop bits are: 0x4000,0x80,0x10,0x1
Qualifying stat page; pgno: 10616 steps: 332
Search value: INT4 value:99950
No steps for search value--qualpage for LT search value finds
value between steps 330 and 331--use betweenSC
Estimate: indid 6, selectivity 4.513098e-003, rows 451 pages 457 Cheapest index is index 6, costing 457 pages and generating 451 rows
per scan.
Search argument selectivity is 0.004513.
*******************************
STEP 1
The type of query is SELECT
FROM TABLE
charge
Nested iteration
Index : charge_charge_amt

최적화 프로그램 무시

Dat39d

FORCEPLAN

Dat40d

FORCEPLAN은 SET 문의 옵션이며 ON 또는 OFF일 수 있습니다. FORCEPLAN을 ON으로 설정하면 OFF로 설정할 때까지 세션에서 유효한 상태를 유지합니다.

FORCEPLAN이 ON이면 FROM 절에 나열된 테이블의 순서가 테이블이 실제로 조인될 순서를 제어합니다. 최적화 프로그램은 조인 순서에 대한 결정을 하지 않습니다.

FORCEPLAN 사용

Dat41d

예제

이 예제에서 최적화 프로그램이 최선의 순서로 선택한 것과 관계 없이 쿼리는 먼저 corporation 테이블을 액세스한 다음 member 테이블을 액세스하여 처리됩니다.

SET FORCEPLAN ON
GO
SELECT *
FROM corporation, member
WHERE member.corp_no = corporation.corp_no
AND member_no < 100
GO

인덱스 강제

Dat42d

최적화 프로그램 인덱싱 참고

SQL Server는 SELECT 문 내에서 최적화 프로그램에게 제공할 수 있는 많은 참고를 제공합니다. 이들 참고의 대부분은 잠금 작동을 적용하기 때문에 이후의 모듈에서 설명합니다. 인덱싱과 관련된 한 가지 참고는 INDEX 참고입니다. 다음과 같이 SELECT 문에서 테이블 이름 다음에 인덱스 ID나 인덱스 이름을 제공해야 합니다.

부분적인 구문

SELECT select_list
FROM table_name [(INDEX = {인덱스_이름 | 인덱스_id})]

참고는 테이블에 사용할 인덱스 이름이나 ID를 지정합니다. index_id가 0이면 테이블 스캔이 강제되며 1이면 클러스터된 인덱스가 있는 경우 그것을 사용하도록 강제됩니다.

예제

이 예제에서 최적화 프로그램이 최선으로 선택한 인덱스와 관계 없이 쿼리는 corp_no에 대한 인덱스를 사용하여 처리될 것입니다.

SELECT *
FROM member (INDEX = member_corporation_link)
WHERE member_no < 100
AND corp_no BETWEEN 200 AND 300

FASTFIRSTROW

이 옵션을 사용하면 최적화 프로그램에서 ORDER BY 절과 일치하고 WHERE 절이 없을 경우에 클러스터되지 않은 인덱스를 사용하게 됩니다. 첫 번째 행이 더 빨리 반환되고 정렬을 위한 작업 테이블을 tempdb에 만들지 않습니다. 미리 읽기는 사용하지 않으며 입출력의 전체 양과 쿼리 완료에 필요한 시간은 더 증가할 수 있습니다. 쿼리에 ORDER BY 절과 함께 WHERE 절이 포함되어 있다면 SQL Server는 ORDER BY 절을 해결하는 인덱스 대신 WHERE 절을 해결하는 인덱스를 사용할 것입니다. 이러한 결정은 WHERE 절의 선택도에 기준하지만 FASTFIRSTROW의 존재 여부에도 영향을 받습니다.

추가 고려 사항

Dat43d

성능 향상 시기

성능이 향상되었는지 확인해야 합니다. 최적화 프로그램을 무시하는 것이 좋은 영향을 주는지 확인하려면 STATISTICS IO 및 STATISTICS TIME을 켭니다. 대개 최적화 프로그램은 실제로 최선을 알고 있으며 최적화 프로그램을 무시하는 것으로 성능이 더 향상되지는 않습니다.

최후의 수단

최적화 프로그램이 작동하길 바라는 다른 방식을 시도해봅니다. 최근에 통계를 업데이트하셨습니까? 최근에 저장 프로시저를 다시 컴파일하셨습니까? 쿼리나 검색 인수를 다시 작성할 수 있습니까? 조금 다른 인덱스를 작성할 수 있습니까?

참고에 대한 이유 문서화

최적화 프로그램을 무시한 이유를 기록으로 남겨야 합니다. 원래 코드를 작성한 이후에 오래 시간이 지나 그러한 이유들이 변경되어도 참고가 더 이상 필요 없다는 것을 알지 못할 수 있습니다.

모든 업그레이드 테스트

SQL Server 최적화 프로그램은 지속적으로 개선되고 있습니다. 새 버전을 설치한 후에는 최적화 프로그램을 무시할 필요가 없을 수도 있습니다. 사용자의 제안이 실제로 최적화 프로그램의 고유한 선택보다 못할 수 있습니다.

SQL Server 최적화 프로그램은 동적이며 데이터 변경에 따른 새로운 최선의 계획을 찾을 수 있습니다. 최적화 프로그램을 강제했다면 그러한 결정이 동적이지 않게 됩니다. 따라서 데이터가 변경되어도 계획은 동일하게 유지될 것입니다. 이러한 이유 때문에 SQL Server가 업그레이드되지 않은 경우에도 최적화 프로그램을 무시하도록 선택한 모든 쿼리를 정기적으로 다시 시험해야 합니다.

© 1997 Microsoft Corporation. All rights reserved.

이 문서에 포함된 정보는 문서를 발행할 때 논의된 문제들에 대한 Microsoft Corporation의 당시 관점을 나타냅니다. Microsoft는 변화하는 시장 환경에 대처해야 하므로 이를 Microsoft 측의 책임으로 해석해서는 안 되며 발행일 이후 소개된 어떠한 정보에 대해서도 Microsoft는 그 정확성을 보장하지 않습니다.

이 설명서는 오직 정보를 제공하기 위한 것입니다. Microsoft는 이 설명서에서 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.

Microsoft 및 Windows NT는 Microsoft Corporation의 등록 상표입니다.

여기에 인용된 다른 회사와 제품 이름은 해당 소유자의 상표일 수 있습니다.


 

최종 수정일 : 2000.5.12

728x90

Reference URL :

http://www.microsoft.com/korea/TechNet/sql/Technote/dat412ef.asp?bPrint=True

 

개발자를 위한 MS SQL Server 성능 조정 및 최적화, 제 3부: 성능 향상을 위한 SQL Server 구성

DAT 412
Tech-Ed 97에 소개됨

Adam Shapiro
Program Manager
Microsoft Corporation

개요

Dat1e

SQL Server 구성 정보

Dat2e

Microsoft® SQL Server는 SQL Server를 구성하기 위한 많은 옵션을 제공하며 SQL Server의 동작에 영향을 미칩니다. 3부에서는 이와 관련된 중요한 옵션에 대해 설명합니다.

조직의 하드웨어 환경에 맞게 조정해야 하는 몇 가지 옵션을 제외하고 대부분의 옵션은 전혀 조정할 필요가 없습니다.

시스템 구성 정보는 sysconfigures, syscurconfigs, 구성 블록 및 Windows NT 레지스트리에 저장됩니다.

sysconfigures

이 시스템 테이블에는 사용자가 설정할 수 있는 각 구성 옵션에 대한 행이 있습니다. 이 테이블에는 가장 최근에 SQL Server를 시작하기 전에 정의한 구성 옵션 그리고 가장 최근에 SQL Server를 시작한 이후 설정한 동적 구성 옵션이 있습니다.

syscurconfigs

이 시스템 테이블에도 sysconfigures와 마찬가지로 각 구성 옵션에 대한 항목이 있지만 현재 값이 포함된다는 것이 다릅니다. 또한, 이 테이블에는 구성 구조를 기술하는 4개의 항목이 있습니다.

이 테이블은 sysobjects에 테이블로 표시되지만 실제로는 사용자가 쿼리할 때만 만들어지는 의사 테이블입니다. syscurconfigs에 대해 sysindexes 행이 보이면 데이터 행이 전혀 없다는 뜻입니다.

SQL 엔터프라이즈 관리자를 사용하거나 sp_configure 시스템 저장 프로시저를 실행하여 구성 값을 변경할 수 있습니다. sp_configure를 실행하여 구성 옵션을 변경하는 경우 뒤이어 RECONFIGURE 문을 사용해야 합니다. SQL 엔터프라이즈 관리자가 자동으로 RECONFIGURE 문을 실행합니다.

구성 블록

RECONFIGURE 문은 변경된 구성 옵션을 설치합니다. 이는 syscurconfigs 테이블의 내용이 마스터 장치의 처음 네 페이지에 쓰인다는 뜻입니다. 이들 페이지를 구성 블록이라고 합니다. 다음 번에 SQL Server를 시작할 때 마스터 장치에서 sysconfigures 테이블로 값을 읽어들일 수 있습니다.

Windows NT 레지스트리

SQL Server를 시작하면 SQL Server가 마스터 장치에서 구성 블록을 읽습니다. 마스터 장치는 Microsoft Windows NT® 레지스트리에서 찾을 수 있습니다.

SQL Server 메모리 및 I/O 관리

Dat3e

조정할 수 있는 가장 중요한 한 가지 구성이 SQL Server에 할당된 메모리 양일 것입니다.

SQL Server 메모리 사용

Dat4e

전역 리소스

전역 리소스는 모든 프로세스와 데이터베이스가 사용하는 리소스입니다. 전역 리소스 영역은 대부분 서버에 정의된 각 데이터베이스를 제어하는 구조 등의 다른 구조, 페이지와 확장 영역 그리고 프로시저에 대한 해시 테이블, 서버 차원의 문자 집합 및 정렬 순서에 대한 정보 등을 가리키는 포인터입니다. 이 영역에는 SQL Server에 대한 실행 가능 코드도 포함됩니다.

사용자 연결

각 사용자 연결은 서버 구조에 대략 27K 그리고 ODS 구조에 3K 등 총 30K의 SQL Server 메모리를 필요로 합니다. 이 메모리는 PSS(프로세스 상태 구조), 트랜잭션 설명자, 세션 설명자, 보호 캐시, 로그인 레코드, 파서 작업 영역에 사용되며 이들 모두 초기화 시에 SQL Server가 만드는 힙에서 할당됩니다.

또한, 사용자 연결에 1MB의 글로벌 스택이 예약되지만 이 메모리는 즉시 커밋되지 않습니다. SQL Server를 실행하는 동안 더 많은 스택 공간이 필요하면 최고 1MB까지 추가 메모리가 커밋됩니다. 신규 스레드(실제로 사용되고 있는 사용자 연결)마다 스택 공간의 20K 정도를 필요로 합니다.

따라서 각 사용자 연결은 max worker threads 한계까지 총 50K를 필요로 합니다. 그 후에는 연결마다 30K가 필요합니다.

잠금, 열린 데이터베이스, 열린 개체

잠금, 열린 데이터베이스, 열린 개체에는 각각의 구성 값을 기반으로 메모리가 할당됩니다. 아래 값을 사용하여 이들 옵션의 총 메모리 소모량을 측정할 수 있습니다.

잠금
60바이트
열린 데이터베이스
162바이트
열린 개체
240바이트

시스템의 실제 메모리 사용 상태에 대한 추가 정보를 보려면 DBCC MEMUSAGE를 실행하기 전에 추적 플래그 3635를 활성화하십시오.

프로시저 및 데이터 캐시

프로시저와 데이터 캐시에 대해서는 이 문서의 뒷부분에서 자세히 설명합니다.

메모리 관련 구성 옵션

Memory

이 구성 옵션은 사용 가능한 메모리의 크기를 2K 단위로 설정합니다. 초기 값은 컴퓨터의 메모리 양을 기반으로 설치 프로그램이 결정합니다.

시스템에 맞게 이 값을 최적화하려면 전체 실제 메모리에서 Windows NT에 필요한 메모리 그리고 SQL Server 전용 컴퓨터가 아닌 경우 다른 시스템이 사용하는 메모리를 뺍니다.

이상적으로는 시스템의 페이징 동작을 유발하지 않고 SQL Server에 최대한 많은 메모리를 할당하는 것이 좋습니다. Windows NT 성능 모니터를 사용하면 시스템에 대한 임계값을 결정하는 데 도움이 됩니다. 메모리 개체의 Page Faults/sec 카운터는 페이지 부재가 발생하는지 여부를 나타냅니다. 페이지 부재가 발생한다면 SQL Server가 지나치게 많은 메모리를 사용하여 실행되고 있는 것입니다. 임계값은 시스템에 따라 달라집니다.

아래 표는 SQL Server 메모리 할당 시의 적절한 시작 값을 제시한 것입니다. 이 값들은 SQL Server 전용 시스템에 사용한다는 가정 하에 제안하는 수치입니다.


RAM(MB)
SQL Server 메모리 할당(MB 단위)
SQL Server 메모리 할당(2K 단위)
16
4
2,048
24
8
4,096
32
16
8,192
64
40
20,480
128
100
51,210
256
216
110,592
512
464
237,568

이 값은 시스템에 메모리를 추가하거나 제거하는 경우 또는 시스템 용도를 바꾸는 경우에만 변경해야 합니다.

메모리 옵션을 다시 구성하면 free buffers 구성 옵션도 자동으로 변경됩니다. free buffers 구성 값은 신규 메모리 크기의 5%로 설정됩니다. 이 값의 의미에 대해서는 뒤에서 설명합니다.

memory 옵션의 최대값은 2GB입니다. 그러나 tempdb in RAM 옵션을 사용하여 RAM에 tempdb를 배치한 경우, memory 옵션에 tempdb에 대한 메모리 요구가 포함되지 않습니다.

Open Databases

이 구성 옵션은 SQL Server에서 한 번에 열 수 있는 최대 데이터베이스 수를 설정합니다. 기본값은 20입니다. 열린 데이터베이스는 메모리를 사용하기 때문에 이 값을 늘리면 SQL Server 전용 메모리의 양도 늘려야 할 수 있습니다.

Open Objects

이 구성 옵션은 SQL Server에서 한 번에 열 수 있는 최대 데이터베이스 개체 수를 설정합니다. 기본값은 50입니다.

SQL Server가 열린 개체 수를 초과했다는 메시지를 표시하면 이 값을 늘려야 합니다. 열린 개체는 메모리를 사용하기 때문에 이 값을 늘리면 SQL Server 전용 메모리의 양도 늘려야 할 수 있습니다.

User Connections

이 구성 옵션은 SQL Server에 동시에 연결할 수 있는 최대 연결 수를 설정합니다. 데이터베이스 환경에 따라, 실제로 연결할 수 있는 개수는 이 값보다 적을 수도 있습니다.

허용되는 사용자 연결 수는 버전에 따라 달라집니다. SQL Workstation에서는 15이고 SQL Server에서는 32,767입니다. 그러나 실제 수는 응용 프로그램 및 하드웨어에 따라 달라지는 실제 한계를 기반으로 정해집니다.

아래 문을 사용하면 시스템에서 사용할 수 있는 최대 사용자 연결 수에 대한 보고서를 받을 수 있습니다.

SELECT @@max_connections

각 사용자에게 허용할 연결 수를 결정하기 위한 공식은 없습니다. 연결 수는 시스템 및 사용자 요구 사항에 따라 설정해야 합니다. DB-Library 또는 ODBC 응용 프로그램을 실행하는 사용자들이 한 응용 프로그램에서 여러 연결을 열 수도 있습니다. 많은 사용자가 있는 시스템에서는 사용자들이 가끔씩만 필요한 연결을 공유할 가능성이 높습니다.

Locks

이 구성 옵션은 사용 가능한 잠금 수를 설정합니다. 잠금은 열린 데이터베이스 및 데이터베이스 개체의 공유 방식으로 공유되지 않습니다. 기본값은 5,000입니다.

SQL Server가 사용 가능한 잠금 수를 초과했다는 메시지를 표시하면 이 값을 늘려야 합니다. 잠금마다 32바이트의 메모리가 사용되기 때문에 이 값을 늘리면 SQL Server 전용 메모리의 양도 늘려야 할 수 있습니다.

Procedure Cache

이 구성 옵션은 SQL Server의 메모리 요구 사항이 충족된 후 프로시저 캐시에 할당되는 메모리 백분율을 지정합니다. SQL Server에 필요한 메모리는 잠금, 열린 데이터베이스, 열린 개체, 사용자 연결, 코드 자체 및 전역 리소스에 필요한 메모리를 합한 양입니다. 나머지 메모리는 이 구성 옵션으로 설정한 백분율에 따라 프로시저 캐시와 데이터 캐시 간에 분할됩니다.

프로시저 캐시는 가장 최근에 사용된 프로시저가 저장된 메모리 영역을 말합니다. 프로시저 캐시는 프로시저를 만들 때 그리고 쿼리를 컴파일할 때도 사용됩니다. 프로시저 캐시 구성 옵션의 기본값은 30입니다. 이 기본값은 SQL Server 요구 사항이 충족된 후 나머지 메모리의 30%를 프로시저 캐시에 할당합니다. 그리고 나머지 70%는 데이터 캐시가 사용합니다.

이 구성 옵션의 최적 값은 응용 프로그램마다 다르므로 이 값을 다시 설정하면 SQL Server의 성능을 향상시킬 수 있습니다. 예를 들어, 서로 다른 많은 프로시저 또는 임의 쿼리를 실행하는 경우, 응용 프로그램이 프로시저 캐시를 더 많이 사용할 것이므로 사용자가 이 값을 늘리고자 할 수 있습니다. 개발 과정에 있는 많은 응용 프로그램이 이 범주에 속합니다.

데이터 캐시 적중률을 높이기 위해 메모리를 추가하는 경우 프로시저 캐시의 크기가 비교적 일정하게 유지되도록 프로시저 캐시의 백분율이 낮아질 수 있습니다.

DBCC MEMUSAGE

Dat6e

DBCC MEMUSAGE

DBCC 문의 MEMUSAGE 옵션은 메모리 사용에 관한 자세한 보고서를 제공합니다. 이 옵션은 아래와 같은 세 종류의 정보를 제공합니다.

  • 시작할 때 서버 메모리가 할당된 방식
  • 버퍼 캐시의 가장 큰 개체 20개가 사용하는 메모리 양
  • 저장 프로시저, 트리거, 뷰, 규칙, 기본값 같은 저장 프로시저의 가장 큰 개체 20개가 사용하는 메모리 양

프로시저 캐시에 개체의 복사본이 여러 개 있으면 DBCC MEMUSAGE는 이들이 사용하는 메모리를 모두 합하여 총 메모리를 산출합니다. 이들 복사본 중 일부는 미리 컴파일된 개체 버전(트리)일 것이고 일부는 컴파일된 버전(계획)일 것입니다. DBCC MEMUSAGE는 트리와 계획의 크기를 비롯하여 캐시에 포함된 이들의 총 개수를 표시합니다.

tempdb in RAM

Dat7e

tempdb 데이터베이스는 일부 조인 작업에서 임시 테이블을 만들고 정렬하기 위한 작업 공간으로 사용됩니다. 또한 프로그래머들이 명시적 임시 테이블이나 임시 저장 프로시저를 만들 때도 이 테이터베이스가 사용됩니다.

tempdb in RAM 구성 옵션은 tempdb가 완전히 메모리 상주 데이터베이스가 될 수 있도록 합니다. 이를 통해 일부 특정한 상황에서 성능 이점을 얻을 수 있습니다. 그러나 tempdb in RAM을 잘못 사용하면 SQL Server 데이터 캐시에 사용되어야 할 메모리가 이 구성 옵션에 사용되어 성능이 떨어질 수 있습니다.

대부분의 경우, 사용 가능한 RAM은 tempdb의 위치가 아닌 데이터 캐시에 사용되는 것이 가장 좋습니다. tempdb의 데이터는 SQL Server 데이터 캐시의 LRU(최근에 사용되지 않은 것부터 사용) 알고리즘을 사용하여 캐시에 저장됩니다.

tempdb in RAM을 사용하면 tempdb 동작 속도가 빨라질 수 있지만 SQL Server 데이터 캐시에 사용할 수 있는 메모리가 적어지기 때문에 캐시 적중률이 낮아질 수 있습니다. tempdb in RAM에 사용되는 메모리는 memory 옵션으로 설정한 풀 집합과는 별도로 할당되므로 그에 맞게 서버를 구성해야 합니다.

예를 들어, tempdb in RAM에 100MB를 사용하는 경우 여기에 필요한 메모리를 확보하기 위해 memory 설정으로 할당한 메모리를 100MB 줄여야 할 것입니다. 이와는 반대로, tempdb in RAM에 메모리를 할당하지 않고 사용 가능한 모든 메모리를 SQL Server에 할당하면 캐시 적중률을 높일 수 있습니다. SQL Server는 tempdb와 관련된 동작을 포함하여 모든 디스크 I/O 동작을 캐시에 저장합니다.

여러 시스템에서 사용할 수 있는 RAM이 제한된 경우 tempdb가 RAM에 있으면 tempdb에 허용되는 크기가 제한됩니다. tempdb에 대해 예기치 않은 확장 요구 사항이 생기면 이것이 문제가 될 수 있습니다. 이런 우려가 있는 경우 RAM에 tempdb를 두지 마십시오.

일반적으로, 사용 가능한 RAM을 SQL Server 데이터 캐시에 사용하는 것이 tempdb in RAM에 대량의 메모리를 사용하는 것보다 낫습니다. 그러나 아래의 모든 조건이 성립되는 경우에는 tempdb in RAM을 사용하는 것이 효과적입니다.

  • 사용 가능한 시스템 RAM이 아주 많은 경우. 이는 일반적으로 64MB 이상을 뜻하며 128MB 이상이 더 일반적입니다.
  • 사용 가능한 데이터 캐시가 많이 있는데도 응용 프로그램이 SQL Server 캐시 적중률이 낮은 참조 위치를 가진 경우
  • 응용 프로그램이 많은 tempdb 작업을 수행하는 경우. 성능 모니터를 사용하면 tempdb의 크기를 관찰할 수 있습니다. SQL Server 개체에 대해서는 Max TempDB Space Used(MB) 카운터를 모니터할 수 있습니다. 이 카운터는 SQL 성능 모니터 세션 동안 tempdb 데이터베이스에 사용된 최대 메모리 양(MB)을 보고합니다.
  • RAM 구성에 의해 설정된 tempdb 크기에 맞도록 tempdb 작업의 크기가 조정되는 경우

RAM에 tempdb를 배치하기로 결정한 경우 이를 통해 얻을 수 있는 성능 이점을 객관적으로 검토하는 것이 좋습니다. 이를 위해 아래 작업을 수행합니다.

  1. 가장 자주 수행되는 tempdb 집중형 작업을 대표하는 단일 쿼리 또는 작은 쿼리 집합을 선택합니다.
  2. 이들 쿼리를 여러 번 실행하면서 실행 시간을 확인합니다.
  3. RAM의 tempdb를 다시 구성한 다음 같은 쿼리를 실행하여 그 차이를 확인합니다.

성능이 별로 향상되지 않은 경우 RAM을 SQL Server 데이터 캐시에 반환하는 것이 좋습니다.

RAM에 tempdb를 배치하는 것은 위험하지 않으며 데이터베이스 무결성이나 복구 가능성에 나쁜 영향을 미치지 않습니다. 이는 tempdb가 중간 작업에만 사용되고 각 서버를 다시 시작할 때 완전히 재구성되기 때문입니다.

tempdb in RAM 옵션은 분석을 통해 그 유용성이 확인된 경우에 사용할 수 있는 중요한 성능 향상 도구입니다. 이 옵션을 사용하여 성능을 많이 향상시킬 수도 있지만 무분별하게 사용해서는 안 됩니다.

tempdb in RAM 변경

RAM의 tempdb를 포함하여 tempdb 데이터베이스를 확장할 수 있습니다. 그러나 서버를 종료했다 다시 시작하지 않고 RAM에 배치된 tempdb를 변경할 수 있는 횟수는 10회뿐입니다. RAM에 있는 tempdb를 변경하면 데이터베이스가 변경될 때마다 새로운 인접 메모리 "청크"가 tempdb에 할당됩니다. 인접해 있기는 하지만 이 메모리가 반드시 RAM에 있는 tempdb의 기존 부분 옆에 배치되는 것은 아닙니다. 최적의 성능을 얻으려면 tempdb를 변경한 후 서버를 종료하고 다시 시작해야 합니다.

RAM에서 tempdb 제거

구성 값을 다시 0으로 설정하여 RAM에서 tempdb를 제거할 수 있습니다. 이렇게 하면 기본 크기 2MB를 가진 tempdb가 기본 장치에 생성됩니다.

참고 업그레이드할 때 tempdb가 RAM에 있으면 곧 RAM에서 tempdb가 제거됩니다. tempdb를 만들려면 기본 디스크 장치에 최소한 2MB의 사용 가능한 메모리가 있어야 합니다. 그렇지 않으면 SQL Server가 시작되지 않습니다. 임시로 RAM에 2MB의 tempdb를 만들려면 명령줄에서 SQLSERVR.EXE와 함께 /f 플래그를 사용합니다.

SQL Server 데이터 캐시

Dat8e

데이터 캐시는 디스크에서 읽어들인 페이지를 보관하는 데 사용되는 버퍼 또는 페이지 프레임 집합입니다. 데이터 캐시는 SQL Server에 할당된 메모리에 포함됩니다. 또한 데이터 캐시를 페이지 캐시 또는 버퍼 캐시라고도 합니다.

조정할 수 있는 가장 중요한 한 가지 구성이 SQL Server에 할당된 메모리 양일 것입니다. 이는 데이터 캐시 양이 할당된 메모리 양에 정비례하기 때문입니다. 페이지가 데이터 캐시에 있느냐 그렇지 않느냐에 따라 페이지에 액세스할 때 물리적 읽기가 이루어는지 여부가 결정되며, 디스크를 물리적으로 읽는 것은 SQL Server가 수행할 수 있는 작업 중 비용이 가장 많이 드는 작업에 속합니다.

지금부터 이 절에 사용되는 용어 몇 가지를 소개합니다.

커밋되지 않은 데이터 페이지

데이터 수정 문에 의해 변경되었지만 아직 디스크에 쓰이지 않은 데이터 페이지를 말합니다.

사용 가능한 페이지

어떤 프로세스도 사용하지 않는 커밋된 페이지를 말합니다.

최근에 사용되지 않은 것부터 사용/최근에 사용된 것부터 사용(LRU/MRU) 체인

최근에 사용되지 않은 것부터 최근에 사용된 것의 순서로 정렬한 연결된 페이지 목록을 말합니다.

버퍼 관리자 해시

SQL Server가 데이터 캐시의 페이지를 빨리 찾거나 이들이 캐시에 없다는 것을 확인할 수 있도록 데이터 캐시의 페이지가 해시됩니다. hash buckets 구성 옵션은 메모리의 데이터 캐시 버퍼에 페이지를 해시하는 데 사용될 "버킷" 수를 설정합니다. 해시 버킷 수가 많을수록 SQL Server가 참조된 페이지를 더 빨리 찾을 수 있습니다. 해시 버킷이 사용된 페이지 목록의 참조된 페이지에 아주 가깝게 해시된 다음 정확한 페이지를 찾을 때까지 체인을 통과하기 때문입니다.

목적은 특정 해시 버킷에 대한 체인 크기를 제한하는 것입니다. 버킷이 많을수록 체인이 더 짧아집니다. 적당한 수의 해시 버킷만 사용하면 대용량 데이터 캐시도 빠르게 검색할 수 있습니다.

예제

해시 버킷의 기본값은 약 8K입니다. 각 해시 버킷이 최적의 길이(4페이지)를 가진 경우 SQL Server는 아래와 같은 데이터 캐시 크기를 지원할 수 있습니다.

4 x 8K = 32K 페이지 = 64MB

최대 해시 버킷 수(256K)와 최적의 해시 체인 길이를 사용하면 SQL Server가 아래와 같은 데이터 캐시 크기를 지원할 수 있습니다.

4 x 256K = 1024K 페이지 = 2GB

체인 길이를 모두 4페이지 이내로 구성하는 것이 가장 좋습니다. 체인이 이보다 길면 hash buckets 구성 옵션의 값을 늘립니다.

이러한 해시 버킷은 메모리를 아주 조금밖에 사용하지 않으며 SQL Server는 해시 버킷의 실제 수를 입력된 값에 가장 가까운 수로 조정합니다. 기본값은 7,993개이고 최대값은 265,003개입니다.

DBCC BUFCOUNT를 사용하여 현재의 해시 구성이 얼마나 효율적인지 검사할 수 있습니다.

DBCC TRACEON(3604)
GO
DBCC BUFCOUNT
GO
**** THE 10 LONGEST BUFFER CHAINS ****
bucket number = 20 chain size = 2
bucket number = 276 chain size = 2
bucket number = 532 chain size = 2
bucket number = 1044 chain size = 2
bucket number = 1300 chain size = 2
bucket number = 1556 chain size = 2
bucket number = 1812 chain size = 2
bucket number = 2324 chain size = 2
bucket number = 3092 chain size = 2
bucket number = 3604 chain size = 2
The Smallest Chain Size is: 0
The Average Chain Size is: 0.671668

검사점

Dat10e

검사점 시스템 프로세스

검사점 프로세스는 주로 절전 모드일 때 SQL Server에서 항상 실행되는 시스템 프로세스입니다. sp_who 프로시저를 실행하여 이를 확인할 수 있습니다. 검사점 프로세스는 1분마다 활성화되어 각 데이터베이스의 트랜잭션 로그를 검사합니다. 검사점 시스템 프로세스를 통해 마지막 검사점 이후 충분한 작업이 수행되었다는 것이 확인되면 SQL Server는 그 데이터베이스에 대해 다른 검사점을 지정합니다.

충분한 작업이 수행되었는지 여부는 recovery interval 구성 옵션 값으로 결정합니다. 이 값은 분 단위로 설정됩니다. 검사점 시스템 프로세스는 설정된 시간만큼의 복구 시간이 걸릴 정도로 충분한 트랜잭션이 로그에 있는지 확인합니다.

CHECKPOINT 문

CHECKPOINT 문은 DBO 또는 SA를 사용하여 수동으로 실행할 수 있습니다.

검사점 프로세스 동안 진행되는 작업

SQL Server는 검사점을 만들 때 커밋되지 않은 모든 데이터 페이지를 디스크에 씁니다. 검사점이 검사되는 데이터베이스의 페이지들을 빠르게 찾을 수 있도록 각 데이터베이스의 페이지들이 서로 연결됩니다.

SQL Server가 자동으로 지정하든 CHECKPOINT 문을 사용하여 수동으로 지정하든 상관없이 일단 지정된 검사점은 두 단계를 거칩니다. 1단계에서는 SQL Server가 플러시되어야 하는 모든 페이지에 표시를 합니다. 추적 플래그 3502를 실행하여 검사점 로깅이 활성화되면 SQL Server 오류 로그는 아래와 비슷한 정보를 얻습니다.

Ckpt dbid 6 started (4000) (검사점 시작)
Ckpt dbid 6 phase 1 ended (0) (1단계 종료)
Ckpt dbid 6 complete.(2단계 및 검사점 종료)

2단계에서는 검사점 스레드가 표시된 모든 페이지를 플러시합니다. 이 단계는 플러시할 페이지 수, 디스크 하위 시스템의 속도, 서버의 포화 수준 및 기타 요인에 따라 1단계보다 훨씬 오래 걸립니다. 커밋되지 않은 모든 데이터 페이지가 데이터 캐시에서 디스크로 플러시되면 검사점이 완료됩니다.

검사점 프로세스 동안 단일 페이지 쓰기 횟수(개체: SQLServer, 카운터: I/O - Single Page Writes/sec)가 늘어날 수 있습니다. 이 카운터는 일반적으로 0입니다. 검사점 프로세스 동안, 새 트랜잭션이 검사점 스레드에 의해 아직 플러시되지 않은 데이터 페이지를 요청하면 SQL Server는 요청이 들어오는 대로 이들 페이지를 플러시합니다. 이는 정상적인 동작입니다.

SA가 SHUTDOWN 문을 실행할 때 각 데이터베이스에 대해 검사점이 지정됩니다. SQL Server가 시작될 때 그리고 각 데이터베이스가 복구된 후에도 검사점이 지정됩니다.

참고 trun. Log on chkpt. 데이터베이스 옵션을 설정하면 시스템 검사점 프로세스가 활성화될 때마다 로그가 잘립니다.

지연 기록기 프로세스

Dat11e

SQL Server는 지연 기록기라는 시스템 프로세스를 지원하며 sp_who를 실행하면 이를 볼 수 있습니다. 이 프로세스는 사용 가능한 버퍼 수가 free buffers 구성 옵션으로 설정한 임계값보다 적을 때 버퍼 플러시를 자동으로 시작합니다.

지연 기록기 프로세스가 있기 때문에 사용 가능한 버퍼를 만들기 위해 검사점을 자주 지정하지 않아도 됩니다. 지연 기록기가 사용하는 일괄 I/O 크기를 max lazywrite IO 구성 옵션을 사용하여 설정할 수 있습니다.

커밋되지 않은 데이터 페이지 플러시

Dat12e

SQL Server는 아래와 같은 상황일 때 캐시에서 디스크로 페이지를 플러시합니다.

  • 검사점이 지정되었을 때
  • 캐시로 새 페이지를 가져와야 할 때

    현재 캐시에 없는 페이지가 필요하지만 사용 가능한 버퍼 목록에 버퍼가 없다는 것이 확인되면 SQL Server는 캐시 페이지 체인에서 사용 가능한 버퍼를 찾습니다. 체인 검색이 끝나면 가장 오래된 버퍼의 페이지가 디스크로 플러시됩니다.

    사용 가능한 미사용 버퍼가 없고 사용 가능한 버퍼 목록에도 버퍼가 없는 경우, 페이지를 사용할 수 있을 때까지 페이지 요청 프로세스가 일시적으로 중단됩니다.

  • SELECT INTO가 끝나거나 bcp의 경우 각 배치가 끝날 때

    빠른 bcp(로그되지 않는 버전)를 사용할 때 또는 SELECT INTO를 사용하여 테이블을 만들 때 새로 삽입된 행은 로그에 기록되지 않습니다. 또한 이들 대부분 또는 모두가 여전히 캐시에 있을 수 있습니다. SQL Server가 검사점 없이 중단되는 경우에 데이터 손실을 최대한 막기 위해, 커밋되지 않은 모든 데이터 페이지는 bcp 배치 또는 SELECT INTO가 끝날 때 디스크로 플러시됩니다.

  • 트랜잭션이 완료될 때 로그 페이지가 플러시됩니다.

    트랜잭션이 커밋되거나 중단되면 로그 페이지가 디스크로 플러시됩니다.

  • 페이지가 분할될 때

    페이지가 분할되면 새로 할당된 페이지가 즉시 디스크로 플러시됩니다.

  • LOAD DATABASE가 실행될 때

    LOAD DATABASE 문을 사용하여 데이터베이스가 복원될 때 덤프의 모든 페이지가 디스크에 직접 쓰입니다. 또한 백업의 일부가 아닌 데이터베이스의 모든 페이지도 초기화되어 디스크로 플러시됩니다. 예를 들어, 4MB 데이터베이스에서 10MB 데이터베이스로 백업을 로드하는 경우 나머지 6MB의 페이지가 모두 초기화되어 디스크에 쓰입니다.

  • 지연 기록기 프로세스가 실행될 때

    지연 기록기 프로세스는 사용 가능한 버퍼 수가 특정 임계값보다 적으면 버퍼 플러시를 자동으로 시작합니다. 플러시에 사용할 수 있는 버퍼가 없으면 지연 기록기는 오류 로그에 메시지를 씁니다.

비동기 I/O

Dat13e

특정 디스크 하위 시스템에서의 성능 수준

지금 소개하는 세 종류의 디스크 하위 시스템을 통해 디스크 하위 시스템 종류마다 비동기 I/O의 성능 효과가 얼마나 달라지는지 확인할 수 있습니다. 맨 먼저 4개의 디스크 드라이브에 장착된 비인텔리전트 컨트롤러를 소개합니다. 그 다음은 각각 단일 디스크 드라이브에 장착된 4개의 비인텔리전트 컨트롤러입니다. 마지막으로 4개의 디스크 드라이브에 장착된 단일 인텔리전트 컨트롤러를 소개합니다.

4개의 드라이브에 장착된 단일 컨트롤러

먼저, 단일 컨트롤러와 4개의 드라이브를 사용할 때 데이터 전송이 어떻게 이루어지는지 살펴보겠습니다. 아웃바운드 전송 시퀀스에서, 장치 드라이버는 컨트롤러의 내장 버퍼로 데이터 버퍼를 보냅니다. 이 동작은 일반적으로 직접 메모리 액세스(DMA), 공유 메모리 또는 프로그램된 I/O를 사용하여 아주 빠르게(일반적인 버스 속도에서 몇 백 밀리초 이내) 이루어집니다. 그런 다음 컨트롤러는 장치 드라이버로부터 여러 가지 지원을 받아 드라이브에서 필요한 찾기 동작을 수행해야 합니다. 이 동작에는 최대 50밀리초가 걸릴 수 있으며 이는 버스와 컨트롤러 간의 전송보다 수백 배나 긴 시간입니다.

이제 드라이브 종류에 따라 결정되는 전송 속도를 사용하여 컨트롤러 버퍼에서 디스크 드라이브로 실제 데이터가 전송됩니다. 전송이 시작되기 전에 회전 대기 시간도 있을 수 있습니다. 상당수의 시스템에서, 이 대기 시간 동안 장치 드라이버 및 장치 드라이버를 호출한 작업은 하드 디스크 드라이브가 완료되기만 기다려야 합니다. 첫째 드라이브가 완료될 때까지는 둘째 드라이브와 그 다음 드라이브에서 작업을 수행할 수 없습니다. 이는 대기 중인 여러 작업을 추적하는 데 필요한 논리를 컨트롤러가 가지고 있지 않기 때문입니다.

개별 드라이브에 장착된 4개의 컨트롤러

각각 자체의 드라이브에 장착된 4개의 컨트롤러를 사용하는 경우, Windows NT 스트라이프를 사용하면 둘째 또는 그 다음의 컨트롤러나 드라이브에서 전송 시퀀스가 즉시 시작될 수 있습니다. 이 경우 4개의 드라이브가 각각 자체의 컨트롤러를 사용하여 전송을 추적하기 때문에 이 드라이브들의 전송 단계가 서로 다를 수 있습니다.

이 하드웨어 구성에 Windows NT 비동기 I/O를 사용하면 도움이 될 수 있습니다. 처리되지 않은 I/O 풀을 만들 수 있고 드라이브 하위 시스템이 이 풀을 한 번에 4개씩 병렬로 처리할 수 있기 때문입니다. 드라이브 하위 시스템의 요청 처리 속도가 다를 수 있기 때문에, 하위 시스템의 용량이 최대한 사용되도록 처리되지 않은 SQL Server 요청 풀을 만드는 것이 좋습니다. 시스템 고유의 여러 가지 요소에 따라, 다수의 비동기 I/O를 허용하도록 SQL Server를 다시 구성하는 것이 유용할 수도 있습니다. 그러나 대다수 시스템의 확장 용량 때문에 드라이브마다 하나의 컨트롤러를 사용하기가 힘듭니다.

4개의 디스크 드라이브에 장착된 단일 인텔리전트 컨트롤러

기술이 발전함에 따라 이제 여러 비인텔리전트 컨트롤러의 기능을 단일 인텔리전트 컨트롤러에 효과적으로 포함할 수 있게 되었습니다. 컨트롤러는 장치 드라이버로부터 많은 I/O 요청을 빠르게 받아들인 다음 보통 RAID 어레이로 스트라이프되는 장착 드라이브에 요청을 효과적으로 동시 전송할 수 있습니다. 이 경우 컨트롤러의 기능과 구성에 따라, 많은 비동기 I/O를 허용하도록 SQL Server를 다시 구성하면 성능이 향상될 수 있습니다. 서버와 컨트롤러에 따라, 특정 서버나 컨트롤러에서는 디스크 하위 시스템 구성에 따라 그리고 특정 디스크 하위 시스템 구성에서는 응용 프로그램의 I/O 특성에 따라 실제로 사용되는 값은 달라집니다.

max async IO 구성

Dat14e

max async IO 구성 옵션은 요청할 수 있는 비동기 I/O 수를 설정합니다. 기본값은 8입니다. 서로 다른 실제 디스크에 존재하는 복수의 실제 데이터베이스 장치에 정의된 데이터베이스를 가진 시스템 또는 디스크 스트라이프를 사용하는 시스템에서만 이 기본값을 변경해야 합니다.

max async IO 구성 옵션의 최적 값은 Microsoft TPC-B Benchmark Kit를 사용하거나, 기본 설정 8로 시작해서 이어지는 테스트마다 값을 조금씩 늘리는 방식으로 자체적인 고객 벤치마크를 실시함으로써 특정 상황에 대한 제어된 테스트를 수행하여 결정하는 것이 좋습니다. 더 이상 성능 향상이 보이지 않으면 그 값이 최적 값입니다. 실제적인 테스트를 수행하지 않을 때는 기본값을 그대로 사용해야 합니다.

구성 옵션을 변경하면 SQL Server를 다시 시작해야 변경 사항이 적용됩니다.

max lazywrite IO 구성

Dat15e

max lazywrite IO 구성 옵션은 지연 기록기가 수행하는 비동기 일괄 처리 I/O의 우선 순위를 조정합니다. max lazywrite IO는 대량 복사, 검사점 같은 일괄 I/O를 제어하는 max async IO와 비슷하지만 지연 기록기 고유의 옵션입니다. 이 옵션은 하드 디스크가 여러 개 있는 시스템에서만 구성해야 합니다. max async IO에서 지정한 값까지 동적으로 이 옵션을 구성할 수 있습니다.

이 구성 옵션을 변경하면 변경 사항이 즉시 적용됩니다.

버퍼 관리자 구성

Dat16e

Free Buffers

이 구성 옵션은 시스템이 사용할 수 있는 사용 가능한 버퍼의 임계값을 결정합니다. 최소값은 20이며 최대값은 서버가 시작될 때 사용할 수 있는 버퍼 수의 절반입니다. 지연 기록기 프로세스는 시스템이 사용할 수 있는 사용 가능한 버퍼 수가 이 임계값 아래로 내려가지 않도록 합니다.

이 옵션은 memory 옵션이 변경될 때마다 시스템에 의해 자동으로 변경됩니다. free buffers는 사용 가능한 메모리의 5%로 설정됩니다. memory 옵션이 변경되면 free buffers가 변경되었다는 메시지가 나타납니다. 그러면 free buffers를 유효한 값으로 직접 재구성할 수 있습니다.

Sort Pages

이 구성 옵션은 정렬에 할당되는 사용자 당 최대 페이지 수를 지정합니다. 대량 정렬을 수행하는 시스템에서 이 값을 늘리면 성능이 향상될 수 있습니다. 추가 정렬 페이지는 메모리를 소모하기 때문에 이 값을 늘리면 서버 전용 메모리의 양도 늘려야 할 수 있습니다.

Hash Buckets

이 구성 옵션은 페이지를 메모리의 버퍼에 해시하는 데 사용되는 버킷 수를 설정합니다. 지정된 값이 최적 값이 아닌 경우 최적 값에 가장 가까운 값이 사용됩니다. 예를 들어, 8,000을 지정하면 7,993개의 해시 버킷(기본값)이 만들어집니다. 대량의 메모리가 있는 시스템에서는 데이터 캐시의 데이터에 더욱 빠르게 액세스하기 위해 이 값을 늘릴 수 있습니다. 메모리가 160MB 이하인 시스템에서는 7,993이 적당한 값입니다. 이 옵션은 서버를 종료한 후 다시 시작해야 적용됩니다.

Recovery Interval

이 구성 옵션은 시스템 장애 발생 시 SQL Server가 복구 절차를 완료하는 데 필요한 데이터베이스 당 최대 시간(분)을 설정합니다. 기본값은 5분입니다.

응용 프로그램 및 응용 프로그램 사용 상태가 바뀌면 recovery interval을 변경할 수 있습니다. 예를 들어, 업데이트 동작이 많을 때 변경 사항이 디스크에 자주 쓰이도록 하려면 recovery interval을 줄일 수 있습니다. recovery interval을 줄이면 검사점이 더 자주 지정되기 때문에 시스템 속도가 약간 느려집니다. 그러나 recovery interval을 너무 높게 설정하면 복구 시간이 지나치게 길어질 수 있습니다.

페이지를 캐시에 유지

Dat17e

부분 구문

sp_tableoption @TableNamePattern [, 'pintable'] [, true | false ]

pintable 옵션을 true로 설정하면 SQL Server가 테이블과 그 모든 인덱스를 데이터 캐시에 유지합니다. 고정된 테이블에 속하는 페이지들은 새 페이지를 위한 공간 확보를 위해 데이터 캐시 밖으로 플러시되지 않습니다. 고정된 테이블에 대한 모든 수정 사항은 로그에 기록되며 지연 기록기와 검사점은 고정된 모든 테이블의 커밋되지 않은 데이터 페이지를 일반적인 방식대로 씁니다.

sysobjects 테이블에 상태 비트를 설정하여 테이블을 고정된 테이블로 표시할 수 있습니다.

이 저장 프로시저는 테이블과 인덱스를 자동으로 메모리로 가져오지 않습니다. 즉, 데이터 및 인덱스 페이지는 액세스될 때 데이터 캐시로 들어온 다음 SQL Server가 중지되거나 pintable의 값이 false로 설정될 때까지 계속 데이터 캐시에 남아 있습니다. 고정된 테이블을 메모리로 빠르게 가져오려면, 클러스터되지 않은 인덱스가 없는 열을 사용하여 SELECT COUNT(열_이름) FROM 테이블_이름 같은 간단한 명령으로 액세스하면 됩니다.

자주 사용되는 특정 테이블을 고정하면 특정 환경에서 성능을 크게 향상시킬 수 있습니다. 언제나 테이블을 고정한 후에도 데이터 캐시의 양이 충분히 남아 있도록 해야 합니다.

와일드카드를 사용하여 테이블 이름을 지정할 수 있습니다. 이렇게 하면 여러 테이블을 고정하거나 해제할 수 있습니다. true 또는 false 값을 지정하지 않으면 이 명령은 지정된 테이블의 현재 pintable 설정 값을 반환합니다.

참고 테이블 크기에는 제한이 없지만 테이블이 크면 캐시가 소모될 수 있습니다.

인덱스 페이지를 캐시에 유지

추적 플래그 1081은 인덱스 페이지가 데이터 캐시에 유지될 수 있도록 합니다. 새 페이지를 가져오기 위해 어떤 인덱스 페이지를 캐시 밖으로 플러시해야 하는 경우, SQL Server는 다른 페이지를 선택합니다. 단, 이 특정 인덱스 페이지를 건너뛴 적이 없어야 합니다. 따라서 인덱스 페이지가 데이터 캐시에 더 오래 유지될 수 있습니다.

미리 읽기 처리

Dat18e

미리 읽기를 병렬 데이터 스캔(PDS)이라고도 합니다. SQL Server는 이 방법을 사용하여 쿼리를 처리하는 데 필요한 물리적 읽기 횟수를 줄입니다. 특정 개수의 필요한 페이지가 캐시에 없으면, SQL Server는 현재의 SQL Server 프로세스에 필요한 페이지를 읽을 다른 스레드를 시작할 수 있습니다.

SQL Server가 데이터 수평 스캔을 수행할 때마다 미리 읽기가 시작될 수 있습니다. 수평 스캔에는 테이블 스캔, 클러스터되지 않은 인덱스에 대한 잎 수준 인덱스 스캔, DBCC 문 및 UPDATE STATISTICS가 포함될 수 있습니다.

미리 읽기 구성

Dat19e

RA Cache Miss Limit

SQL Server가 수평 데이터 스캔을 수행하는 동안 이 페이지 개수가 데이터 캐시에서 발견되지 않으면 미리 읽기가 시작됩니다. RA cache miss limit을 1로 설정하면 디스크에서 데이터 페이지가 액세스될 때마다 미리 읽기 요청이 이루어지며 이로 인해 스래싱이 발생하고 성능이 떨어질 수 있습니다.

RA Pre-fetches

이 값은 미리 읽기(RA) 관리자가 얼마나 멀리까지 미리 읽어야(확장 영역 단위로) 미리 반입 관리자가 유휴 상태가 되는지 결정합니다. 값이 3이면, 제출된 각 요청에 대해 RA 관리자가 페이지 체인에서 현재 스캔 위치보다 확장 영역 3개를 앞서갑니다.

RA Cache Hit Limit

이 개수의 필요한 페이지가 캐시에서 발견되면 미리 읽기가 중지되었다가 그 후에 처음으로 손실이 발견되면 다시 시작됩니다. 이 옵션은 미리 읽기 관리자가 캐시에서 모든 것을 발견하는 상황을 알아내는 데 사용되며 쿼리에는 거의 도움이 되지 않습니다. 대부분의 시스템에서는 기본값 4로 충분합니다.

RA Worker Threads

각 스레드는 구성 가능한 구조 수를 관리합니다(RA slots per thread 옵션 참조). 여기서 이러한 각 구조(슬롯)는 개별적인 범위 스캔을 나타냅니다. 이 옵션은 시스템에 대한 최대 동시 사용자 수로 설정해야 합니다. 미리 읽기 스캔을 요청하는 스레드 수가 구성된 RA 슬롯 수를 초과하면 오류 로그에 경고가 기록됩니다. 이 값을 0으로 설정하면 미리 읽기가 사용 해제됩니다.

RA Slots Per Thread

이 값은 각각의 미리 읽기 서비스 스레드가 관리할 동시 요청 수를 지정합니다. 스레드 수에 슬롯 수를 곱하면 시스템이 지원할 동시 미리 읽기 스캔의 총 개수가 됩니다. 대부분의 시스템에서는 기본값이면 충분합니다. 시스템에 효율적인 I/O 하위 시스템이 갖춰져 있으면 단일 스레드가 처리할 수 있는 스캔 수를 늘릴 수 있습니다.

RA Delay

쿼리 스레드가 미리 읽기를 호출할 때 그 시간과 운영 체제가 미리 읽기 스레드를 활성화하는 시간 사이에 약간의 지연이 있을 수 있습니다. 이 지연 옵션은 쿼리 스레드가 얼마 동안 대기해야 작업을 다시 시작할 수 있는지 설정합니다. 이는 미리 읽기 스레드가 시작된 다음 쿼리 스레드 작업이 계속되도록 하기 위해서입니다. 이 값을 0으로 설정하면 기본적으로 미리 읽기가 비활성화됩니다. 쿼리 스레드가 항상 미리 읽기가 활성화되기 전에 다음 페이지에 액세스하기 때문입니다.

미리 읽기 검토 및 제어

Dat20e

DBCC SQLPERF(RASTATS)는 4가지 통계를 반환합니다. 아래 출력 예제를 참조하십시오.

Statistic Value
-------------------------------- ------------------------
RA Pages Found in Cache 297.0
RA Pages Placed in Cache 12933.0
RA Physical IO 1644.0
Used Slots 0.0

아래 표는 반환된 4가지 값의 의미를 정리한 것입니다.

통계
정의
RA Pages Found in Cache
스캔을 수행하려 할 때 RA 관리자가 캐시에서 발견한 페이지 수
RA Pages Placed in Cache
RA 관리자가 캐시로 가져온 페이지 수
RA Physical IO
RA 관리자가 수행한 16K 읽기 횟수
Used Slots
활성 쿼리에 의해 사용되는 RA 슬롯 수. 단일 쿼리가 여러 개의 RA 슬롯을 사용할 수도 있습니다.

SQL Server 프로시저 캐시

Dat21e

프로시저 캐시 구성

Dat22e

프로시저 캐시에는 아래 요소들이 포함됩니다.

  • 프로시저 버퍼 배열

    캐시 페이지 수만큼의 프로시저 버퍼 슬롯이 고정 배열로 저장됩니다. 각 프로시저 버퍼 슬롯은 122바이트의 프로시저 캐시를 사용합니다. DBCC MEMUSAGE 출력에서 프로시저 버퍼 배열을 유지하는 데 필요한 공간을 프로시저 헤더라고 합니다.

  • 프로시저 헤더

    사용된 각 프로시저 버퍼 슬롯은 프로시저 헤더를 가리킵니다. 이 헤더는 캐시에서 프로시저 계획 또는 트리의 첫째 페이지입니다. 이 첫째 페이지에는 계획이나 트리에 있는 다른 페이지의 주소 같은 메모리 관리 정보가 포함됩니다. 또한 호출 프로시저(있는 경우)는 물론 계획의 첫째 문에 대한 포인터도 포함됩니다. 이 구조는 처음 2K 페이지의 606바이트를 사용합니다. 2K 페이지의 나머지 바이트는 계획 또는 트리에 사용할 수 있습니다. 계획이나 트리의 크기에 따라 이들과 관련된 많은 추가 페이지가 있을 수 있습니다. DBCC MEMUSAGE 출력에서 프로시저 캐시로 사용될 사용 가능한 공간을 프로시저 캐시 버퍼라고 합니다.

  • 사용된 페이지에는 쿼리 계획 또는 쿼리 트리가 포함됩니다.
  • 활성 페이지에는 현재 실행되는 프로시저의 계획이 포함됩니다.
  • 빈 페이지는 새 계획에 사용할 수 있습니다.

같은 프로시저에 여러 계획이 있으면 이들 각자가 자체의 프로시저 버퍼 슬롯과 프로시저 헤더를 가집니다.

프로시저 캐시 크기 조정

Dat23e

프로시저 캐시 구성 옵션

procedure cache 값은 새 저장 프로시저를 만들고 새 쿼리를 컴파일하기 위해 SQL Server가 가장 최근에 사용된 저장 프로시저를 저장하는 데 사용할 메모리 양을 지정합니다.

지정된 값에 따라 SQL Server 메모리 요구 사항이 충족된 후 프로시저 캐시에 할당되는 메모리 백분율이 결정됩니다. SQL Server에 필요한 메모리는 잠금, 사용자 연결, 코드 자체 등에 필요한 메모리를 합한 양입니다. 나머지 메모리는 이 구성 옵션에 의해 설정된 백분율에 따라 프로시저 캐시와 데이터 캐시 간에 분할됩니다.

저장 프로시저, 트리거, 뷰, 규칙, 기본값 등에 필요한 프로시저 캐시의 양은 이들의 개수와 크기에 따라 달라집니다. 같은 저장 프로시저에 여러 사용자가 액세스하는 경우 캐시에 미사용 복사본이 없으면 SQL Server가 프로시저 계획의 복사본을 또 하나 만들어야 합니다.

이 매개 변수를 변경하면 SQL Server를 다시 시작해야 변경 사항이 적용됩니다.

프로시저 캐시 사용 모니터링

DBCC MEMUSAGE를 사용하여 프로시저 캐시에 있는 가장 큰 20개의 프로시저를 모니터할 수 있습니다.

DBCC MEMUSAGE의 출력 내용은 프로시저 캐시에 필요한 공간을 예측하는 데 도움이 될 수 있습니다. 이 출력에 캐시에 있는 계획의 크기가 제공되므로 이 수를 예상되는 동시 사용자 수와 곱할 수 있습니다.

프로시저 캐시는 아래의 두 방식 중 하나로 구성될 수 있습니다.

  • 사용할 수 있는 사용 가능한 페이지가 많이 있거나 덮어쓸 수 있는 비활성 상태의 사용된 페이지가 있더라도, 다수의 작은 프로시저가 프로시저 버퍼 배열을 채울 수 있습니다.
  • 프로시저 버퍼 배열에 사용 가능한 슬롯이 있더라도 몇 개의 큰 프로시저가 사용 가능한 모든 페이지를 사용할 수 있습니다.

프로시저 캐시가 가득 차서 새 프로시저를 실행할 수 없는 경우 아래와 같은 오류 701이 반환됩니다.

There is insufficient system memory to run this query.

성능 모니터 카운터

개체: SQLServer – Procedure Cache
카운터: Procedure Cache Size 및 Procedure Cache Used %

Procedure Cache Size 카운터는 2K 페이지의 프로시저 캐시 크기를 보고합니다. memory 또는 procedure cache 구성 옵션 값을 변경한 다음 SQL Server를 다시 시작하지 않는 한 이 카운터는 변경되지 않습니다.

Procedure Cache Used % 카운터는 캐시된 저장 프로시저, 트리거, 뷰, 규칙 및 기본값이 사용하는 프로시저 캐시의 백분율을 모니터합니다.

장기적인 관점에서 Procedure Cache Used % 카운터를 90-95% 정도로 만드는 것이 이상적입니다.

Procedure Cache Used % 카운터가 이보다 훨씬 낮은 경우 프로시저 캐시에 메모리를 너무 많이 할당한 것이며 데이터 캐시에 사용할 수 있는 메모리를 낭비하고 있는 것입니다. 따라서 프로시저 캐시 값을 낮추고 SQL Server를 다시 시작한 다음 이 카운터를 계속 모니터해야 합니다.

Procedure Cache Used % 카운터가 지속적으로 95% 이상인 경우 프로시저 캐시를 충분히 할당하지 않은 것입니다. 이런 경우 프로시저 캐시 구성 옵션의 값을 늘리고 SQL Server를 다시 시작한 다음 모니터링 프로세스를 계속해야 합니다.

기타 SQL Server 구성 옵션

Dat24e

Max Worker Threads

이 구성 옵션은 SQL Server 프로세스에 사용할 수 있는 작업자 스레드 수를 구성합니다. SQL Server는 운영 체제 고유의 스레드 서비스를 사용합니다. 작업자 스레드는 하나가 아니라 여러 개 있습니다. SQL Server가 동시에 지원하는 각 네트워크는 하나 이상의 스레드에 의해 지원됩니다. 또 다른 스레드는 데이터베이스 검사점을 처리하며 스레드 풀은 모든 사용자를 처리합니다.

max worker threads 옵션을 사용하면 사용자 풀에 할당되는 스레드 수를 제어할 수 있습니다. 사용자 연결 수가 max worker threads보다 적으면 한 스레드가 각 연결을 처리합니다. 그러나 연결 수가 max worker threads보다 많으면 스레드 풀링이 이루어집니다. 또한 설정된 작업자 스레드 값이 초과되면 현재 작업을 완료하는 그 다음 작업자 스레드가 그 요청을 처리합니다. 기본값은 255입니다.

Logwrite Sleep

이 구성 옵션은 버퍼가 가득 차지 않은 경우 로그에 대한 쓰기를 얼마 동안(밀리초) 지연시킬 것인지 지정합니다. 이 옵션을 사용하면, 다른 사용자가 더 많은 데이터를 로그 버퍼에 추가할 기회가 많아지기 때문에 필요한 물리적 로그 쓰기가 줄어듭니다. 이 옵션에 허용되는 값은 1에서 500까지입니다. 특별한 값인 -1을 사용하면 로그 쓰기가 지연되지 않습니다. 기본값은 0이며 이 값을 사용하면 다른 사용자가 실행할 준비가 되었을 때만 서버가 대기합니다.

이 매개 변수에 대한 변경 사항은 즉시 적용됩니다.

Priority Boost

이 구성 옵션은 SQL Server가 동일 컴퓨터의 다른 프로세스보다 높은 순위로 실행되도록 할 것인지 여부를 결정합니다. 이 옵션을 1로 설정하면 SQL Server가 더 높은 우선 순위로 실행됩니다. 기본값은 0이며 SQL Server 전용 Windows NT 시스템에서만 변경해야 합니다. 네트워크 등 필요한 다른 프로세스가 중단되지 않도록 주의해야 합니다.

SMP Concurrency

이 구성 옵션은 SQL Server가 실행을 위해 Windows NT에 보낼 스레드 수를 제어합니다. 이는 사실상 SQL Server가 사용하는 CPU 수를 제한합니다. 단일 프로세서 컴퓨터인 경우 최적 값은 1입니다. 대칭 다중 프로세서(SMP) 컴퓨터인 경우 서버가 전용 SQL Server인지 여부에 따라 제한이 달라집니다. 전용 서버가 아닌 경우 이 값을 다시 구성하면 동일 시스템에서 실행되는 다른 응용 프로그램에 대한 응답 시간이 느려질 수 있습니다. 다른 응용 프로그램에 대한 응답 시간이 문제가 되지 않는 경우에는 SMP concurrency-1, 즉 "전용 SMP 지원"으로 설정하십시오. 이는 어떤 제한도 없다는 뜻입니다.

SQL Server를 설치하면 SMP concurrency가 0으로 설정됩니다. 이는 자동 구성을 뜻합니다. 자동 구성 모드에서는 n-1로 설정됩니다. 여기서 n은 SQL Server를 시작할 때 검색되는 프로세서 수입니다. 단일 프로세서 시스템에서는 이 값이 1로 설정됩니다.

이 매개 변수를 변경하면 SQL Server를 다시 시작해야 변경 사항이 적용됩니다.

Set Working Set Size

이 구성 옵션은 Windows NT가 memory 설정과 tempdb 크기의 합계에 해당하는 실제 메모리 공간(RAM에 있는 경우)을 SQL Server를 위해 예약하도록 합니다.

Network Packet Size

이 구성 옵션은 기본 네트워크 패킷 크기에 대해 서버 차원의 값을 설정합니다. 클라이언트 응용 프로그램은 이 값을 무시할 수 있습니다. 여러 네트워크 프로토콜을 사용하는 시스템에서는 이 옵션을 가장 일반적으로 사용되는 프로토콜의 크기로 설정해야 합니다. 네트워크 프로토콜이 큰 패킷을 지원하는 경우 이 옵션으로 네트워크 성능을 향상시킬 수 있습니다. 옵션을 재구성하면 변경 사항이 즉시 적용됩니다. 기본값은 4,096입니다.

이 매개 변수에 대한 변경 사항은 즉시 적용됩니다.

데이터베이스 및 세션 구성

Dat25e

데이터베이스 옵션

데이터베이스 옵션은 데이터베이스 소유자 또는 SA만 변경할 수 있습니다. 데이터베이스 옵션은 마스터 데이터베이스에 저장되기 때문에 데이터베이스 소유자를 가장한 누군가가 이를 변경할 수 없습니다.

아래 데이터베이스 옵션들이 쿼리 성능에 영향을 미칠 수 있습니다.

read only
single user only

두 경우 모두, 어떠한 동작에 대해서도 잠금이 이루어지거나 확인되지 않습니다. 해당 문서에서 설명하겠지만 다중 사용자 환경에서는 잠금 경합이 가장 중대한 성능 문제 중 하나입니다.

다른 데이터베이스 옵션들은 더 간접적인 방식으로 성능에 영향을 미칠 수 있습니다. trunc. log on chkpt 옵션은 시스템 검사점 프로세스가 실행될 때마다 추가적인 시스템 오버헤드를 유발합니다. select into/bulkcopy 옵션을 사용하면 빠른 대량 복사 또는 SELECT INTO 작업을 수행할 수 있습니다. 이들은 다른 방법들보다 훨씬 빠릅니다.

테이블 옵션

테이블 옵션도 성능에 영향을 미칠 수 있습니다. 테이블 옵션은 sp_tableoption을 사용하여 설정합니다. pintable 테이블 옵션에 대해서는 앞에서 이미 설명했습니다. insert row lock 테이블 옵션에 대해서는 해당 문서에서 설명합니다.

세션 옵션

세션 옵션은 SET 명령으로 제어하며 세션이 유지되는 동안에만 효력을 나타냅니다. 저장 프로시저에서 세션 옵션을 사용 설정하면 그 저장 프로시저가 종료될 때까지 이들의 효력이 유지됩니다.

아래 세션 옵션들이 쿼리 성능에 영향을 미칠 수 있습니다.

FORCEPLAN

SQL Server 최적화 프로그램 프로세스가 FROM 절에 나타나는 테이블 순서대로 조인하도록 합니다. FORCEPLAN은 기본적으로 최적화 프로그램을 무시합니다.

DEADLOCKPRIORITY {LOW | NORMAL}

교착 상태가 발생할 때 이 세션이 응답할 방식을 제어합니다. LOW로 설정하면 이 프로세스가 교착 상태에서 우선적으로 희생됩니다. NORMAL 옵션을 사용하면 세션을 기본 교착 상태 처리 방법으로 되돌릴 수 있습니다.

TRANSACTION ISOLATION LEVEL

이 연결에 대해 모든 SQL Server SELECT 문의 기본 트랜잭션 잠금 동작을 제어합니다. 해당 문서에서 다양한 값에 대해 설명합니다.

IMPLICIT_TRANSACTIONS

문이 실행될 때 트랜잭션이 묵시적으로 시작되도록 할 것인지 여부를 제어합니다. 이 동작이 성능에 미치는 영향에 대해서는 해당 문서에서 설명합니다.

DISABLE_DEF_CNST_CHK

임시로 지연된 위반 검사를 지정합니다. 이 옵션의 의미 및 성능 영향에 대해서는 해당 문서에서 설명합니다.

© 1997 Microsoft Corporation. All rights reserved.

이 문서에 포함된 정보는 문서를 발행할 때 논의된 문제들에 대한 Microsoft Corporation의 당시 관점을 나타냅니다. Microsoft는 변화하는 시장 환경에 대처해야 하므로 이를 Microsoft 측의 책임으로 해석해서는 안 되며 발행일 이후 소개된 어떠한 정보에 대해서도 Microsoft는 그 정확성을 보장하지 않습니다.

이 설명서는 오직 정보를 제공하기 위한 것입니다. Microsoft는 이 설명서에서 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.

Microsoft 및 Windows NT는 Microsoft Corporation의 등록 상표입니다.

여기에 인용된 다른 제품이나 회사 이름은 해당 소유자의 상표일 수 있습니다.


 

최종 수정일 : 2000.5.12

+ Recent posts