性能:视图与子选择

Kov*_*ovu 1 sql view subquery

一点背景:

我有一个包含很多信息的日志表(使用我的 webaaplication 每周大约有 10.000 个条目)。我有一个位置表,它是我的主表(因此用户在我的应用程序中处理位置并可以操作它们等)
现在我想要一个LastStateChangedDateTime, 所以DateTime我在日志中有一个事件的 。

现在我可以通过两种方式做到这一点:

1) 按视图。

我构建了一个视图,其中包含简单字段 PositionID 和 LastStateChangedDateTime:

Select PositionID, Max(DateTime) as LastStateChangedTime from Position 
join Log on CAST(Position.PositionID as NVARCHAR) = Log.Message
where Event = 'PosStateChanged' 
group by PositionID 
Run Code Online (Sandbox Code Playgroud)

并且可以在my which select中连接视图:

Select bla, MyView.DateTime 
from Positions [Much more joins here] 
     inner join MyView 
     on Positions.PositionID = MyView.PositionID
Run Code Online (Sandbox Code Playgroud)

或者

2)每个子选择,这将是:

Select bla, LastChangedDateTime 
from Positions [Much more joins here] 
    inner join (Select PositionID, Max(DateTime) as LastStateChangedTime 
                from Position 
                join Log on CAST(Position.PositionID as NVARCHAR) = Log.Message
                where Event = 'PosStateChanged' AND PositionID = Positions.PositionID
                group by PositionID) etc.etc.
Run Code Online (Sandbox Code Playgroud)

所以,一个简单的问题:我应该走哪条路,为什么?什么更快,为什么?

Tho*_*ner 5

陈述是平等的。视图只是查询的定义,可以说是占位符。当您在另一个 Statement 中使用它时,视图的名称将替换为实际的语句。所以它是关于可读性和便利性的,而不是关于速度的。

然而,一些 dbms 提供了特殊的视图,用于存储实际的查询结果。Oracle 将这些物化视图称为。这个想法是,如果表的数据长时间保持不变,那么为什么要一次又一次地使用相同的复杂查询。但是,必须考虑何时更新视图。

但如前所述,普通视图只是预先编写的 SQL 的名称。