gpt4 book ai didi

java - 数据库 View 与选择查询?

转载 作者:行者123 更新时间:2023-12-02 02:31:39 25 4
gpt4 key购买 nike

在阅读了 SO/Google 上的其他类似问题后,我发现数据库 View (虚拟/简单 TableView 而不是物化 View )主要用于方便和安全,而不是为了提高速度。有些人说 View 是可重用的并且位于中心位置,但也可以在代码中保留在中心位置

根据我的理解当来自网络服务器时, View 应该比查询稍微好一些。原因是当通过 Web 服务器中的代码执行查询时,查询文本需要在网络上传输,而在 View 中则不然。我相信查询(准备好的语句)和 View 都是预编译的? 。从这个意义上来说也是一样的。 我的理解正确吗?

这个resource说相反

Performance – What may seem like a simple query against a view could turn out to be a hugely complex job for the database engine. That is because each time a view is referenced, the query used to define it, is rerun.

但这对于查询来说也是如此。不是吗?

这个问题适用于简单 View ,而不是物化/索引 View

引用资源是 Is a view faster than a simple query?

Query vs. View

最佳答案

(这里谈论Oracle,因为这是我的知识领域)

View 本身并不是“预编译的”。它们只是存储的文本,因此从概念上讲,当您运行时

select * from my_view

逻辑上等同于

select * from ( [query that defines view] )

关于

“原因是当通过 Web 服务器中的代码执行查询时,查询文本需要在网络上传输,而 View 中的情况并非如此”

这是事实,但您的 Web 服务器和数据库很少被如此糟糕的网络分开,以至于针对 View 的 100 字节查询与针对基表的 500 字节查询会很明显。

最后,关于性能,这取决于 View 。当查询中引用 View 时,可能有两种机制发挥作用。

其中一个是“ View 合并”,我们可以将 View 的文本集成到查询中,就好像 View 从未存在过一样,例如

view:  select * from t
query: select * from my_view where x=1

可以合并到:

select * from t where x=1

因此 View 的文本永远不会被实际执行。

但另一种选择是“ View 解析”,其中 View 足够复杂或包含禁止合并的定义。例如,包含窗口函数的 View :

view:  select t.*, row_number() over ( order by blah ) from t
query: select * from my_view where x=1

不能合并到:

select t.*, row_number() over ( order by blah ) from t
where x=1

因为窗口函数将不再返回相同的结果。 (一个返回整个表的排名,另一个仅返回 x=1 的行的排名)。

因此,在 View 分辨率的情况下,您可以看到性能影响,但这仅仅是因为我们需要保证结果的正确性,而不是通过一般 View 的限制。

关于java - 数据库 View 与选择查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46998878/

25 4 0
文章推荐: java - 通过反射根据字段名称对 List 进行排序