实际上,可以把索引理解为一种特殊的目录。聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。下面,我们举例来说明一下聚集索引和非聚集索引的区别。
其实,我们的汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字典是以英文字母“a”开头并以“z”结尾的,那么“安”字就自然地排在字典的前部。如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字;同样的,如果查“张”字,那您也会将您的字典翻到最后部分,因为“张”的拼音是“zhang”。也就是说,字典的正文部分本身就是一个目录,您不需要再去查其他目录来找到您需要找的内容。我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。
如果您认识某个字,您可以快速地从自动中查到这个字。但您也可能会遇到您不认识的字,不知道它的发音,这时候,您就不能按照刚才的方法找到您要查的字,而需要去根据“偏旁部首”查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“张”字,我们可以看到在查部首之后的检字表中“张”的页码是672页,检字表中“张”的上面是“驰”字,但页码却是63页,“张”的下面是“弩”字,页面是390页。很显然,这些字并不是真正的分别位于“张”字的上下方,现在您看到的连续的“驰、张、弩”三字实际上就是他们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后再翻到您所需要的页码。我们把这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。
通过以上例子,我们可以理解到什么是“聚集索引”和“非聚集索引”。进一步引申一下,我们可以很容易的理解:每个表只能有一个聚集索引,因为目录只能按照一种方法进行排序。
本文链接
6.1 SQL语句类别
- DDL:数据定义语言语句。这样的语句有CREATE、TRUNCATE和ALTER,它们用于建立数据库中的结构,设置许可等。用户可以使用它们维护Oracle数据词典。
- DML:数据操作语言语句。这些语句可以修改或者访问信息,包括INSERT、UPDATE和DELETE。
- 查询:这是用户的标准SELECT语句。查询是指那么返回数据但是不修改数据的语句,是DML语句的子集。
6.2 怎样执行语句
相对于查询和DML语句,DDL更像是Oracle的一个内部命令。它不是在一些表上生成的查询,而是完成一些工作的命令。例如,如果用户使用:
然而有意思的是,CREATE TABLE语句也可以在其中包含SELECT。我们可以使用:
就像DML可以包含查询一样,DDL也可以这样做。当DDL包含查询的时候,查询部分会像任何其它查询一样接受处理。Oracle执行这些语句的4个步骤,它们是:
- 解析
- 优化
- 行源生成
- 执行语句
对于DDL,通常实际上只会应用第一个和最后一个步骤,它将会解析语句,然后执行它。“优化”CREATE语句毫无意义(只有一种方法可以建立内容),也不需要建立一般的方案(建立表的过程众所周知,已经在Oracle中直接编码)。应该注意到,如果CREATE语句包含了查询,那么就会按照处理其它查询的方式处理这个查询——采用以上所有步骤。
6.2.1 解析
这是Oracle中任何语句处理过程的第一个步骤。解析(parsing)是将已经提交的语句分解,判定它是哪种类型的语句(查询、DML或者DDL),并且在其上执行各种检验操作。
解析过程会执行三个主要的功能:
- 语法检查。这个语句是正确表述的语句么?它符合SQL参考手册中记录的SQL语法么?它遵循SQL的所有规则么?
- 语义分析。这个语句是否正确参照了数据库中的对象,它所引用的表和列存在么?用户可以访问这些对象,并且具有适当的特权么?语句中有歧义么?。
- 检查共享池。这个语句是否已经被另外的会话处理?
以下便是语法错误:
select from where 2
*
ERROR 位于第 1 行:
ORA-00936: 缺少表达式
总而言之,如果赋予正确的对象和特权,语句就可以执行,那么用户就遇到了语义错误;如果语句不能够在任何环境下执行,那么用户就遇到了语法错误。
解析操作中的下一步是要查看我们正在解析的语句是否牵线 些会话处理过。如果处理过,那么我们就很幸运,因为它可能已经存储于共享池。在这种情况下,就可以执行软解析(soft parse),换句话说,可以避免优化和查询方案生成阶段,直接进入执行阶段。这将极大地缩短执行查询的过程。另一方面,如果我们必须对查询进行解析、优化和生成执行方案,那么就要执行所谓的硬解析(hard parse)。这种区别十分重要。当开发应用的时候,我们会希望有非常高的比例的查询进行软解析,以跳过优化/生成阶段,因为这些阶段非常占用CPU。如果我们必须硬解析大量的查询,那么系统就会运行得非常缓慢。
Oracle怎样使用共享池
正如我们已经看到的,当Oracle解析了查询,并且通过了语法和语义检查之后,就会查看SGA的共享池组件,来寻找是否有另外的会话已经处理过完全相同的查询。为此,当Oracle接收到我们的语句之后,就会对其进行散列处理。散列处理是获取原始SQL文本,将其发往一下函数,并且获取一个返回编号的过程。如果我们访问一些V$表,就可以实际看到这些V$表在Oracle中称为动态性能表(dynamic performance tables),服务器会在那里为我们存储一些有用的信息。
可能通过如下方式实现访问V$表:
为用户账号赋予SELECT_CATALOG_ROLE
使用另一个具有SELECT_CATALOG_ROLE的角色(例如DBA)
如果用户不能访问V$表以及V$SQL视图,那么用户就不能完成所有的“试验”,但是掌握所进行的处理非常容易。
试验:观察不同的散列值
(1) 首先,我们将要执行2个对大家来讲意图和目的都相同的查询:
D
-
X
SQL> select * from DUAL;
D
-
X
(2) 我们可以查询动态性能视图V$SQL来查看这些内容,它可以向我们展示刚才运行的2个查询的散列值:
2 where upper(sql_text)='SELECT * FROM DUAL';
SQL_TEXT
------------------------------------------------
HASH_VALUE
----------
select * from DUAL
1708540716
select * from dual
4035109885
通常不需要实际查看散列值,因为它们在Oracle内部使用。当生成了这些值之后,Oracle就会在共享池中进行搜索,寻找具有相同散列值的语句。然后将它找到的SQL_TEXT与用户提交的SQL语句进行比较,以确保共享池中的文本完全相同。这个比较步骤很重要,因为散列函数的特性之一就是2个不同的字符串也可能散列为相同的数字。
注意:
散列不是字符串到数字的唯一映射。
总结到目前为止我们所经历的解析过程,Oracle已经:
- 解析了查询
- 检查了语法
- 验证了语义
- 计算了散列值
- 找到了匹配
- 验证与我们的查询完全相同的查询(它引用了相同的对象)
在Oracle从解析步骤中返回,并且报告已经完成软解析之前,还要执行最后一项检查。最后的步骤就是要验证查询是否是在相同的环境中解析。环境是指能够影响查询方案生成的所有会话设置,例如SORT_AREA_SIZE或者OPTIMIZER_MODE。SORT_AREA_SIZE会通知Oracle,它可以在不使用磁盘存储临时结果的情况下,为排序数据提供多少内存。圈套的SORT_AREA_SIZE会生成与较小的设置不同的优化查询方案。例如,Oracle可以选择一个排序数据的方案,而不是使用索引读取数据的方
Oracle 数据库 10g 提供了多种卸载和加载数据的方法。在本教程中,您将使用 Oracle Data Pump Export 实用程序卸载数据,然后使用 Oracle Data Pump Import 实用程序加载数据。
何为 Oracle Data Pump?Oracle Data Pump 是 Oracle 数据库 10g 的一个新功能,通过它可以对 Oracle 数据库内容实现高速、并行的批量数据和元数据移动。新的公共接口 PL/SQL 程序包 DBMS_DATAPUMP 提供了一个服务器端基础架构,用于快速地移动数据和元数据。Oracle 数据库 10g 包含了使用该接口的新的导出 (expdp) 和导入 (impdp) 客户端。Data Pump Export 和 Import 工具显著增强了性能和功能,例如有可重启性能、灵活的对象选择以及对导出和导入作业的更好监视和控制。由于这些可贵的改进,Oracle 建议您使用 Data Pump 导入和导出客户端,而非原有的导出 (exp) 和导入 (imp) 客户端。
案例MyCompany 正在对其产品系列进行评估,以确定哪些产品最终能够为其带来最大收益。为此,MyCompany 使用了 Data Pump Export 和 Import 工具来卸载和加载他们需要分析的各种数据库对象。Sales History (SH) 模式包含若干表格,此时需要先卸载这些表,然后再将它们加载到其他模式以进行分析。
前提条件开始本教程之前,您应该:
1.完成了教程在 Windows 上安装 Oracle 数据库 10g。
2.下载 datapump.zip 并将其解压缩到您的工作目录 (c:/wkdir) 中。
在本教程中,您可以执行这些文件,或者直接在命令提示符下输入命令。
Data Pump 基于服务器,而不是基于客户端。因此,要以基于服务器的目录路径为参照来访问转储文件、日志文件和 SQL 文件,以便实施相应的文件安全性。Data Pump 要求您将目录路径指定为目录对象。目录对象将名称映射为文件系统上的目录名。
要运行 Data Pump Export 或 Data Pump Import,DBA 或拥有 CREATE ANY DIRECTORY 权限的用户必须先创建目录对象。然后,在您使用 Export 或 Import 时,使用 DIRECTORY 参数指定目录对象。
创建目录对象要创建目录对象,请执行以下步骤:
1.要启动一个 SQL*Plus 会话,请选择开始 > 程序 > Oracle - OraDb10g_home1 > Application Development > SQL Plus。在 User Name 域中输入 system,在 Password 域中输入 oracle,然后单击 OK。
2.
执行以下命令,为本教程创建两个目录:
@c:/wkdir/dir01
dir01.sql 文件包括以下命令:
CREATE DIRECTORY datadir1 AS 'c:/wkdir';CREATE DIRECTORY datadir2 AS 'c:/wkdir';
3.
创建目录对象后,您需要将它们的 READ 和 WRITE 权限授予其他用户。要允许 Oracle 数据库以用户SH 的身份读取和写入 datadir1 和 datadir2 目录中的文件,请执行以下命令:
执行以下命令,为本教程创建两个目录:
@c:/wkdir/dir02
dir02.sql 文件包括以下命令:
CONNECT / AS SYSDBAGRANT READ, WRITE ON DIRECTORY datadir1 TO sh;
GRANT READ, WRITE ON DIRECTORY datadir2 TO sh;
本文链接