2011-12-13 2 views
0

SQL Server 2008에서 실행되는 SQL 쿼리를 만들었습니다. 어떤 이유로 불완전한 시간이 오래 걸립니다.SQL Server 쿼리 시간이 초과되었습니다.

테스트 용으로 수정 된 쿼리입니다. FileData 열은 varbinary(max)이고 기본 키는 ContentFileId입니다. 보시다시피 저는 단 하나의 특정 레코드를 선택하려고합니다.

SELECT *, 
     CASE 
     WHEN [CMS_tbContentFile].[FileData] IS NULL 
     THEN (
       SELECT [CMS_tbContentFile2].[FileData] 
       FROM [CMS_tbContentFile] AS [CMS_tbContentFile2] 
       WHERE [CMS_tbContentFile2].[ContentFileId] = 2152 
      ) 
     ELSE [CMS_tbContentFile].[FileData] 
     END AS [Test] 
FROM [CMS_tbContentFile] 
WHERE [CMS_tbContentFile].[ContentFileId] = 3054 

자체에 미세 CASE (SELECT [CMS_tbContentFile2].[FileData] FROM [CMS_tbContentFile] AS [CMS_tbContentFile2] WHERE [CMS_tbContentFile2].[ContentFileId] = 2152) 실행에 하위 쿼리, 그리고 메인 쿼리의 일부를 제거하면 메인 쿼리가 잘 실행됩니다. 문제를 일으키는 하위 쿼리와 CASE의 조합 일뿐입니다.

위의 내용을 살펴보면 T-SQL에서 불가능한이 유형의 쿼리와 관련된 문제가 발생할 수 있습니다.

+1

실행 계획을 보았습니까? 그것은 무엇을 말하는가? 또한 최근에 테이블을 업데이트 했습니까? 예 : 많은 데이터가 삽입 되었습니까? 이 경우 해당 테이블에서 [통계 업데이트] (http://msdn.microsoft.com/en-us/library/ms187348.aspx)를 확인하십시오! –

답변

1

어쨌든 많은 정보를 제공하지는 않습니다. 하위 선택은 모든 행에 대해 실행되므로 [CMS_tbContentFile]. [ContentFileId] = 3054 인 1000 개의 필드가있을 때 1000 회 실행할 수 있습니다.

아래 코드를 시도하거나 조인으로 다시 작성하십시오.

declare @field varchar(255) //define here the same type as the [filedata] column has 
select 
    @field = [cms_tbcontentfile2].[filedata] 
from 
    [cms_tbcontentfile] as [cms_tbcontentfile2] 
where 
    [cms_tbcontentfile2].[contentfileid] = 2152 

SELECT 
    *, 
    isnull([CMS_tbContentFile].[FileData], @field) as [Test] 
FROM 
    [CMS_tbContentFile] 
WHERE 
    [CMS_tbContentFile].[ContentFileId] = 3054 
+0

여러 행에 해당하는 경우에도 OP는 사용자가 제안한 1,000 개가 아닌 "특정 레코드 하나만 선택하려고합니다"라고 말합니다. –

+0

감사합니다 @Michal Barcik, 그 대답은 내가 찾고있는 것입니다! 하위 쿼리가 모든 행에 대해 실행된다는 사실을 잊어 버렸습니다. 내 쿼리가 바뀔거야. – johna

관련 문제