什么是物化查询或视图?它在 ORM 世界中的位置在哪里?

Posted

技术标签:

【中文标题】什么是物化查询或视图?它在 ORM 世界中的位置在哪里?【英文标题】:What is a Materalizing query or View? Where does it fit in ORM world? 【发布时间】:2014-02-20 23:41:51 【问题描述】:

最近我多次遇到物化查询这个术语,很好奇它是什么以及它的作用。

另外,很好奇它如何适应实体框架或 NHibernate 等 ORM 世界。

什么是物化查询或视图?

【问题讨论】:

【参考方案1】:

嗯,具体化查询和具体化查询是不同的概念。

物化视图是一个 db 概念(存在于一些 r-dbms 中),而物化查询是一个 ORM 概念。

实体化视图

视图是一个虚拟表,代表一个查询

这意味着每次查询视图时,都会执行底层查询。

所以视图可以简化代码,但不会提高性能。

物化视图是缓存查询结果的视图(创建“真实表”)。例如,您可以在物化视图上添加索引。

但您不再有动态结果。您必须刷新物化视图才能获得最新的最新结果。 (每次查询 m-view 时不会执行允许创建 m-view 的查询,因此如果 m-views 中使用的表中的数据发生变化,您将无法获得最新数据查询m-view,如果你之前没有刷新过)。

因此性能会好很多,代码会简化,但结果不会是动态的。而如果每次查询m-view都需要刷新,那么就不需要m-view,而是需要一个view。

物化查询(在 EF 中,但其他 ORM 的想法相同):

这只是将 db 查询的结果放入对象的操作。当您“枚举”IQueryable(例如使用ToListFirstOrDefault)时会发生这种情况

当您处于IQueryable 世界中时,您正在数据库方面工作。一旦你实现/枚举,你就在对象方面工作。

例子

获取分页结果(20 行,每行 100 0000)。

如果您在分页之前枚举(在对象世界中进行分页),您将获得来自您的数据库的 100 000 行/100 000 个对象 (argh)。

如果您在分页后枚举(IQueryable 上的Skip / Take),您将在 db 级别进行分页,并仅实现返回的 20 行。哪个“一点点”性能更高。

【讨论】:

我认为这对于 sql server 来说不太正确。您不必刷新索引视图。结果保持动态,但插入和更新速度较慢,因为 sql server 对两个表都进行操作 @Colin 好吧,我们可以说“物化视图”的概念在 sql server 中是不存在的,但是还有一个叫做“索引视图”的概念,它有点不同......但是,是的,这是一个“概念”,每个 r-dbms 的实现可能不同(或存在,或不存在)。 根据 MSDN:“索引视图是已经物化的视图”msdn.microsoft.com/en-us/library/ms190174.aspx @Colin 是的,是的,再次。再说一次,我只是在描述“一般概念”,而不是“特定的 dbms 实现”。总体思路是相同的,您只是不需要在 SQL Server 中“手动”刷新,它是自动的,但如 doc They are not well-suited for underlying data sets that are frequently updated 中所述 “但结果不会是动态的”描述的是特定的 dbms 实现

以上是关于什么是物化查询或视图?它在 ORM 世界中的位置在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle - 物化视图中的视图

Impala:如何在 impala 中创建物化视图?

Oracle 物化视图

PG 物化视图

物化视图

ORA-08103: 对象不再存在 - 物化视图