증상
테이블 변수를 여러 행으로 채운 다음 다른 테이블과 조인 하면 쿼리 최적화 프로그램이 비효율적인 쿼리 계획을 선택 하 여 쿼리 성능이 느려지는 문제가 발생할 수 있습니다.
해결 방법
이 핫픽스를 적용 한 후에 충분 한 수의 행이 변경 되 면 테이블 변수에서 재컴파일 트리거를 실행할 수 있도록 추적 플래그 2453을 설정 합니다. 이렇게 하면 쿼리 최적화 프로그램에서 보다 효율적인 계획을 선택할 수 있습니다. 이 문제는 다음과 같은 SQL Server 누적 업데이트 또는/및 서비스 팩에서 처음 수정 되었습니다.
SQL Server 2014에 대 한 누적 업데이트 3 /en-us/help/2984923
각각의 새로운 새 누적 업데이트에는 이전 누적 업데이트에 포함 된 모든 핫픽스와 모든 보안 수정 사항이 포함 되어 있습니다. SQL Server에 대 한 최신 누적 업데이트를 확인 하세요.
서비스 팩은 누적 됩니다. 새로운 각 서비스 팩에는 이전 서비스 팩의 모든 수정 프로그램과 함께 새로운 수정 프로그램이 포함 되어 있습니다. 최신 서비스 팩과 해당 서비스 팩에 대 한 최신 누적 업데이트를 적용 하는 것이 좋습니다. 최신 서비스 팩을 설치 하기 전에 이전 서비스 팩을 설치할 필요가 없습니다. 최신 서비스 팩 및 최신 누적 업데이트에 대 한 자세한 내용을 보려면 다음 문서에서 표 1을 사용 하세요.
추가 정보
일괄 처리 또는 프로시저에서 테이블 변수를 사용 하는 경우 쿼리는 테이블 변수의 초기 빈 상태에 대해 컴파일되고 최적화 됩니다. 런타임에이 테이블 변수를 여러 행으로 채우면 미리 컴파일된 쿼리 계획이 더 이상 최적이 아닐 수 있습니다. 예를 들어 쿼리는 일반적으로 적은 수의 행에 대해 더 효율적 이므로 중첩 루프를 사용 하 여 테이블 변수를 조인할 수 있습니다. 테이블 변수에 수백만 개의 행이 있는 경우이 쿼리 계획을 비효율적으로 만들 수 있습니다. 이러한 조건에서 해시 조인을 선택 하는 것이 더 좋을 수 있습니다. 새 쿼리 계획을 얻으려면 다시 컴파일해야 합니다. 그러나 다른 사용자 또는 임시 테이블과는 달리 테이블 변수의 행 개수 변경은 쿼리 재컴파일를 트리거하지 않습니다. 일반적으로 자체 오버 헤드 비용을 포함 하는 옵션 (재컴파일)을 사용 하 여이 문제를 해결할 수 있습니다. 추적 플래그 2453를 사용 하면 옵션 (재컴파일) 없이 쿼리를 다시 컴파일할 때 이점을 얻을 수 있습니다. 이 추적 플래그는 두 가지 주요 측면의 OPTION (재컴파일)과 다릅니다. (1) 다른 테이블과 같은 행 개수 임계값을 사용 합니다. 모든 실행 옵션 (재컴파일)과 달리 쿼리를 컴파일할 필요는 없습니다. 행 개수 변경 내용이 미리 정의 된 임계값을 초과 하는 경우에만 다시 컴파일을 트리거합니다. (2) 옵션 (재컴파일)은 쿼리가 매개 변수를 피킹하거나 쿼리를 최적화 하도록 강제 합니다. 이 추적 플래그는 매개 변수 피킹을 강제 적용 하지 않습니다.참고 이 추적 플래그는 런타임에 설정 되어 있어야 합니다. QUERYTRACEON에는이 추적 플래그를 사용할 수 없습니다. 이 추적 플래그는 보다 나은 쿼리 최적화 로부터 비용을 절약 하는 쿼리 재컴파일 수가 증가할 수 있으므로 주의 해 서 사용 해야 합니다.
상태
Microsoft는 "적용 대상" 절에 나열한 Microsoft 제품에서 이 문제를 확인했습니다.