【问题标题】:Sql View with WHERE clause runs slower than a raw query带有 WHERE 子句的 Sql 视图运行速度比原始查询慢
【发布时间】:2020-08-06 08:07:35
【问题描述】:

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

 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 子句?有没有办法加快第二次查询? (不应用索引)

【问题讨论】:

标签: sql sql-server query-performance sql-view


【解决方案1】:

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

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

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

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

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

【讨论】:

  • “SQL Server 将首先执行原始的底层查询”——我敢肯定这不是真的,除非有一些东西阻止参数被下推(例如聚合)。在这种情况下,row_number() 会导致它。
  • 那么为什么视图与底层查询的性能没有相同
  • @MitchWheat 感谢您的评论,不知道 RDBMS 会以这种方式优化视图。
猜你喜欢
  • 1970-01-01
  • 2013-07-09
  • 2021-12-12
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 2022-01-09
  • 2016-03-11
  • 1970-01-01
相关资源
最近更新 更多