这是我的代码:
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
查询当前需要几分钟才能运行。有什么办法可以加快速度吗?分析器不建议添加任何索引。
答案 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'