oracle很详细的讲解

收藏

编号:20190715112024223475    类型:共享资源    大小:45.36MB    格式:PDF    上传时间:2019-07-15
  
0
积分
关 键 词:
oracle 详细 讲解
资源描述:
Tianlesoftware 学习 Oracle Blog: http://blog.csdn.net/tianlesoftware DBA1 群 : 62697716(满 ); DBA2 群 : 62697977(满 ); DBA3 群 : 62697850(满) ; DBA 超级群 : 63306533 DBA4 群: 83829929(满 ); DBA5 群: 142216823 DBA6 群: 158654907 TianleSoftware Oracle 学习手册 版本: v1.0 2011 年 5 月 6 日 说明: 在 Oracle 几年的学习中, 做了很多的实验,也遇到了很多的问题, 在这个 过程中,积累了一些学习 文档。 也更新到了 blog 上。 因为太多,不便于查阅。 根据自己对 Oracle 的理解,把这些 blog 进行了分类,并进行了一些整理, 方便自己的查看 。 这些文档 中有很多内引用 借鉴了前辈们的资料 和 google 上的 一些信息 。 如: eygle,君三思 , 谭怀远 ,陈吉平等前辈们的书籍和 blog。 感谢这些前辈们对中国 DB 事业做出的贡献。 在这里引用的内容也是完全 出于学习。 没有其他用途,如有侵犯到版权的问题,请联系我。 我将删除这些 信息。 对数据库这块也是在不断的学习, 对 oracle 的理解也是在不断的变化。 在这 个过程中,难免有理解错误的地方, 或者内容上遗漏的,如果发现了问题, 烦邮 件给我,我会虚心的学习。 并更新该文档。 PS: 有些内容在排版上不太合适,因为很多也是在后期的整理中加上去的。 以后有空在调整这些内容的排版 了。 2012 年 3 月 9 日 在序 今天又 想起了这个文档,时隔已经快一年,这一年中我在 Blog 上又更新了 很多的文档,加上整理文档也是一件很费时间的事, 所以这本学习手册,一直没 有更新,而且以前的内容 ,很多也有 失误 ,做技术是一件很严谨的事,但是这本 手册,或多或少对刚入门的人来说,还是有一定的帮助,所以暂且转成转成 PDF Tianlesoftware 学习 Oracle Blog: http://blog.csdn.net/tianlesoftware DBA1 群 : 62697716(满 ); DBA2 群 : 62697977(满 ); DBA3 群 : 62697850(满) ; DBA 超级群 : 63306533 DBA4 群: 83829929(满 ); DBA5 群: 142216823 DBA6 群: 158654907 版本,作为 Dave 学习手册的第一版本发布。 如果其中内容有误,也麻烦给我发封 email,我会及时更改这些内容。 Dave 希望能和大家在 Oracle 的路上一起进步。 Email: tianlesoftware@gmail.com Skype: tianlesoftware Blog: http://www.tianlesoftware.com http://blog.csdn.net/tianlesoftware Weibo: http://weibo.com/tianlesoftware Twitter: http://twitter.com/tianlesoftware Facebook: http://www.facebook.com/tianlesoftware Linkedin: http://cn.linkedin.com/in/tianlesoftware 目 录 TIANLESOFTWARE ORACLE 学习手册 . 1 一 . ORACLE 基础知识 . 24 1.1 ORACLE OLAP 与 OLTP 介绍 24 1.1.1 什么是 OLTP . 25 1.1.2 什么是 OLAP . 26 1.1.3 在 OLAP 系统中,常使用分区技术、并行技术 26 1.1.4 分开设计与优化 27 1.2 索引详解 . 28 1.2.1 索引介绍 28 1.2.1.1 索引的创建语法 . 28 1.2.1.2 索引特点 . 28 1.2.1.3 索引不足 . 29 1.2.1.4 应该建索引列的特点 . 29 1.2.1.5 不应该建索引列的 特点 . 29 1.2.1.6 限制索引 . 29 1.2.1.6.1 使用不等于操作符( 、 !=) 下面的查询即使在 cust_rating 列有一个索引,查询语句仍然执行一次全表扫描。 select cust_Id,cust_name from customers where cust_rating create index TT_index on TT(teamid,areacode); 索引已创建。 已用时间 : 00: 02: 03.93 SQL select count(areacode) from tt; COUNT(AREACODE) --------------- 7230369 已用时间 : 00: 00: 08.31 Tianlesoftware 学习 Oracle Blog: http://blog.csdn.net/tianlesoftware DBA1 群 : 62697716(满 ); DBA2 群 : 62697977(满 ); DBA3 群 : 62697850(满) ; DBA 超级群 : 63306533 DBA4 群: 83829929(满 ); DBA5 群: 142216823 DBA6 群: 158654907 SQL select /*+ index(tt TT_index )*/ count(areacode) from tt; COUNT(AREACODE) --------------- 7230369 已用时间 : 00: 00: 07.37 1.2.2 索引分类 Oracle 提供了大量索引选项。知道在给定条件下使用哪个选项对于一个应用 程序的性能来说非常重要。一个错误的选择可能会引发死锁,并导致数据库性能 急剧下降或进程终止。而如果做出正确的选择,则可以合理使用资源,使那些已 经运行了几个小时甚至几天的进程在几分钟得以完成,这样会使您立刻成为一位 英雄。下面就将简单的讨论每个索引选项。 在这里讨论如下 的索引类型: B 树索引 (默认类型 ) 位图索引 HASH 索引 索引组织表索引 反转键 (reverse key)索引 基于函数的索引 分区索引 (本地和全局索引 ) 位图连接索引 1.2.2.1 B 树索引 (默认类型 ) B 树索引在 Oracle 中是一个通用索引。在创建索引时它就是默认的索引类型。 B 树索 引可以是一个列的 (简单 )索引,也可以是组合 /复合 (多个列 )的索引。 B 树索引最多可以包括 32 列。 在 下图 的例子中, B 树索引位于雇员表的 last_name 列上。 这个索引的二元高度为 3; 接下来, Oracle 会穿过两个树枝块 (branch block),到达包含 有 ROWID 的树叶块。在每个 树枝块中,树枝行包含链中下一个块的 ID 号。 树叶块包含 了 索引值 、 ROWID,以及指向前一个和后一个树叶块的 指针 。 Oracle 可以 从两个方向遍历这个二叉树。 B 树索引保存了在索引列上有值的每个数据行的 ROWID 值。 Oracle 不会对索引列上包含 NULL 值的行进行索引 。如果索引是多个列的组合索引,而其 中列上包含 NULL 值,这一行就会处于包含 NULL 值的索引列中,且将被处理为空 (视为 NULL)。 Tianlesoftware 学习 Oracle Blog: http://blog.csdn.net/tianlesoftware DBA1 群 : 62697716(满 ); DBA2 群 : 62697977(满 ); DBA3 群 : 62697850(满) ; DBA 超级群 : 63306533 DBA4 群: 83829929(满 ); DBA5 群: 142216823 DBA6 群: 158654907 技巧 : 索引列的值都存储在索引中。因此, 可以建立一个组合 (复合 )索引,这些索引可以直 接满足查询,而不用访问表。这就不用从表中检索数据,从而减少了 I/O 量。 B-tree 特点 : 适合与大量的增、删、改( OLTP) 不能用包含 OR 操作符的查询; 适合高基数的列(唯一值多) 典型的树状结构; 每个结点都是数据块; 大多都是物理上一层、两层或三层不定,逻辑上三层; 叶子块数据是排序的,从左向右递增; 在分支块和根块中放的是索引的范围; 1.2.2.2 位图索引 位图索引非常适合于决策支持系统 (Decision Support System, DSS)和数据仓 库,它们不应该用于通过事务处理应用程序访问的表。 它们可以使用较少到中等 基数 (不同值的数量 )的列访问非常大的表。尽管位图索引最多可达 30 个列,但 通常它们都只用于少量的列。 例如,您的表可能包含一个称为 Sex 的列,它有两个可能值:男和女。这个 基数只为 2,如果用户频繁地根据 Sex 列的值查询该表,这就是位图索引的基列。 当一个表内包含了多个位图索引时,您可以体会到位图索引的真正威力。如果有 多个可用的位图索引, Oracle 就可以合并从每个位图索引得到的 结果集,快速删 除不必要的数据。 Bitmapt 特点 : 适合与决策支持系统; 做 UPDATE 代价非常高; Tianlesoftware 学习 Oracle Blog: http://blog.csdn.net/tianlesoftware DBA1 群 : 62697716(满 ); DBA2 群 : 62697977(满 ); DBA3 群 : 62697850(满) ; DBA 超级群 : 63306533 DBA4 群: 83829929(满 ); DBA5 群: 142216823 DBA6 群: 158654907 非常适合 OR 操作符的查询; 基数比较少的时候才能建位图索引; 技巧: 对于有较低基数的列需要使用位图索引。性别列就是这样一个例子,它有 两个可能值:男或女 (基数仅为 2)。 位图对于低基数 (少量的不同值 )列来说非常 快 ,这是因为索引的尺寸相对于 B 树索引来说小了很多。因为这些索引是低基 数的 B 树索引,所以非常小,因此您可以经常检索表中超过半数的行,并且仍 使用位图索引。 当大多数条目不会向位图添加新的值时 ,位图索引在批处理 (单用户 )操作中 加载表 (插入操作 )方面通常要比 B 树做得好。当多个会话同时向表中插入行时不 应该使用位图索引,在大多数事务处理应用程序中都会发生这种情况。 示例 下面来看一个示例表 PARTICIPANT,该表包含了来自个人的调查数据。列 Age_Code、 Income_Level、 Education_Level 和 Marital_Status 都包括了各自 的位图索引。 下图 显示了每个直方图中的数据平衡情况,以及对访问每个位图索 引的查询的执行路径。图中的执行路径显示了有多少个位图索引被合并,可以看 出 性能得到了显著的提高。 如 上图 图所示,优化器依次 使用 4 个单独的位图索引,这些索引的列在 WHERE 子句中被引用。每个位图记录指针 (例如 0 或 1),用于指示表中的哪些 行包含位图中的已知值。有了这些信息后, Oracle 就执行 BITMAP AND 操作以 查找将从所有 4 个位图中返回哪些行。该值然后被转换为 ROWID 值,并且查询 继续完成剩余的处理工作。 注意,所有 4 个列都有非常低的基数,使用索引可以 非常快速地返回匹配的行。 Tianlesoftware 学习 Oracle Blog: http://blog.csdn.net/tianlesoftware DBA1 群 : 62697716(满 ); DBA2 群 : 62697977(满 ); DBA3 群 : 62697850(满) ; DBA 超级群 : 63306533 DBA4 群: 83829929(满 ); DBA5 群: 142216823 DBA6 群: 158654907 技巧: 在一个查询中合并多个位图索引后,可以使性能显著提高。位图索引 使用固定长度的数据类型要比可变长度的数据类型好。较大尺寸的块也会提高对 位图索引的 存储和读取性能。 下面的查询可显示索引类型。 SQL select index_name, index_type from user_indexes; INDEX_NAME INDEX_TYPE ------------------------------ ---------------------- TT_INDEX NORMAL IX_CUSTADDR_TP NORMAL B 树索引 作为 NORMAL 列出;而 位图索引 的类型值为 BITMAP。 技巧: 如果要查 询位图索引列表,可以在 USER _INDEXES 视图中查询 index_type 列。 建议不要在一些联机事务处理 (OLTP)应用程序中使用位图索引 。 B 树索引的 索引值中包含 ROWID,这样 Oracle 就可以在行级别上锁定索引。 位图索引存 储为压缩的索引值,其中包含了一定范围的 ROWID,因此 Oracle 必须针对一 个给定值锁定所有范围内的 ROWID。这种锁定类型可能在某些 DML 语句中造 成死锁。 SELECT 语句不会受到这种锁定问题的影响。 位图索引 的使用 限制 : 基于规则的优化器不会考虑位图索引。 当执行 ALTER TABLE 语句并修改包含有位图索引的列时,会使位图索引失 效。 位图索引不包含任何列数据,并且不能用于任何类型的完整性检查。 位图索引不能被声明为唯一索引。 位图索引的最大长度为 30。 技巧: 不要在繁重的 OLTP 环境中使用位图索引 1.2.2.3 HASH 索引 使用 HASH 索引必须要使用 HASH 集群 。建立一个集群或 HASH 集群的同 时,也就定义了一个集群键。这个键告诉 Oracle 如何在集群上存储表。在存储 数据时,所有与这个集群键相关的行都被存储在一个数据库块上。 如果数据都存储在同一个数据库块上, 并且将 HASH 索引作为 WHERE 子 句中的确切匹配, Oracle 就可以通过执行一个 HASH 函数和 I/O 来访问数据 —— 而通过使用一个二元高度为 4 的 B 树索引来访问数据,则需要在检索数据时使 用 4 个 I/O。 如 下图 所示,其中的查询是一个等价查询,用于匹配 HASH 列和确切的值。 Oracle 可以快速使用该值,基于 HASH 函数确定行的物理存储位置。 HASH 索引可能是访问数据库中数据的最快方法,但它也有自身的缺点 。集 Tianlesoftware 学习 Oracle Blog: http://blog.csdn.net/tianlesoftware DBA1 群 : 62697716(满 ); DBA2 群 : 62697977(满 ); DBA3 群 : 62697850(满) ; DBA 超级群 : 63306533 DBA4 群: 83829929(满 ); DBA5 群: 142216823 DBA6 群: 158654907 群键上不同值的数目必须在创建 HASH 集群之前就要知道。需要在创建 HASH 集群的时候指定这个值。 低估了集群 键的不同值的数字可能会造成集群的冲突 (两个集群的键值拥有相同的 HASH 值 )。 这种冲突是非常消耗资源的 。冲突会造 成用来存储额外行的缓冲溢出,然后造成额外的 I/O。如果不同 HASH 值的数目 已经被低估,您就必须在重建这个集群之后改变这个值。 ALTER CLUSTER 命令不能改变 HASH 键的数目。 HASH 集群还可能浪费 空间 。如果无法确定需要多少空间来维护某个集群键上的所有行,就可能造成空 间的浪费。如果 不能为集群的未来增长分配好附加的空间 , HASH 集群可能就 不 是最好的选择 。 如果应用程序经常在集群表上进行全表扫描 , HASH 集群可能也 不是最好的选择 。由于需要为未来的增长分配好集群的剩余空间量,全表扫描可 能非常消耗资源。 在实现 HASH 集群之前一定要小心。您需要全面地观察应用程序,保证在实 现这个选项之前已经了解关于表和数据的大量信息。 通常, HASH 对于一些包含 有序值的静态数据非常有效。 技巧: HASH 索引在有限制条件 (需要指定一个确定的值而不是一个值范围 )的情 况下非常有用。 1.2.2.4 索引组织表 索引组织表会把表的存储结构改成 B 树结构,以表的主键进行排序。这种特 殊的表和其他类型的表一样,可以在表上执行所有的 DML 和 DDL 语句。 由 于 表的特殊结构, ROWID 并没有被关联到表的行上。 对于一些涉及精确匹配和范围搜索的语句,索引组织表提供了一种基于键的 快速数据访问机制。 基于主键值的 UPDATE 和 DELETE 语句的性能也同样得以 提高, 这是因为行在物理上有序。由于键列的值在表和索引中都没有重复, 存储 Tianlesoftware 学习 Oracle Blog: http://blog.csdn.net/tianlesoftware DBA1 群 : 62697716(满 ); DBA2 群 : 62697977(满 ); DBA3 群 : 62697850(满) ; DBA 超级群 : 63306533 DBA4 群: 83829929(满 ); DBA5 群: 142216823 DBA6 群: 158654907 所需要的空间也随之减少。 如果不会频繁地根据主键列查询数据,则需要在索引组织表中的其他列上创 建二级索引。不会频繁根据主键查询表的应用程序不会了解到使用索引组织表的 全部优点。 对于总是通过对主键的精确匹配或范围扫描进行访问的表,就需要考 虑使用索引组 织表。 技巧: 可以在索引组织表上建立二级索引。 1.2.2.5 反转键索引 当载入一些有序数据时,索引肯定会碰到与 I/O 相关的一些瓶颈。在数据载 入期间,某部分索引和磁盘肯定会比其他部分使用频繁得多。为了解决这个问题, 可以把索引表空间存放在能够把 文件物理分割在多个磁盘上的磁盘体系结构上 。 为了解决这个问题, Oracle 还提供了一种反转键索引的方法。如果数据以反 转键索引存储,这些数据的值就会与原先存储的数值相反。这样,数据 1234、 1235 和 1236 就被存储成 4321、 5321 和 6321。 结果就是索引会为 每次新插入 的行更新不同的索引块。 技巧: 如果您的磁盘容量有限,同时还要执行大量的有序载入,就可以使用 反转键索引。 不可以将反转键索引与位图索引或索引组织表结合使用。 因为 不能对位图索 引和索引组织表进行反转键处理。 1.2.2.6 基于函数的索引 可以在表中创建基于函数的索引。如果没有基于函数的索引,任何在列上执 行了函数的查询都不能使用这个列的索引。例如,下面的查询就不能使用 JOB 列上的索引,除非它是基于函数的索引: select * from emp where UPPER(job) = 'MGR'; 下面的查询使用 JOB 列上的索引,但是它将不会返回 JOB 列具有 Mgr 或 mgr 值的行: select * from emp where job = 'MGR'; 可以创建这样的索引,允许索引访问支持基于函数的列或数据 。可以对列表 达式 UPPER(job)创建索引,而不是直接在 JOB 列上建立索引 ,如 : create index EMP$UPPER_JOB on emp(UPPER(job)); 尽管基于函数的索引非常有用,但在建立它们之前必须先考虑下面一些问题: 能限制在这个列上使用的函数吗?如果能 ,能限制所有在这个列上执行的所 有函数吗 是否有足够应付额外索引的存储空间? 在每列上增加的索引数量会对针对该表执行的 DML 语句的性能带来何种影 响? Tianlesoftware 学习 Oracle Blog: http://blog.csdn.net/tianlesoftware DBA1 群 : 62697716(满 ); DBA2 群 : 62697977(满 ); DBA3 群 : 62697850(满) ; DBA 超级群 : 63306533 DBA4 群: 83829929(满 ); DBA5 群: 142216823 DBA6 群: 158654907 基于函数的索引非常有用,但在实现时必须小心。 在表上创建的索引越多, INSERT、 UPDATE 和 DELETE 语句的执行就会花费越多的时间。 注意: 对于优化器所使用的基于函数的索引来说, 必须把初始参数 QUERY _REWRITE _ ENABLED 设定为 TRUE。 示例: select count(*) from sample where ratio(balance,limit) .5; Elapsed time: 20.1 minutes create index ratio_idx1 on sample (ratio(balance, limit)); select count(*) from sample where ratio(balance,limit) .5; Elapsed time: 7 seconds!!! 1.2.2.7 分区索引 分区索引就是简单地把一个索引分成多个片断。通过把一个索引分成多个片 断,可以访问更小的片断 (也更快 ),并且可以把这些片断分别存放在不同的磁盘 驱动器上 (避免 I/O 问题 )。 B 树和位图索引都可以被分区,而 HASH 索引不可以 被分区 。可以有好几种分区方法: 表被分区而索引未被分区 ; 表未被分区而索引 被分区 ; 表和索引都被分区 。不管采用哪种方法, 都必须使用基于成本的优化器 。 分区能够提供更多可以提高性能和可维护性的可能性 有两种类型的分区索引: 本地分区索引 和 全局分区索引 。每个类型都有两个 子类型,有前缀索引和无前缀索引。表各列上的索引可以有各种类型索引的组合。 如果使用了位图索引,就必须是本地索引 。把索引分区最主要的 原因是可以减少 所需读取的索引的大小,另外把分区放在不同的表空间中可以提高分区的可用性 和可靠性。 在使用分区后的表和索引时, Oracle 还支持并行查询和并行 DML。这样就 可以同时执行多个进程,从而加快处理这条语句。 1.2.2.7.1.本地分区索引 (通常使用的索引 ) 可以使用与表相同的分区键和范围界限来对本地索引分区。每个本地索引的 分区只包含了它所关联的表分区的键和 ROWID。本地索引可以是 B 树或位图索 引。如果是 B 树索引,它可以是唯一或不唯一的索引。 这种类型的索引支持分区独立性,这就意味着对于单独的分 区,可以进行增 加、截取、删除、分割、脱机等处理,而不用同时删除或重建索引。 Oracle 自 动维护这些本地索引。 本地索引分区还可以被单独重建,而其他分区不会受到影 响。 ( 1) 有前缀的索引 有前缀的索引包含了来自分区键的键,并把它们作为索引的前导。例如,让 我们再次回顾 participant 表。在创建该表后,使用 survey_id 和 survey_date 这 两个列进行范围分区,然后在 survey_id 列上建立一个有前缀的本地索引,如 下 Tianlesoftware 学习 Oracle Blog: http://blog.csdn.net/tianlesoftware DBA1 群 : 62697716(满 ); DBA2 群 : 62697977(满 ); DBA3 群 : 62697850(满) ; DBA 超级群 : 63306533 DBA4 群: 83829929(满 ); DBA5 群: 142216823 DBA6 群: 158654907 图 所示。这个索引的所有分区都被等价划分,就是说索引的分区都使用表的相同 范围界限 来创建。 技巧: 本地的有前缀索引可以让 Oracle 快速剔除一些不必要的分区。也就是说 没有包含 WHERE 条件子句中任何值的分区将不会被访问,这样也提高了语句 的性能。 ( 2) 无前缀的索引 无前缀的索引并没有把分区键的前导列作为索引的前导列。若使用有同样分 区键 (survey_id 和 survey_date)的相同分区表,建立在 survey_date 列上的索引 就是一个本地的无前缀索引,如 下图 所示。可以在表的任一列上创建本地无前缀 索引,但索引的每个分区只包含表的相应分区的键值。 如果要把无前缀的索引设为唯一索引,这个索引就必须包含分区键的子集。 在这个例子中,我们必须把包含 survey 和 (或 )survey_id 的列进行组合 (只要 survey_id 不是索引的第一列,它就是一个有前缀的索引 )。 技巧: 对于一个唯一的无前缀索引,它必须包含分区键的子集。 Tianlesoftware 学习 Oracle Blog: http://blog.csdn.net/tianlesoftware DBA1 群 : 62697716(满 ); DBA2 群 : 62697977(满 ); DBA3 群 : 62697850(满) ; DBA 超级群 : 63306533 DBA4 群: 83829929(满 ); DBA5 群: 142216823 DBA6 群: 158654907 1.2.2.7.2.全局分区索引 全局分区索引在一个索引分区中包含来自多个表分区的键。一个全局分区索 引的分区键是分区表中不同的或指定一个范围的值。在创建全局分区索引时,必 须定义分区键的范围和值。 全局索引只能是 B 树索引 。 Oracle 在默 认情况下不会维护全局分区索引。 如果一个分区被截取、增加、分割、删除等,就必须重建全局分区索引 ,除非在 修改表时指定 ALTER TABLE 命令的 UPDATE GLOBAL INDEXES 子句。 ( 2) 有前缀的索引 通常,全局有前缀索引在底层表中没有经过对等分区。没有什么因素能限制 索引的对等分区,但 Oracle 在生成查询计划或执行分区维护操作时,并不会充 分利用对等分区。如果索引被对等分区,就必须把它创建为一个本地索引,这样 Oracle 可以维护这个索引,并使用它来删除不必要的分区,如 下图 所示。在该 图的 3 个索引分 区中,每个分区都包含指向多个表分区中行的索引条目。 分区的、全局有前缀索引 技巧 : 如果一个全局索引将被对等分区,就必须把它创建为一个本地索引, 这样 Oracle 可以维护这个索引,并使用它来删除不必要的分区。 ( 2) 无前缀的索引 Oracle 不支持无前缀的全局索引。 1.2.2.8 位图连接索引 位图连接索引是基于两个表的连接的位图索引,在数据仓库环境中使用这种 Tianlesoftware 学习 Oracle Blog: http://blog.csdn.net/tianlesoftware DBA1 群 : 62697716(满 ); DBA2 群 : 62697977(满 ); DBA3 群 : 62697850(满) ; DBA 超级群 : 63306533 DBA4 群: 83829929(满 ); DBA5 群: 142216823 DBA6 群: 158654907 索引改进连接维度表和事实表的查询的性能。创建位图连接索引时,标准方法是 连接索引中常用的维度表和事实表。当用户在一次查询中结合查询事实表和维度 表时,就不需要执行连接,因为在位图连接索引中已经有 可用的连接结果。通过 压缩位图连接索引中的 ROWID 进一步改进性能,并且减少访问数据所需的 I/O 数量。 创建位图连接索引时,指定涉及的两个表。相应的语法应该遵循如下模式: create bitmap index FACT_DIM_COL_IDX on FACT(DIM.Descr_Col) from FACT, DIM where FACT.JoinCol = DIM.JoinCol; 位图连接的语法比较特别,其中包含 FROM 子句和 WHERE 子句,并且引 用两个单独的表。索引列通常是维度表中的描述列 ——就是说,如果维度是 CUSTOMER,并且它的主键是 CUSTOMER_ID,则通常索引 Customer_Name 这样的列。如果事实表名为 SALES,可以使用如下的命令创建索引: create bitmap index SALES_CUST_NAME_IDX on SALES(CUSTOMER.Customer_Name) from SALES, CUSTOMER where SALES.Customer_ID=CUSTOMER.Customer_ID; 如果用户接下来使用指定 Customer_Name 列值的 WHERE 子句查询 SALES 和 CUSTOMER 表,优化器就可以使用位图连接索引快速返回匹配连接 条件和 Customer_Name 条件的行。 位图连接索引的使用一般会受到限制: 1) 只可以索引维度表中的列。 2) 用于连接的列必须是维度表中的主键或唯一约束;如果是复合主键,则 必须使用连接中的每一列。 3) 不可以对索引组织表创建位图连接索引,并且适用于常规位图索引的限 制也适用于位图连接索引。 1.3 分区表 总结 1.3.1. 分区表理论知识 Oracle 提供了分区技术以支持 VLDB(Very Large DataBase)。分区表通过对分 区列的判断,把分区列不同的记录,放到不同的分区中。分区完全对应用透明。 Oracle 的分区表可以包括多个分区, 每个分区都是一个独立的段 ( SEGMENT),可以存放到不同的表空间中 。查询时可以通过查询表来访问各 个分区中的数据,也可以通过在查询时直接指定分区的方法来进行查询。 When to Partition a Table 什么时候需要分区表,官网的 2 个建议如下: ( 1) Tables greater than 2GB should always be considered for partitioning. ( 2) Tables containing historical data, in which new data is added into the newest partition. A typical example is a historical table where only the current month's data is Tianlesoftware 学习 Oracle Blog: http://blog.csdn.net/tianlesoftware DBA1 群 : 62697716(满 ); DBA2 群 : 62697977(满 ); DBA3 群 : 62697850(满) ; DBA 超级群 : 63306533 DBA4 群: 83829929(满 ); DBA5 群: 142216823 DBA6 群: 158654907 updatable and the other 11 months are read only. 在 oracle 10g 中最多支持: 1024k-1 个分区: Tables can be partitioned into up to 1024K-1 separate partitions 联机文档上有关分区表和索引的说明: Partitioned Tables and Indexes http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/partconc.htm #sthref2604 分区提供以下优点: ( 1)由于将数据分散到各个分区中,减少了数据损坏的可能性; ( 2)可以对单独的分区进行备份和恢复; ( 3)可以将分区映射到不同的物理磁盘上,来分散 IO; ( 4)提高可管理性、可用性和性能。 Oracle 10g 提供了以下几种分区类型: ( 1)范围分区( range); ( 2)哈希分区( hash); ( 3)列表 分区( list); ( 4)范围-哈希复合分区( range-hash); ( 5)范围-列表复合分区( range-list)。 Range 分区: Range 分区是应用范围比较广的表分区方式,它是以列的值的范围来做为分 区的划分条件,将记录存放到列值所在的 range 分区中。 如按照时间划分, 2010 年 1 月的数据放到 a 分区, 2 月的数据放到 b 分区, 在创建的时候,需要指定基于的列,以及分区的范围值。 在按时间分区时, 如果某些记录暂无法预测范围,可以创建 maxvalue 分区, 所有不在指定范围内的记录都 会被存储到 maxvalue 所在分区中。 如: create table pdba (id number, time date) partition by range (time) ( partition p1 values less than (to_date('2010-10-1', 'yyyy-mm-dd')), partition p2 values less than (to_date('2010-11-1', 'yyyy-mm-dd')), partition p3 values less than (to_date('2010-12-1', 'yyyy-mm-dd')), partition p4 values less than (maxvalue) ) Hash 分区: 对于那些无法有效划分范围的表,可以使用 hash 分区,这样对于提高性能 还是会有一定的帮助。 hash 分区会将表中的数据平均分配到你指定的几个分区 中,列所在分区是依据分区列的 hash 值自动分配,因此你并不能控制也不知道 Tianlesoftware 学习 Oracle Blog: http://blog.csdn.net/tianlesoftware DBA1 群 : 62697716(满 ); DBA2 群 : 62697977(满 ); DBA3 群 : 62697850(满) ; DBA 超级群 : 63306533 DBA4 群: 83829929(满 ); DBA5 群: 142216823 DBA6 群: 158654907 哪条记录会被放到哪个分区中, hash 分区也可以支持多个依赖列。 如: create table test ( transaction_id number primary key, item_id number(8) not null ) partition by hash(transaction_id) ( partition part_01 tablespace tablespace01, partition part_02
展开阅读全文
  赶蛙网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:oracle很详细的讲解
链接地址:http://www.gwye.com/p-135913.html

copyright@ 2018-2028 赶蛙网版权所有
 ICP备案编号:蜀ICP备19008733号-2

1
收起
展开