性能:查看与子选择

时间:2014-09-01 10:00:57

标签: sql view subquery

一点背景:

我有一个包含大量信息的日志表(每周使用我的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.

所以,简单的问题:我应该采用哪种方式,为什么?什么更快,为什么?

1 个答案:

答案 0 :(得分:4)

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

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

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