11GConcepts(翻译第七章)SQL(结构化查询语言)(七)

2014-11-24 10:18:21 · 作者: · 浏览: 15
行源流向另外一步。正常情况下,步骤执行的顺序,和计划中顺序相反,所以,你读一个计划要通过从底往上读。Operation列的初始的空格 描述了等级关系。举个例子,如果操作的名字 前面有两个空格,那么这个操作就是 前面有一个空格的操作的子操作。名字前面有一个空格的操作是SELECT语句本身的子操作。

\

在上面图中,树中的每个点作为一个行源,它的意味着 执行计划中的每一步 要么从数据库中检索行,要么从其他一个或多个行源中接收行。SQL引擎执行每个行源入下列:

·黑色盒子的步骤 从数据库的对象中物理检索行。这些步骤叫 access paths(访问路径),或者叫从数据库中检索数据的技术。

O 步骤6 使用了 full table scan 将departments表中的所有行都检索回来了

O 步骤5 使用了 full table scan 将jobs 表中的所有行都检索回来了

O 步骤4 扫描emp_name_ix索引,顺序的扫描扫描开头是字母A的所有key,然后捡回对应的rowid。举个例子。Atkinson关联的rowid是AAAPzRAAFAAAABSAAe。

O 步骤3 从employees表中检索数据,按照步骤4返回的rowid。举个例子,数据库使用rowid AAAPzRAAFAAAABSAAe 去检索 Atkinson的对应行。

·干净盒子表示 对行源的操作

O 步骤2 执行了一个hash join,接受从步骤3 和5的行源,将从步骤5返回行源的每行 join到 步骤 3 中对应的行,然后返回结果行到 步骤 1

举个例子,雇员Atkinson 的行 和job name Stock Clerk进行关联

O 步骤1 执行了另外一个 hash join,接受 步骤2 和6的行源,join 每行,然后返回结果给客户端

在一些执行计划中,步骤是迭代的,且是其他顺序的。之前7-6显示的计划就是迭代的,因为SQL引擎从index移动到表,然后到客户端,并多次重复这些步骤。

在执行期间,数据库从磁盘将数据读到内存(如果数据没在内存的话)。数据库同样会取得所需要的lock和latch来保证数据完整性 并为SQL执行过程中做的任何改变记录日志。SQL语句处理的最终阶段,就是关闭cursor。

How Oracle Database ProcessesDML(Oracle数据库怎样处理DML

绝大部分DML语句都有一个查询组件,在查询中,游标执行后,会将结果放入称之为result set(结果集)的行集。

结果集中的行 可以每次取回一行或一组。在取回阶段,数据库选择行,如果需要,还会排序行。每次取回后会连续检索结果中另外的行,直到最后一行被取回为止。

正常情况下,数据库在最后一行返回之前 是无法确认要检索行的数目。Oracle数据库检索数据来相应fetch call,因此数据库读取的行越多,工作就越多。有一些查询,数据库要求返回第一行越快越好。而其他一些则是先创建整个结果集,然后再返回第一行。

Read Consistency(读一致性)

正常情况下,一个查询检索数据时会用到Oracle数据库读一致性机制。这个机制,使用了 undo 数据 去显示数据之前的版本,保证了一个查询读取的所有数据块 都在一个时间点是一致的。

举一个读一致性的例子,假设一个查询用full table scan 读了100个数据块。这个查询处理前10个块时,另外一个会话使用DML语句对 块75进行了修改。当第一个会话到达 块75时,它发现了改变,以及通过利用undo数据 取回之前旧的,没被第二个会话修改过的版本,这个会在内存中构建一个 块75的 非当前版本。

Data Changes(数据更改)

DML语句修改数据时,通过使用读一致性来获取在修改开始时满足条件的数据。之后,语句会将检索回 当前状态 的数据库,并对其做 需要的修改。数据库会执行其他与数据修改相关的动作,比如产生redo和undo数据。

How Oracle database ProcessesDDL(Oracle数据库如何处理DDL)

Oracle数据库处理DDL不同于DML。举个例子,当你创建一个表,数据库就不会对CREATE TABLE语句进行优化,而是解析完DDL语句,直接执行它。

数据库处理DDL不同的原因是因为它是一种在数据字典中定义一个对象的方式。正常来说,Oracle数据库必须解析和执行许多的recursive SQL(递归SQL)语句 来完成一个DDL语句。

假设你如下面一样创建了一个表:

CREATE TABLE mytable (mycolumn INTEGER);

正常来说,数据库需要运行很多的递归语句来完成前面这个语句。递归语句会执行如下面这些动作:

·在CREATE TABLE语句执行之前发布一个COMMIT

·验证用户是否有创建表的权限

·确定表要放在哪个表空间

·确保该表空间的quota足够

·确保schema中没有重名对象

·在数据字典中插入定义表的行

·如果DDL语句执行成功,发布commit,如果失败 发布rollback;