2015-03-17 2 views
-2

Вот мой код:Мой запрос занимает много времени

SELECT SpecieCode AS [Species] 
    ,InventoryGrade AS [Grade] 
    ,(
     SELECT Sum(SquareFeet) 
     FROM Export AS Export1 
     WHERE isnull(Export1.SpecieCode, '') = isnull(Export.SpecieCode, '') 
      AND isnull(Export1.InventoryGrade, '') = isnull(Export.InventoryGrade, '') 
      AND isnull(OrderNumber, '') = '' 
      AND isnull(InvoiceNumber, '') = '' 
      AND isnull(FaceClipDate, '') = '' 
      AND isnull(ShowNumber, '') = '' 
     ) AS [SqFt Avail] 
    ,(
     SELECT Sum(SquareMeters) 
     FROM Export AS Export1 
     WHERE isnull(Export1.SpecieCode, '') = isnull(Export.SpecieCode, '') 
      AND isnull(Export1.InventoryGrade, '') = isnull(Export.InventoryGrade, '') 
      AND isnull(OrderNumber, '') = '' 
      AND isnull(InvoiceNumber, '') = '' 
      AND isnull(FaceClipDate, '') = '' 
      AND isnull(ShowNumber, '') = '' 
     ) AS [SqMt Avail] 
    ,(
     SELECT Sum(SquareFeet) 
     FROM Export AS Export1 
     WHERE isnull(Export1.SpecieCode, '') = isnull(Export.SpecieCode, '') 
      AND isnull(Export1.InventoryGrade, '') = isnull(Export.InventoryGrade, '') 
      AND isnull(InvoiceNumber, '') = '' 
      AND isnull(OrderNumber, '') > '' 
     ) AS [SqFt on Order] 
    ,(
     SELECT Sum(SquareMeters) 
     FROM Export AS Export1 
     WHERE isnull(Export1.SpecieCode, '') = isnull(Export.SpecieCode, '') 
      AND isnull(Export1.InventoryGrade, '') = isnull(Export.InventoryGrade, '') 
      AND isnull(InvoiceNumber, '') = '' 
      AND isnull(FaceClipDate, '') = '' 
      AND isnull(OrderNumber, '') > '' 
     ) AS [SqMt on Order] 
    ,(
     SELECT Sum(SquareFeet) 
     FROM Export AS Export1 
     WHERE isnull(Export1.SpecieCode, '') = isnull(Export.SpecieCode, '') 
      AND isnull(Export1.InventoryGrade, '') = isnull(Export.InventoryGrade, '') 
      AND isnull(InvoiceNumber, '') = '' 
      AND isnull(OrderNumber, '') = '' 
      AND isnull(FaceClipDate, '') = '' 
      AND isnull(ShowNumber, '') > '' 
     ) AS [SqFt on Show] 
    ,(
     SELECT Sum(SquareMeters) 
     FROM Export AS Export1 
     WHERE isnull(Export1.SpecieCode, '') = isnull(Export.SpecieCode, '') 
      AND isnull(Export1.InventoryGrade, '') = isnull(Export.InventoryGrade, '') 
      AND isnull(InvoiceNumber, '') = '' 
      AND isnull(Ordernumber, '') = '' 
      AND isnull(FaceClipDate, '') = '' 
      AND isnull(ShowNumber, '') > '' 
     ) AS [SqMt on Show] 
    ,(
     SELECT Sum(SquareMeters) 
     FROM Export AS Export1 
     WHERE isnull(Export1.SpecieCode, '') = isnull(Export.SpecieCode, '') 
      AND isnull(Export1.InventoryGrade, '') = isnull(Export.InventoryGrade, '') 
      AND isnull(Export1.InvoiceNumber, '') = '' 
      AND isnull(FaceClipDate, '') = '' 
     ) AS [Tot SqMt] 
    ,Max(SubGrade) AS SubGrade 
    ,Min(ShortLength) AS Short 
    ,Max(Length) AS Long 
    ,Max(InventoryRow) AS Location 
FROM Export 
WHERE Export.SpecieCode = '01' 
    AND isnull(Export.InvoiceNumber, '') = '' 
    AND isnull(FaceClipDate, '') = '' 
GROUP BY SpecieCode 
    ,InventoryGrade 
ORDER BY SpecieCode 
    ,InventoryGrade 

Запрос в настоящее время занимает несколько минут, чтобы бежать. Я могу что-то сделать, чтобы ускорить его? Анализатор не предлагает добавлять какие-либо индексы.

+1

Что показывает план выполнения как основное узкое место? –

+0

7 потоковых агрегатов – elvisbsu

+0

Попробуйте удалить все эти надоедливые подзапросы, убедитесь, что у вас все * правые индексы на месте ..... извините, что это waaaay слишком широкий, чтобы ответить - нам нужны структуры таблиц, план выполнения, данные это в таблицах - настройка запросов SQL Server - непростая задача .... –

ответ

1

В дополнение к ответам Симо и Вениамина, вы должны проверить this question about sargable queries. Короче говоря, говоря что-то вроде where IsNull(MyColumn,'') = '', вы убиваете способность анализатора запросов найти хороший индекс, если таковой существует, поскольку индекс IsNull(MyColumn,'') не может быть. Если вы должны переписать это как where (MyColumn is null or MyColumn = ''), то вы, вероятно, получите лучшую производительность, так как анализатор запросов с большей вероятностью найдет хороший индекс.

+0

спасибо DeadZone! – elvisbsu

0

Ваши результаты были, вероятно, неправильными из-за того, что в одном из столбцов появились нули, поэтому вы, возможно, перешли за борт, обернув каждый столбец isnull. По моему опыту, только некоторые столбцы, вероятно, содержат нули или могут испортить ваши результаты с помощью нулей. В противном случае (оставляя во всех isnulls) запрос займет время.

Вы, вероятно, следует использовать, если var1 равно нулю вместо ISNULL (что-то, '') = '' , когда я попытался это:

declare @i1 int=0 
declare @a2 varchar(20) 
set @a2 = null 
begin 
if ISNULL(@a2,'')='' set @i1 +=1 
end 
go 1000 

против

declare @i1 int=0 
    declare @a2 varchar(20) 
    set @a2 = null 
    begin 
    if @a2 is null set @i1 +=1 
    end 
    go 1000 

Второй тест взяли 18 секунд против 35 секунд для первого типа сравнения.

0

У вас есть несколько подзапросов в списке SELECT, и многие из них не нужны. Вы могли бы хотя бы попытаться немного оптимизировать запрос с предложениями CASE. Примечание: вы должны проверить результаты и, возможно, использовать только части этого запроса в зависимости от ваших данных.

SELECT Export.SpecieCode AS [Species] 
    ,Export.InventoryGrade AS [Grade] 
    ,sum(CASE WHEN 
      isnull(OrderNumber, '') = '' 
      AND isnull(InvoiceNumber, '') = '' 
      AND isnull(FaceClipDate, '') = '' 
      AND isnull(ShowNumber, '') = '' 
     THEN Export1.SquareFeet ELSE 0 END) AS [SqFt Avail] 
    ,sum(CASE WHEN 
      isnull(OrderNumber, '') = '' 
      AND isnull(InvoiceNumber, '') = '' 
      AND isnull(FaceClipDate, '') = '' 
      AND isnull(ShowNumber, '') = '' 
     THEN Export1.SquareMeters ELSE 0 END) AS [SqMt Avail] 
    ,sum (CASE WHEN 
      isnull(Export1.SpecieCode, '') = isnull(Export.SpecieCode, '') 
      AND isnull(Export1.InventoryGrade, '') = isnull(Export.InventoryGrade, '') 
      AND isnull(InvoiceNumber, '') = '' 
      AND isnull(OrderNumber, '') > '' 
     THEN Export1.SquareFeet ELSE 0 END) AS [SqFt on Order] 
    ,sum (CASE WHEN 
      isnull(Export1.SpecieCode, '') = isnull(Export.SpecieCode, '') 
      AND isnull(Export1.InventoryGrade, '') = isnull(Export.InventoryGrade, '') 
      AND isnull(InvoiceNumber, '') = '' 
      AND isnull(FaceClipDate, '') = '' 
      AND isnull(OrderNumber, '') > '' 
     THEN Export1.SquareMeters ELSE 0 END) AS [SqMt on Order] 
    ,sum(CASE WHEN 
      isnull(Export1.SpecieCode, '') = isnull(Export.SpecieCode, '') 
      AND isnull(Export1.InventoryGrade, '') = isnull(Export.InventoryGrade, '') 
      AND isnull(InvoiceNumber, '') = '' 
      AND isnull(OrderNumber, '') = '' 
      AND isnull(FaceClipDate, '') = '' 
      AND isnull(ShowNumber, '') > '' 
     THEN Export1.SquareFeet ELSE 0 END) AS [SqFt on Show] 
    ,sum(CASE WHEN 
      isnull(Export1.SpecieCode, '') = isnull(Export.SpecieCode, '') 
      AND isnull(Export1.InventoryGrade, '') = isnull(Export.InventoryGrade, '') 
      AND isnull(InvoiceNumber, '') = '' 
      AND isnull(Ordernumber, '') = '' 
      AND isnull(FaceClipDate, '') = '' 
      AND isnull(ShowNumber, '') > '' 
     THEN Export1.SquareMeters ELSE 0 END) AS [SqMt on Show] 
    ,sum(CASE WHEN 
      isnull(Export1.SpecieCode, '') = isnull(Export.SpecieCode, '') 
      AND isnull(Export1.InventoryGrade, '') = isnull(Export.InventoryGrade, '') 
      AND isnull(Export1.InvoiceNumber, '') = '' 
      AND isnull(FaceClipDate, '') = '' 
     THEN Export1.SquareMeters ELSE 0 END) AS [Tot SqMt] 
    ,Max(Export.SubGrade) AS SubGrade 
    ,Min(Export.ShortLength) AS Short 
    ,Max(Export.Length) AS Long 
    ,Max(Export.InventoryRow) AS Location 
FROM Export 
JOIN Export AS Export1 ON isnull(Export1.SpecieCode, '') = isnull(Export.SpecieCode, '') 
      AND isnull(Export1.InventoryGrade, '') = isnull(Export.InventoryGrade, '') 
WHERE Export.SpecieCode = '01' 
Смежные вопросы