SQL Server查询超时

时间:2011-12-13 04:50:17

标签: sql-server-2008 query-timeout

我创建了一个在SQL Server 2008上运行的SQL查询。出于某种原因,它需要很长时间,而且时间不完整。

这是我的查询修改以用于测试目的。列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 个答案:

答案 0 :(得分:1)

你并没有向我们提供太多信息,但无论如何:subselect为每一行运行,所以当你有一个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