SQL 서버는 쿼리를 실행하여 잘못된"실제 행 개수"에 사용되는 인덱스와 성능을 끔찍한 느린

StackOverflow https://stackoverflow.com/questions/225309

문제

오늘 나는 우연히 흥미로운 성능 문제에 저장된 절차에서 실행 되는 Sql Server2005SP2 에 db 를 실행하는 호환되는 수준의 80(SQL2000).

Proc 실행은 약 8 분의 실행 계획의 사용을 표시하는 지수는 실제 행의 수 1.339.241.423 는 요인에 대해 1000 보다 높은"진짜"실제 rowcount 테이블의 자체 1.144.640 으로 올바르게 표시하여 추정된 행 계산합니다.그래서 실제 행 계산에 의해 주어진 쿼리 계획을 최적화하는 것은 분명히 잘못!

alt text

흥미롭게도,복사되던 매개 변수 값이 내부에 proc 지역 변수 사용하여 로컬에서 변수는 실제 쿼리,모든 것이 잘 작동-proc 실행 18 초고 실행 계획하여 실제 행 계산합니다.

편집: 에 의해 제안 TrickyNixon,이 될 것입의 매개 변수는 스니핑 문제입니다.하지만 실제로,나에서 얻을 모두 경우 정확한 동일한 실행 계획을 실행합니다.동일 인덱스보기 바람에서 사용되는 동일한다.유일한 차이가 나는 방법입니다 높은 실제 행 개수에 PK_ED_Transitions 인덱스를 직접 사용할 때들을 가져오.

나 dbcc dbreindex 및 업데이트 통계없이 이미 이 성공합니다.dbcc show_statistics 보여주는 좋은 데이터 인덱스,too.

Proc 만들어로 다시 컴파일 그렇게 실행될 때마다 새로운 실행 계획이 컴파일합니다.

더정-이 하나 빠른 실행됩니다:

CREATE  Proc [dbo].[myProc](
@Param datetime
)
WITH RECOMPILE 
as

set nocount on

declare @local datetime
set @local = @Param

select 
some columns
from 
table1
where
column = @local
group by
some other columns

이 버전은 실행이 몹시 느리고,하지만 생산하는 정확히 동일한 실행계획서(외에는 너무 높은 실제 행 계산에 사용되는 인덱스):

CREATE  Proc [dbo].[myProc](
@Param datetime
)
WITH RECOMPILE 
as

set nocount on

select 
some columns
from 
table1
where
column = @Param
group by
some other columns

어떤 아이디어가?사람이 누가 알고 있는 Sql 서버가 실제 행 개수에서 값을 계산할 때 쿼리 계획?

업데이트:가 쿼리로 다른 서버에서만 copat 모드로 설정된 90(Sql2005).그 동일한 동작이다.난 것이라 생각을 열어 ms 지원,전화기 때문에 이처럼 내게 보이는 버그입니다.

도움이 되었습니까?

해결책

Ok,마지막으로 있어요.

두 쿼리 계획은 다른 작은 디테일을 놓쳤습니다.느린 하나 사용이 중첩된 루프 연산자입 두 가지 하위 함께.그 결과 높은 수에서는 현재의 행에 색인 검사자는 단순히 결과의 multiplicating 의 행 수의 입력으로 행 수를 입력 b.

나는 아직도 알지 못하는 이유 최적화 프로그램을 사용하기로 결정 루프를 대신 해시의 일치를 실행하는 1000 빠르게 타이머,이 경우에는 그러나 나는 처리할 수 있 나의 문제를 만들어 새로운 지수,그래서는 엔진에 인덱스 구 statt 대신 인덱스 검색에 중첩된 루프가 있습니다.

다른 팁

복사/붙여 넣기 쿼리에 대해 저장된 Proc의 실행 계획을 확인할 때 예상 계획 또는 실제 계획을 사용하고 있습니까? 쿼리를 클릭하고 실행 계획을 포함한 다음 각 쿼리를 실행하십시오. 이러한 계획을 비교하고 차이점이 무엇인지 확인하십시오.

매개 변수 스니핑의 경우처럼 들립니다. 가능한 솔루션과 함께 훌륭한 설명이 있습니다. 매개 변수 냄새가납니다!

다음은 다음을 해결하는 또 다른 stackoverflow 스레드입니다. SQL Server의 매개 변수 스니핑 (또는 스푸핑)

나에게 그것은 아직도 소리를 경우에는 통계가 잘못되었습니다.인덱스를 다시 작성하지 않는 반드시 업데이트합니다.

당신은 이미 당신도 명시적 UPDATE STATISTICS 에 대한 영향을 받는 테이블?

당신은 달리 셨나요? sp_spaceused SQL Server가 해당 테이블에 대한 올바른 요약을 받았는지 확인하려면? SQL 2000을 믿는 엔진은 실행 계획을 구축 할 때 이러한 종류의 메타 데이터를 사용하는 데 사용되었습니다. 우리는 달리기를해야했습니다 DBCC updateUsage SQL Server가 잘못된 Row Count 데이터로 인해 잘못된 인덱스를 선택하고 있기 때문에 빠르게 변경된 일부 테이블의 메타 데이터를 업데이트하려면 매주.

SQL 2005를 실행하고 있으며 Bol은 2005 년에 더 이상 UpdateUsage를 실행할 필요가 없지만 2000 년 컨덕트 모드이기 때문에 여전히 필요하다는 것을 알 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top