什么是物化查询或视图?它在 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
(例如使用ToList
或FirstOrDefault
)时会发生这种情况
当您处于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 中“手动”刷新,它是自动的,但如 docThey are not well-suited for underlying data sets that are frequently updated
中所述
“但结果不会是动态的”描述的是特定的 dbms 实现以上是关于什么是物化查询或视图?它在 ORM 世界中的位置在哪里?的主要内容,如果未能解决你的问题,请参考以下文章