带有WHERE子句的Sql View运行速度慢于原始查询



这在恒定时间内运行:

SELECT row_number() OVER (order by PackagingUniqueId) as RowNum, Barcode, pu.PackagingUniqueId,
rd.Name, pu.ComponentBarcode, rrl.ponum, rrl.mfgpart, rrl.new_lot_code, rrl.pno
FROM Trace.dbo.TraceData td
INNER JOIN Trace.dbo.TraceJob tj ON td.Id = tj.TraceDataId
INNER JOIN Trace.dbo.Job j ON tj.JobId = j.Id
INNER JOIN Trace.dbo.[Order] o ON j.OrderId = o.id
INNER JOIN Trace.dbo.PCBBarcode p ON td.PCBBarcodeId = p.Id
INNER JOIN Trace.dbo.TracePlacement tp ON td.Id = tp.TraceDataId
INNER JOIN Trace.dbo.Placement p2 ON p2.PlacementGroupId = tp.PlacementGroupId
INNER JOIN Trace.dbo.Charge c ON p2.ChargeId = c.Id
INNER JOIN Trace.dbo.PackagingUnit pu ON c.PackagingUnitId = pu.Id
INNER JOIN Trace.dbo.RefDesignator rd ON p2.RefDesignatorId = rd.Id
INNER JOIN SpotlightSQL.spot_light_dbo.peel_off_ids po ON po.peel_off_id = pu.PackagingUniqueId
INNER JOIN SpotlightSQL.spot_light_dbo.recv_receipts_log rrl ON rrl.label_id = po.label_id
WHERE p.Barcode = '20092619153'

然而,这一次大约需要7秒:

SELECT * FROM Component WHERE Barcode = '20092619153'

Component是一个SQL视图,它由第一个不带WHERE子句的较长查询组成。

为什么会发生这种情况?视图是否检索所有记录,然后应用Where子句?有没有办法加快第二次查询的速度?(不应用索引(

为什么会发生这种情况?视图是否检索所有记录,然后应用Where子句?

是的,在这种特殊情况下,SQL Server将首先执行原始基础查询,然后在该中间结果之上应用WHERE筛选器。

有没有办法加快第二次查询的速度?(不应用索引(

SQL视图的性能通常与底层查询一样好。因此,如果Barcode是过滤掉许多记录的好方法,那么向Barcode添加索引就是好方法。除此之外,没有什么可以加快视图的速度。

一种选择是创建一个物化视图,它基本上只是一个表,其数据由视图的查询生成。从物化视图中选择所有记录,没有额外的限制,其速度应仅受数据传输时间的限制。

最新更新