2011-12-13 126 views
0

我已經創建了SQL Server 2008上運行,出於某種原因,需要很長的時間,超時不完整的SQL查詢。SQL Server查詢超時

這是我爲了測試目的而修改的查詢。列FileDatavarbinary(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/zh-cn/library/ms187348.aspx)! –

回答

1

你不給我們提供太多的信息,但無論如何:子選項爲每一行運行,所以當你有1000個字段,其中[CMS_tbContentFile]。[ContentFileId] = 3054,那麼它可以/將執行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說「我只是試圖選擇一個特定的記錄」,而不是你建議的1000。 –

+0

謝謝@Michal Barcik,那就是我一直在尋找的答案!我忘記了子查詢會針對每一行運行。我會改變我的查詢。 – johna