Время ожидания запроса SQL Server

Я создал SQL-запрос, который выполняется на SQL Server 2008. По какой-то причине он занимает много времени, а тайм-ауты не завершены.

Это мой запрос, измененный для целей тестирования. Колонка 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 ответ

Решение

Вы не предоставляете нам много информации, но в любом случае: подвыбор выполняется для каждой строки, поэтому, когда у вас есть 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
Другие вопросы по тегам