【问题标题】:SQL Server query times outSQL Server 查询超时
【发布时间】:2011-12-13 04:50:17
【问题描述】:

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

这是我为测试目的而修改的查询。 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 中是不可能的?

【问题讨论】:

  • 你看执行计划了吗?它说什么?另外:您最近是否更新了您的表格,例如插入大量数据?在这种情况下,请确保在那张桌子上update your statistics

标签: sql-server-2008 query-timeout


【解决方案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

【讨论】:

  • 即使是多行的情况,OP 也会说“我只是想选择一个特定的记录”,而不是你建议的 1000 个。
  • 谢谢@Michal Barcik,这就是我一直在寻找的答案!我忘记了子查询会为每一行运行。我将更改我的查询。
猜你喜欢
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多