一点背景:
我有一个包含很多信息的日志表(使用我的 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)
所以,一个简单的问题:我应该走哪条路,为什么?什么更快,为什么?
陈述是平等的。视图只是查询的定义,可以说是占位符。当您在另一个 Statement 中使用它时,视图的名称将替换为实际的语句。所以它是关于可读性和便利性的,而不是关于速度的。
然而,一些 dbms 提供了特殊的视图,用于存储实际的查询结果。Oracle 将这些物化视图称为。这个想法是,如果表的数据长时间保持不变,那么为什么要一次又一次地使用相同的复杂查询。但是,必须考虑何时更新视图。
但如前所述,普通视图只是预先编写的 SQL 的名称。
| 归档时间: |
|
| 查看次数: |
3352 次 |
| 最近记录: |