Share via


쿼리 성능 저하 문제 해결: 카디널리티 예측

SQL Server의 쿼리 최적화 프로그램은 비용을 기반으로 합니다. 즉, 가장 낮은 예상 처리 비용으로 실행할 수 있는 쿼리 계획을 선택합니다. 쿼리 최적화 프로그램에서는 다음 두 가지 주요 요소를 기반으로 쿼리 계획 실행 비용을 결정합니다.

  • 쿼리 계획의 각 수준에서 처리되는 총 행 수(계획의 카디널리티라고 함)

  • 쿼리에 사용된 연산자가 지정하는 알고리즘의 비용 모델

첫 번째 요소인 카디널리티는 두 번째 요소인 비용 모델의 입력 매개 변수로 사용됩니다. 따라서 카디널리티를 향상시키면 예상 비용이 줄어들어 실행 계획이 빨라집니다.

SQL Server에서는 수동 또는 자동으로 인덱스나 통계를 만들 때 생성되는 히스토그램에서 주로 카디널리티를 예측합니다. SQL Server는 제약 조건 정보와 논리적 쿼리 다시 작성을 통해 카디널리티를 결정하는 경우도 있습니다.

다음 경우에는 SQL Server에서 카디널리티를 정확하게 계산할 수 없습니다. 따라서 비용 계산이 부정확하여 최적이 아닌 쿼리 계획이 생성될 수 있습니다. 쿼리에서 이러한 구조를 피하면 쿼리 성능이 향상될 수 있습니다. 대체 쿼리 구문이나 기타 방법을 사용할 수도 있으며 이 문서의 아래 부분에 관련 내용이 나와 있습니다.

  • 같은 테이블의 여러 열 간에 비교 연산자를 사용하는 조건자가 있는 쿼리

  • 연산자를 사용하는 조건자가 있고 다음 중 하나에 해당되는 쿼리

    • 연산자 어느 쪽에도 관련 열에 대한 통계가 없습니다.

    • 통계의 값 분포가 균일하지 않지만 쿼리가 매우 선택적인 값 집합을 찾습니다. 연산자가 등호(=)가 아닐 때 특히 이 경우에 해당할 수 있습니다.

    • 조건자가 같지 않음(!=) 비교 연산자나 NOT 논리 연산자를 사용합니다.

  • SQL Server 기본 제공 함수 또는 인수가 상수 값이 아닌 사용자 정의 스칼라 반환 함수를 사용하는 쿼리

  • 산술 또는 문자열 연결 연산자를 통해 열을 조인하는 쿼리

  • 쿼리가 컴파일되고 최적화될 때 알 수 없는 값을 가진 변수를 비교하는 쿼리

다음 방법을 사용하여 이러한 유형의 쿼리 성능을 향상시킬 수 있습니다.

  • 쿼리에 관련된 열에 대해 유용한 인덱스나 통계를 작성합니다. 자세한 내용은 인덱스 디자인통계를 사용하여 쿼리 성능 향상를 참조하십시오.

  • 쿼리에서 비교 또는 산술 연산자를 사용하여 둘 이상의 열을 비교하거나 결합하는 경우 계산 열을 사용하고 쿼리를 다시 작성해 봅니다. 예를 들어 다음 쿼리는 두 열의 값을 비교합니다.

    SELECT * FROM MyTable
    WHERE MyTable.Col1 > MyTable.Col2
    

    Col1Col2의 차(Col1 - Col2)를 계산하는 MyTable에 계산 열 Col3을 추가하면 성능이 향상될 수 있습니다. 그런 다음 쿼리를 다시 작성합니다.

    SELECT * FROM MyTable
    WHERE Col3 > 0
    

    MyTable.Col3에 인덱스를 작성하면 성능이 더욱 향상됩니다.