带WHERE子句的Sql视图运行速度比原始查询慢。

问题描述 投票:0回答:1

这是在一个恒定的时间内运行的。

 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'

元件 是一个SQL视图,它由第一个较长的查询组成,不含 在哪里 条款。

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

sql sql-server query-performance sql-view
1个回答
1
投票

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

是的,在这种特殊情况下,SQL Server将首先执行原始的底层查询,然后应用一个 WHERE 在该中间结果的基础上进行过滤。

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

一个SQL视图的性能一般和底层查询的性能一样好。 所以,如果 Barcode 是一个很好的过滤掉许多记录的方法,然后将索引添加到 Barcode 是最好的办法。 除此以外,你也没有什么办法来加快视图的速度。

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

© www.soinside.com 2019 - 2024. All rights reserved.