视图索引的机制

一、概述

本文档主要是对视图的索引机制进行说明。包括:术语、索引的机制、视图索引的选项说明。
文档中用到的术语:
更新(Refresh):按F9可以刷新视图的索引。Refresh读视图的索引并刷新用户的屏幕。它不会重建视图的索引。 
重建(Rebuild):按Shift+F9可以重建视图的索引。重建视图索引的操作调用NIF,视图的索引会完全被重新建立。(Refresh只更新未被索引的文档)。


二、索引介绍


Notes的索引由三部分子系统组成:

  • NIF(Notes Indexing Facility)
  • Update
  • Updall

1. NIF(Notes Indexing Facility) 

Notes Indexing Facility简称NIF是Notes用于操作索引的一组函数或功能。大部分的调用是当用户访问服务器时由服务器发起的。 
当用户修改、 删除或增加一个文档,视图会立刻反应出文档的变化。 
当用户修改视图中的文档或切换到另外一个视图时,NIF发现数据库被修改,因此它会强制更新视图索引。如果视图中有很多文档被更新,视图索引的更新可能需要一段时间。 
当视图的左上角出现刷新标志时,说明数据库中包含比展示在屏幕上更新的信息。按F9可以刷新视图。刷新视图将从数据库中读新的视图索引,并刷新用户的屏幕。这个操作同时也会刷新当前的视图。 


2. Update

Update是服务器上持续运行的一个任务,一般是通过notes.ini中的ServerTasks加载。例如: 
ServerTasks=Replica, Router, Update 
Update进程会检查一个视图刷新的请求队列,进行处理。视图刷新的请求一般来源于三个方面: 
复制:当数据库复制后,会在队列中增加一项。 
路由:当路由任务在数据库中添加一个文档,会在队列中增加一项。 
用户:当用户修改数据库并关闭数据库后,会在队列中增加一项。 

Update任务会合并同一任务的多个相同请求。Update大约每15分钟会运行一次,更新视图的索引。 

注意:如果用户在视图索引更新前访问数据库,用户访问的视图将立即更新。 


3. Updall 

Updall是Update的一次性运行版本。它遍历所有的数据库,运行完成后停止,而不是从一个队列中读取请求。和Update一样,它也会更新数据库中的视图索引,不同之处在于:第一,它会更新全文索引(Full Text Index);第二,它会清除deletion Stubs. 


三、导致视图索引刷新或重建的因素 


导致视图索引重建的因素: 
1. 设计修改 
修改了视图选择或列的公式。其它外观的调整(例如列宽)不会造成视图索引的重建。 
2. 视图崩溃(crash) 
3. Shift+F9 

导致视图索引更新的因素: 
1. 复制 
2. 代理 
3. 路由 
4. 用户的对文档的修改 
5. Ctrl+Shift+F9 


四、视图索引何时被刷新 


视图索引的刷新可以分为以下三种情况: 


1. 不定期刷新: 

打开一个数据库视图时,有以下四种刷新频度可选项: 
 
1)"Auto, after first use"视图:
         打开时自动更新。如果视图在最近的更新之后有文档的修改,当用户打开数据库时,视图将自动更新。用户必须等待视图刷新完成后才能打开数据库。 

说明:当update或updall运行于这种类型的视图时,视图自动被更新(up-to-date)。 

2)“Automatic”视图:
        打开时自动更新。 如果视图在最近的更新之后有文档的修改,当用户打开数据库时,视图将自动更新。用户必须等待视图刷新完成后才能打开数据库。 

说明:当update或updall运行于这种类型的视图时,视图自动被更新(up-to-date)。 如果视图索引不存在,update或updall运行时会自动创建视图索引。 

3)“Manual/Background”视图:
        用户打开视图时,视图索引不会刷新。视图总是很快就能打开。用户刷新视图的唯一途径就是通过F9刷新。
        说明:当update或updall运行于这种类型的视图时,视图自动被更新(up-to-date)。 

4). “Automatic - at most once every XX hours”视图:
        如果用户打开视图时,视图超过预定的间隔还没有刷新,视图才被刷新。 
        如果视图在预定的时间间隔内已经被刷新,视图可以立即打开。 
定期的刷新由Chronos任务完成,这种视图可以用于经常有文档修改的大型数据库。当用户打开视图时,他们无需等待视图的刷新,视图可以很快打开(但视图会出现需要刷新的图标)。 

        说明:当update或updall运行于这种类型的视图时,视图自动被更新(up-to-date)。 


2. Update任务(当关闭一个视图时刷新) 


Updall任务刷新一个数据库中的视图,在服务器上持续运行。它维护了一个工作队列,定期检查队列中是否有需要更新的请求。以下三种原因可以生成更新请求: 
- 用户修改了数据库中的文档并关闭数据库 
- 数据库复制后 
- 邮件路由任务增加文档到数据库 

Updall任务会更新数据库中所有曾经打开过的视图,而不管视图的刷新选项是何种类型(对于automatic类型的视图,如果视图索引不存在,将会重建)。通过log_update=2可以观察到数据库中所有被刷新的索引。Update任务是增量更新,因此一般速度很快。 

3. 定期的视图刷新(updall)


Updall缺省会在每天早晨2点定时运行,更新所有的数据库。所有的数据库更新完成后,updall任务结束。 
Updall任务会更新数据库中所有曾经打开过的视图,而不管视图的刷新选项是何种类型(对于automatic类型的视图,如果视图索引不存在,将会重建)。通过log_update=2可以观察到数据库中所有被刷新的索引。 

注意:updall任务也可以通过服务器控制台、服务器远程控制台或操作系统命令运行。
<think>首先,用户的问题是:“我想查找在Oracle中如何给视图创建索引 请问Oracle中视图创建索引方法”。用户正在询问如何在Oracle数据库中为视图创建索引。 现在,我需要回顾系统级指令: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题。 用户提供了几个引用内容: - 引用[1]:讨论了Oracle中视图索引的基本概念,包括视图的定义、作用、语法,以及索引的概念、类型和使用原则。特别提到索引是在表的列上构建的二叉树,影响查询效率。 - 引用[2]:强调了索引用于加快数据查找,特别是对大表,索引是独立于表的数据库对象。 - 引用[3]:概述了视图的优点和创建语法。 - 引用[4]:包括创建索引视图的语法,但特别提到创建索引是在表上进行的。例如:"创建索引:create index indexname on table(column);" - 引用[5]:讨论了Oracle视图和同义词的区别,但没有直接相关索引。 关键点:所有引用都表明索引是创建在表上的,而不是视图上。引用[1]直接说:"索引就是在表的列上构建一个二叉树",引用[2]说:"索引是独立于表的数据库结构",引用[4]给出语法是创建在表上的。 用户的问题是关于为视图创建索引。在Oracle中,实际上不能直接为视图创建索引视图不是一个物理表;它只是一个虚拟表,基于select语句。索引需要在物理表上创建。 在Oracle中,有一种称为“物化视图”(materialized view)的对象,它可以有索引。物化视图是物理存储数据的,所以可以为它创建索引。 用户的问题是针对视图(view),但标准视图不能有索引。因此,我需要澄清这一点,并解释如何为物化视图创建索引。 从引用中,引用[4]提到创建视图是"视图中包含的不是具体的表,而是具体的SQL语句",这强调了视图的虚拟性质。 所以,在我的回答中: - 首先,解释标准视图不能直接创建索引,因为它是虚拟的。 - 然后,介绍物化视图,并说明如何为物化视图创建索引。 - 提供语法示例。 - 确保回答基于引用内容。 回答结构: 1. 澄清概念:说明标准视图不支持索引,因为它不是物理存储的。 2. 引入物化视图:解释物化视图可以存储数据,因此可以创建索引。 3. 提供方法:给出为物化视图创建索引的语法。 4. 引用支持:自然地引用提供的引用内容来支持我的解释。 5. 生成相关问题:在最后添加相关问题。 生成相关问题: - 例如: 1. 什么是Oracle中的物化视图? 2. 如何创建物化视图? 3. 物化视图和普通视图的区别是什么? 4. 索引在Oracle中的工作原理是什么? 使用中文回答。 确保LaTeX格式:虽然这个问题可能不涉及数学公式,但如果提到任何表达式,比如在解释索引结构时,可能需要使用。但这里可能不需要,所以可能避免使用。 最后,回答要可靠:基于我的知识和引用内容。 总结步骤: - 第一步:解释为什么标准视图不能有索引。 - 第二步:介绍物化视图作为替代。 - 第三步:描述如何为物化视图创建索引。 - 第四步:提供示例语法。 - 第五步:添加相关问题。 </think> ### Oracle中为视图创建索引的方法 在Oracle数据库中,标准视图(View)是一种虚拟表,不存储实际数据,它仅封装了一个SELECT查询语句。因此,**标准视图本身无法直接创建索引**,因为索引是基于物理数据结构(如表的列)构建的,用于加速查询性能。引用[1]明确指出:“索引就是在表的列上构建一个二叉树”,而视图“所有数据来自于原表”,这意味着索引必须创建在基础表上,而非视图上[^1]。引用[2]也强调:“索引是独立于表的数据库结构,即表和索引是分开存放的”,这进一步说明索引依赖于物理存储[^2]。 如果需要在视图上实现索引效果,Oracle提供了**物化视图(Materialized View)**作为替代方案。物化视图是物理存储数据的对象,类似于表,因此可以为它创建索引。物化视图定期刷新数据,以保持与基础表的一致性。以下是具体方法: #### 步骤1:创建物化视图 物化视图需要先定义并存储数据。使用`CREATE MATERIALIZED VIEW`语句,并指定刷新机制(如`REFRESH FAST ON COMMIT`)。以下是一个示例: ```sql -- 创建一个物化视图,存储20部门的员工信息 CREATE MATERIALIZED VIEW mv_emp_dept20 REFRESH FAST ON COMMIT AS SELECT employee_id, employee_name, salary FROM employees WHERE department_id = 20; ``` 这里,`REFRESH FAST ON COMMIT`表示在基础表提交事务时自动刷新视图数据。引用[3]提到视图可以“隔离基表结构的改变”,但物化视图通过物理存储提供了更好的性能优化基础[^3]。 #### 步骤2:为物化视图创建索引 一旦物化视图创建完成,就可以像表一样为其列创建索引。使用`CREATE INDEX`语句,指定物化视图名称和列: ```sql -- 在物化视图的employee_id列上创建索引 CREATE INDEX idx_mv_emp_id ON mv_emp_dept20(employee_id); -- 可以创建复合索引(例如,同时索引employee_id和salary) CREATE INDEX idx_mv_emp_composite ON mv_emp_dept20(employee_id, salary); ``` 索引创建后,Oracle会自动使用和维护它,显著提高针对物化视图的查询速度。引用[4]说明:“创建索引的目的是增加操作速度,减少CPU消耗”,但提醒“表中数据修改频率高时不建议建立索引”[^4]。 #### 关键注意事项: - **标准视图的限制**:普通视图(如`CREATE VIEW ... AS SELECT ...`)无法创建索引,因为它没有物理存储。如果直接尝试在视图上运行`CREATE INDEX`,Oracle会报错。 - **物化视图的优势**:物化视图支持索引,适用于大数据量查询场景,但需要额外存储空间和维护开销(如刷新机制)。 - **性能权衡**:索引提升查询速度,但可能影响增删改操作效率。引用[1]建议:“在大表上建立索引才有意义,在where子句后面或者是连接条件上的字段建立索引”[^1]。 - **替代方案**:如果无法使用物化视图,可以在基础表的列上创建索引,这些索引会间接提升视图查询的性能。 总之,Oracle中为视图创建索引的唯一方法是使用物化视图。通过将视图物理化并添加索引,可以结合视图的封装优势和索引的性能提升。引用[5]提到视图可以与其他对象(如同义词)结合使用,但索引操作需在物理层实现[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值