2013-06-05 3 views
3

나는 다음과 같은 쿼리를 실행 (또는 예상 실행 계획을 얻으려고), 그것은 매우 느린 할 때 10 + 분 (내가 기다리고 중지) :정말 느린

SELECT TOP 1 1 
    FROM File WITH (NOLOCK) 
WHERE FileID = '5021ECD3-2012-62E0-1F12-000041CCB35A' 
    AND FileSize > 0 
    AND Content IS NULL 

그러나, 다음 순간입니다 :

DECLARE @test varbinary(1) 

SELECT TOP 1 @test = Content 
    FROM File WITH (NOLOCK) 
WHERE FileID = '5021ECD3-2012-62E0-1F12-000041CCB35A' 
    AND FileSize > 0 

IF @test IS NULL 
    PRINT 'a' 

FileID에 고유 인덱스가 있습니다. 내용은 varbinary (최대)입니다. 왜 옵티마이 저가 먼저 그것을 사용하지 않는가? 그건 꽤 논리적 일거야, 안 그래? 그것은 내용이 null인지 아닌지 테이블 파일의 모든 행을 확인하고 적용하는 것 같습니다 WHERE FileID에 = '...'

+0

이유 때문에 TOP 1이 있습니까? EXISTS를 사용하고 있다고 할 수 있습니까? 및 콘텐츠 실제로 NULLable 있습니까? 그리고 쿼리 계획을 추가 할 수 있습니다. 또한, FileID와 FileSize의 색인이 생성됩니까? – gbn

+2

어떤 버전의 SQL입니까? 이후 버전의 경우 null이있는 열을 인덱스로 사용하기 위해 null 문을 사용하여 비 클러스터형 인덱스를 추가 할 수 있습니다. – Paul

+0

@gbn 내용이 Null입니다. 네,'IF EXISTS'에서이 쿼리를 사용하고 있었는데 믿을 수 없을만큼 천천히 진행되었습니다. 나는 쿼리 계획을 얻으려고 노력할 것이다. 쿼리가 끝날 때까지 나는 실제로 기다리지 않았다. @Paul 이것은 SQL Server 2008에있다. 네, 인덱스를 추가하는 것이 나의 최후의 수단이 될 것이다 :/그것은 단지 영원히 걸리고 테이블을 잠근다. 내가 정말 무엇을하고 있는지 SQL 서버 이해하지 @gbn ( – Kevin

답변

2

당신이 당신의 첫 번째 쿼리에 쿼리 계획을한다면 그럼 난 의심, 계획은 아마도 인덱스가없는 content = NULL을 찾는 테이블 스캔을 수행 할 것인가? 반면에 두 번째 쿼리는 FileID에 대해서만 조회를 수행합니다. FileID 만 찾으면 해당 조회가 반환됩니다. 물론 (첫 번째) FileId = '5021ECD3-2012-62E0-1F12-000041CCB35A'의 내용이 null이 아니면 두 번째 쿼리는 테이블 끝까지 계속 검색합니다. FileID에 고유 한 제한 조건이 있습니까? 그렇지 않다면 당신은 쿼리 optimiser에게 테이블의 어딘가에서이 fileID를 가진 다른 행이있을 것이라고 말했을 것입니다. 텐트를 떠날 때 유명한 탐험가의 말처럼 .... 나는 약간의 시간 .... 쿼리 계획이 HTH

SSMS, 쿼리, 쇼 쿼리 계획

에 다음 어디 당신의 확실하지 않은 경우에는

수 있습니다

+0

둘 다 동일한 실행 계획을 가지고 있습니다 (하나는'CONTENT IS NULL'을위한 추가 필터가 있습니다.) http://i.imgur.com/nJ7gjXa.png. 차이점은 때로는 첫 번째 쿼리가 완료되는 데 25 분이 걸릴 수도 있다는 것입니다 (그리고 확인했습니다. 이미지의 실행 계획과 동일합니다). 두 번째 것은 항상 빠릅니다. – Kevin

+0

고유 한 filedid 제약이 있습니까? –

+0

예 하나 있음 – Kevin