关于物化视图

物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询。这样对整体查询性能的提高,并没有实质上的好处。

1、物化视图的类型:ON DEMAND、ON COMMIT

二者的区别在于刷新方法的不同,ON DEMAND顾名思义,仅在该物化视图“需要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性;而ON COMMIT是说,一旦基表有了COMMIT,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。

2、ON DEMAND物化视图

物化视图的创建本身是很复杂和需要优化参数设置的,特别是针对大型生产数据库系统而言。但Oracle允许以这种最简单的,类似于普通视图的方式来做,所以不可避免的会涉及到默认值问题。也就是说Oracle给物化视图的重要定义参数的默认值处理是我们需要特别注意的。

物化视图的特点:

 (1) 物化视图在某种意义上说就是一个物理表(而且不仅仅是一个物理表),这通过其可以被user_tables查询出来,而得到佐证;   

(2) 物化视图也是一种段(segment),所以其有自己的物理存储属性;     

(3) 物化视图会占用数据库磁盘空间,这点从user_segment的查询结果,可以得到佐证;     

创建语句:create materialized view mv_name as select * from table_name   

默认情况下,如果没指定刷新方法和刷新模式,则Oracle默认为FORCE和DEMAND。
物化视图的数据怎么随着基表而更新?

Oracle提供了两种方式,手工刷新和自动刷新,默认为手工刷新。也就是说,通过我们手工的执行某个Oracle提供的系统级存储过程或包,来保证物化视图与基表数据一致性。这是最基本的刷新办法了。自动刷新,其实也就是Oracle会建立一个job,通过这个job来调用相同的存储过程或包,加以实现。          ON DEMAND物化视图的特性及其和ON COMMIT物化视图的区别,即前者不刷新(手工或自动)就不更新物化视图,而后者不刷新也会更新物化视图,——只要基表发生了COMMIT。     创建定时刷新的物化视图:create materialized view mv_name refresh force on demand start with sysdate next sysdate+1 (指定物化视图每天刷新一次)     上述创建的物化视图每天刷新,但是没有指定刷新时间,如果要指定刷新时间(比如每天晚上10:00定时刷新一次):create materialized view mv_name refresh force on demand start with sysdate next to_date( concat( to_char( sysdate+1,'dd-mm-yyyy'),' 22:00:00'),'dd-mm-yyyy hh24:mi:ss')

3、ON COMMIT物化视图

ON COMMIT物化视图的创建,和上面创建ON DEMAND的物化视图区别不大。因为ON DEMAND是默认的,所以ON COMMIT物化视图,需要再增加个参数即可。需要注意的是,无法在定义时仅指定ON COMMIT,还得附带个参数才行。     创建ON COMMIT物化视图:create materialized view mv_name refresh force on commit as select * from table_name     备注:实际创建过程中,基表需要有主键约束,否则会报错(ORA-12014)

4、物化视图的刷新

刷新(Refresh):指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。刷新的模式有两种:ON DEMAND和ON COMMIT。(如上所述)     刷新的方法有四种:FAST、COMPLETE、FORCE和NEVER。FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE刷新对整个物化视图进行完全的刷新。如果选择FORCE方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。NEVER指物化视图不进行任何刷新。      对于已经创建好的物化视图,可以修改其刷新方式,比如把物化视图mv_name的刷新方式修改为每天晚上10点刷新一次:alter materialized view mv_name refresh force on demand start with sysdate next to_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),' 22:00:00'),'dd-mm-yyyy hh24:mi:ss')   

5、物化视图具有表一样的特征,所以可以像对表一样,我们可以为它创建索引,创建方法和对表一样。
6、物化视图的删除

虽然物化视图是和表一起管理的,但是在经常使用的PLSQL工具中,并不能用删除表的方式来删除(在表上右键选择‘drop’并不能删除物化视图),可以使用语句来实现:drop materialized view mv_name

普通视图和物化视图的区别

普通视图和物化视图根本就不是一个东西,说区别都是硬拼到一起的,首先明白基本概念,普通视图是不存储任何数据的,他只有定义,在查询中是转换为对应的定义SQL去查询,而物化视图是将数据转换为一个表,实际存储着数据,这样查询数据,就不用关联一大堆表,如果表很大的话,会在临时表空间内做大量的操作。

普通视图的三个特征:

1、是简化设计,清晰编码的东西,他并不是提高性能的,他的存在只会降低性能(如一个视图7个表关联,另一个视图8个表,程序员不知道,觉得很方便,把两个视图关联再做一个视图,那就惨了),他的存在未了在设计上的方便性

2、其次,是安全,在授权给其他用户或者查看角度,多个表关联只允许查看,不允许修改,单表也可以同WITH READ ONLY来控制,当然有些项目基于视图做面向对象的开发,即在视图上去做INSTAND OF触发器,就我个人而言是不站同的,虽然开发上方便,但是未必是好事。

3、从不同的角度看不同的维度,视图可以划分维度和权限,并使多个维度的综合,也就是你要什么就可以从不同的角度看,而表是一个实体的而已,一般维度较少(如:人员表和身份表关联,从人员表可以查看人员的维度统计,从身份看,可以看不同种类的身份有那些人或者多少人),其次另一个如系统视图USER_TABLE、TAB、USER_OBJECTS这些视图,不同的用户下看到的肯定是不一样的,看的是自己的东西。
物化视图呢,用于OLAP系统中,当然部分OLTP系统的小部分功能未了提高性能会借鉴一点点,因为表关联的开销很大,所以在开发中很多人就像把这个代价交给定期转存来完成,ORACLE当然也提供了这个功能,就是将视图(或者一个大SQL)的信息转换为物理数据存储,然后提供不同的策略:定时刷还是及时刷、增量刷还是全局刷等等可以根据实际情况进行选择,总之你差的是表,不是视图。


关于在刷新和索引上的区别

他们两个没有联系吧,刷新我不清楚你是否指的是物化视图的刷新,因为刷新的概念很泛,你说到这里我就理解为物化视图的刷新了,上面也已经说了,这是一种策略和方法,其实它是通过对视图关联表上创建相应的LOG,根据日志信息的SQL同步到物化视图中的,一般来说:定时的一般是全局刷,及时的一般是局部刷。
而索引这个说起来就多了,可以说索引专门是一门课程,大概点来说,索引一般有普通索引、位图索引、唯一性索引(还有全文索引啥的,一般不用),其实仔细研究会发现无论是那一种索引都是B+树为基础,并起存放方式和表一样,是以段为单位,只是内部有树关系而已。

1、普通索引是根据B+树找到第一个(索引时有序的),然后以当前为基准,向后顺序找到不符合条件的健值为止。

2、位图是在叶子节点上根据位图种类对叶子节点的值进行01编码存放(如该字段有1、2、3三种值,就会在叶子节点上有三个位图,每个位图根据健值和ROWID顺序存放是否为1、是否为2、是否为3,所以在RBO下统计很快,CBO下一般会认为是普通索引)。

3、也是按照B+树找,只是找到就不再做任何操作,因为是唯一的。
因为B+查找是一个类似表的查询,而且获取到ROWID后还是要回表查询的,所以这个过程的开销要和全表扫描计算那个结果更加快,ORACLE才会选择是走索引还是走全表扫描,当然对于CBO和RBO选择的方式不一样,具体又是很多,CBO要依赖于表的统计信息,RBO是依赖于尝试。

<think>好的,我现在需要回答用户在KingbaseES V8中关于物化视图聚簇操作后索引是否全部失效的问题。首先,我需要理解聚簇操作的基本概念,以及KingbaseES中的具体实现。 聚簇操作通常是指按照某个索引重新排列表的物理存储顺序,以提高查询性能。在PostgreSQL中,类似的CLUSTER命令会将表按照指定的索引重新组织,但这个过程会导致原有的索引变得无效吗?在PostgreSQL的文档中提到,执行CLUSTER后,索引仍然有效,不需要重建。不过用户提到的是KingbaseES V8,可能基于PostgreSQL,但可能有不同的行为。 接下来,我需要查阅KingbaseES V8的官方文档,特别是关于物化视图和聚簇操作的部分。根据用户提供的描述,是否在聚簇后所有索引失效,需要重编译?假设官方文档中有相关说明,或者根据类似数据库的行为推断。 如果KingbaseES的聚簇操作与PostgreSQL类似,那么可能索引不会失效,但需要分析或重建以更新统计信息。不过用户提到的“重编译”可能是指需要重建索引,或者执行某种维护操作让索引重新生效。 此外,物化视图在聚簇操作后,是否会影响其依赖的索引?比如,当物化视图的数据被重新物理排序后,索引的结构是否需要调整?因为索引通常存储指向数据行的指针,如果数据位置改变,索引可能需要更新。但通常数据库管理系统会自动处理这些情况,或者在CLUSTER操作后自动重建索引。 需要确认KingbaseES是否有特殊处理。例如,某些数据库在执行CLUSTER后可能需要手动重建索引,或者自动维护索引。如果用户提到的说法正确,那么聚簇操作后索引会失效,必须重编译。否则,可能该说法有误。 根据经验,大多数情况下,聚簇操作不会导致索引失效,但可能会建议在操作后重新分析或重建索引以优化性能。因此,用户的说法是否正确,需要依据KingbaseES的具体实现。如果官方文档明确说明聚簇后索引失效,需要重编译,那么正确;否则可能不正确。 另外,“重编译”这个术语在数据库中通常指重新编译存储过程或视图,而索引可能需要重建(REBUILD)而不是编译。用户可能将术语混淆了。因此,正确的操作可能是重建索引,而不是重编译。 总结可能的回答结构:先解释聚簇操作,然后说明在KingbaseES中的处理,指出原描述是否正确,可能存在的术语问题,以及正确操作建议。</think>在KingbaseES V8中,关于物化视图聚簇操作后索引状态的描述不完全准确。以下是逐步分析: 1. **聚簇操作的本质** 聚簇(CLUSTER)操作是通过指定索引对表的物理存储顺序进行重组,目的是提高范围查询的性能。**此操作会重写整个表数据并按索引顺序存储**,但**不会自动重建其他索引**。 2. **索引失效的核心原因** 在KingbaseES中,聚簇操作后: - **被选为聚簇键的索引会被隐式重建**(因为数据顺序已与索引一致)。 - **其他索引不会自动更新**,其存储的物理行位置(如CTID)可能已与重组后的数据不匹配,导致索引逻辑失效。 3. **用户描述的问题点** - **正确部分**:聚簇后非聚簇键的索引会失效,需手动维护。 - **需修正部分**: - 术语“重编译”不准确,应为**重建(REBUILD)**。 - 聚簇键对应的索引不会失效。 4. **正确操作建议** 执行聚簇操作后,应按以下步骤处理: ```sql -- 1. 对物化视图执行聚簇(假设使用索引idx_cluster) CLUSTER mat_view USING idx_cluster; -- 2. 重建所有非聚簇索引 REINDEX INDEX idx_other1; REINDEX INDEX idx_other2; ``` 或通过工具自动完成全索引重建。 5. **性能影响与替代方案** - 聚簇操作会锁定表且耗时,建议在维护窗口执行。 - 可考虑定期使用`VACUUM FULL`或`REINDEX`替代部分场景需求。 **结论**:原描述存在术语偏差,但核心问题存在。正确结论应为: **聚簇操作后,只有非聚簇键的索引会失效,需通过`REINDEX`重建以恢复有效性**。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值