Время ожидания запроса SQL Server - PullRequest
0 голосов
/ 13 декабря 2011

Я создал запрос 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 Ответ

1 голос
/ 13 декабря 2011

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