我的查询需要很长时间

时间:2015-03-17 17:59:13

标签: sql-server

这是我的代码:

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

查询当前需要几分钟才能运行。有什么办法可以加快速度吗?分析器不建议添加任何索引。

3 个答案:

答案 0 :(得分:1)

除了Simo和Benjamin给出的答案之外,你应该看看this question about sargable queries。简而言之,通过说where IsNull(MyColumn,'') = ''之类的内容,你会破坏查询分析器查找好索引的能力(如果存在),因为IsNull(MyColumn,'')上没有索引。如果您将其重写为where (MyColumn is null or MyColumn = ''),那么您可能会获得更好的性能,因为查询分析器更有可能找到一个好的索引。

答案 1 :(得分:0)

您的结果可能不正确,因为其中一列中出现空值,因此您可能通过使用isnull包装每个列而过火。根据我的经验,只有某些列可能包含空值,或者通过包含空值来破坏结果。否则(留在所有isnull中)查询将花费时间。

你可能应该使用如果var1为null而不是isnull(某事,'')='' 当我尝试这个时:

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

VS

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

对于第一种比较,第二次测试耗时18秒对35秒。

答案 2 :(得分: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'
相关问题