Sql server 我的问题需要很长时间

Sql server 我的问题需要很长时间,sql-server,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.Inv

这是我的密码:

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

查询当前需要几分钟才能运行。我能做些什么来加快速度吗?分析人员不建议添加任何索引。

您的结果可能不正确,因为其中一列中出现了空值,因此您可能在每一列中都使用了isnull。根据我的经验,只有某些列可能包含空值,或者会因为包含空值而弄乱结果。否则(保留所有isNull)查询将需要时间

您可能应该使用if var1为null而不是isnull(something“”)='' 当我尝试这样做时:

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


第二次测试用了18秒,而第一次比较用了35秒。

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'

除了西莫和本杰明给出的答案外,你还应该看看。简言之,如果说
where IsNull(MyColumn,”)='
这样的话,你就扼杀了查询分析器找到一个好索引(如果存在的话)的能力,因为
IsNull(MyColumn,”)上不可能有索引。
。如果您将其重写为
where(MyColumn为null或MyColumn='')
,那么您可能会获得更好的性能,因为查询分析器更有可能找到一个好的索引。

执行计划显示的主要瓶颈是什么?尝试删除所有这些讨厌的子查询,确保所有正确的索引都已准备就绪。。。。。很抱歉,这太宽泛了,无法回答-我们需要表结构、执行计划、表中的数据-SQL Server查询调优不是一件容易的事情。。。。
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'