Sql 使用 WHERE 子句的视图运行速度比原始查询慢
Sql View with WHERE clause runs slower than a raw query
这在恒定时间内运行:
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 子句?有没有办法加快第二个查询? (不应用索引)
Why this happens? Does the view retrieve all records and then apply Where clause?
是的,在这种特殊情况下,SQL 服务器将首先执行原始基础查询,然后在该中间结果之上应用 WHERE
过滤器。
Is there a way to speed up the second query? (without applying indexes)
SQL 视图通常与底层查询一样执行。因此,如果 Barcode
是过滤掉许多记录的好方法,那么向 Barcode
添加索引是可行的方法。除此之外,您可以做很多事情来加快查看速度。
一个选择是创建一个 具体化 视图,它基本上只是一个 table,其数据由您的视图查询生成。从物化视图中选择所有记录,没有额外的限制,速度应该只受数据传输时间的限制。
这在恒定时间内运行:
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 子句?有没有办法加快第二个查询? (不应用索引)
Why this happens? Does the view retrieve all records and then apply Where clause?
是的,在这种特殊情况下,SQL 服务器将首先执行原始基础查询,然后在该中间结果之上应用 WHERE
过滤器。
Is there a way to speed up the second query? (without applying indexes)
SQL 视图通常与底层查询一样执行。因此,如果 Barcode
是过滤掉许多记录的好方法,那么向 Barcode
添加索引是可行的方法。除此之外,您可以做很多事情来加快查看速度。
一个选择是创建一个 具体化 视图,它基本上只是一个 table,其数据由您的视图查询生成。从物化视图中选择所有记录,没有额外的限制,速度应该只受数据传输时间的限制。