gpt4 book ai didi

sql - 性能 : View vs. 子选择

转载 作者:行者123 更新时间:2023-12-05 01:47:30 26 4
gpt4 key购买 nike

一点背景:

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

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

1) 每次观看。

我构建了一个 View ,其中包含简单字段 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中连接 View :

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.

那么,一个简单的问题:我应该走哪两种方式,为什么?什么更快,为什么?

最佳答案

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

然而,一些 dbms 提供了特殊的 View ,用于存储实际的查询结果。 Oracle 称这些为物化 View 。这个想法是,如果表的数据在很长一段时间内相当稳定,那么为什么要一次又一次地使用相同的复杂查询。但随后必须考虑何时更新 View 。

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

关于sql - 性能 : View vs. 子选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25603301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com