쿼리 성능 저하 문제 해결: 카디널리티 예측
SQL Server의 쿼리 최적화 프로그램은 비용을 기반으로 합니다. 즉, 가장 낮은 예상 처리 비용으로 실행할 수 있는 쿼리 계획을 선택합니다. 쿼리 최적화 프로그램에서는 다음 두 가지 주요 요소를 기반으로 쿼리 계획 실행 비용을 결정합니다.
쿼리 계획의 각 수준에서 처리되는 총 행 수(계획의 카디널리티라고 함)
쿼리에 사용된 연산자가 지정하는 알고리즘의 비용 모델
첫 번째 요소인 카디널리티는 두 번째 요소인 비용 모델의 입력 매개 변수로 사용됩니다. 따라서 카디널리티를 향상시키면 예상 비용이 줄어들어 실행 계획이 빨라집니다.
SQL Server에서는 수동 또는 자동으로 인덱스나 통계를 만들 때 생성되는 히스토그램에서 주로 카디널리티를 예측합니다. SQL Server는 제약 조건 정보와 논리적 쿼리 다시 작성을 통해 카디널리티를 결정하는 경우도 있습니다.
다음 경우에는 SQL Server에서 카디널리티를 정확하게 계산할 수 없습니다. 따라서 비용 계산이 부정확하여 최적이 아닌 쿼리 계획이 생성될 수 있습니다. 쿼리에서 이러한 구조를 피하면 쿼리 성능이 향상될 수 있습니다. 대체 쿼리 구문이나 기타 방법을 사용할 수도 있으며 이 문서의 아래 부분에 관련 내용이 나와 있습니다.
같은 테이블의 여러 열 간에 비교 연산자를 사용하는 조건자가 있는 쿼리
연산자를 사용하는 조건자가 있고 다음 중 하나에 해당되는 쿼리
연산자 어느 쪽에도 관련 열에 대한 통계가 없습니다.
통계의 값 분포가 균일하지 않지만 쿼리가 매우 선택적인 값 집합을 찾습니다. 연산자가 등호(=)가 아닐 때 특히 이 경우에 해당할 수 있습니다.
조건자가 같지 않음(!=) 비교 연산자나 NOT 논리 연산자를 사용합니다.
SQL Server 기본 제공 함수 또는 인수가 상수 값이 아닌 사용자 정의 스칼라 반환 함수를 사용하는 쿼리
산술 또는 문자열 연결 연산자를 통해 열을 조인하는 쿼리
쿼리가 컴파일되고 최적화될 때 알 수 없는 값을 가진 변수를 비교하는 쿼리
다음 방법을 사용하여 이러한 유형의 쿼리 성능을 향상시킬 수 있습니다.
쿼리에 관련된 열에 대해 유용한 인덱스나 통계를 작성합니다. 자세한 내용은 인덱스 디자인 및 통계를 사용하여 쿼리 성능 향상를 참조하십시오.
쿼리에서 비교 또는 산술 연산자를 사용하여 둘 이상의 열을 비교하거나 결합하는 경우 계산 열을 사용하고 쿼리를 다시 작성해 봅니다. 예를 들어 다음 쿼리는 두 열의 값을 비교합니다.
SELECT * FROM MyTable WHERE MyTable.Col1 > MyTable.Col2
Col1과 Col2의 차(Col1 - Col2)를 계산하는 MyTable에 계산 열 Col3을 추가하면 성능이 향상될 수 있습니다. 그런 다음 쿼리를 다시 작성합니다.
SELECT * FROM MyTable WHERE Col3 > 0
MyTable.Col3에 인덱스를 작성하면 성능이 더욱 향상됩니다.