一点背景:
我有一个包含大量信息的日志表(每周使用我的webaaplication约10,000次)。我有一个位置表,这是我的主表(因此用户可以在我的应用程序中处理位置并可以操作它们等。)
现在我需要一个LastStateChangedDateTime
,所以我在Log中的事件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
并且可以连接我选择的视图:
Select bla, MyView.DateTime
from Positions [Much more joins here]
inner join MyView
on Positions.PositionID = MyView.PositionID
或者
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.
所以,简单的问题:我应该采用哪种方式,为什么?什么更快,为什么?
答案 0 :(得分:4)
陈述是平等的。视图只是查询的定义,也就是说占位符。在另一个Statement中使用它时,视图的名称将替换为实际的语句。所以它是关于可读性和便利性而不是速度。
但是,某些dbms提供了存储实际查询结果的特殊视图。 Oracle将这些物化视图称为。这个想法是,如果表的数据长时间保持不变,那么为什么一次又一次地使用相同的复杂查询。但是,必须考虑何时更新视图。
但如上所述,普通视图只是预编写SQL的名称。