现在的位置: 首页 > 综合 > 正文

oracle高级课程-表分析、约束及表间关系

2013年08月01日 ⁄ 综合 ⁄ 共 2924字 ⁄ 字号 评论关闭

一、表分析
 
1.  表分析,简单的说,就是收集表和索引的信息,CBO根据这些信息决定SQL最佳的执行路径。通过对表的分析,可以产生一些统计信息,通过这些信息oracle的优化程序可以优化。
1)     收集统计信息的目的是为了使基于 CBO的执行计划更加准确。
2)     分析的结果数据[all_tables]有什么用,要看Oracle初始化参数 optimal_mode 怎么设置的。
3)     分析更新表的统计信息,,有可能导致执行计划改变
2.  用analyze或dbms_stats包做统计表的的分析,分析可以判断表的使用情况,比如行迁移情况、表的资料量情况等,如:
1)     select * from all_tables where table_name='TEMP_TABLE';(表名一定要大写)
如果对该表没有做过统计分析,则查询的大部分栏位值都为空
2)     analyze table tableName compute statistics;
执行时间与表的数据量有关
3)     select * from all_tables where table_name=' TEMP_TABLE ';
之前为空的部分字段,现在查询已经有值
3.  oracle的联机文档描述了analyze的做用:
Use the ANALYZE statement to collect non-optimizer statistics, for example, to:
--使用analyze功能可以收集一些没有进行优化的统计信息,例如:
Collect or delete statistics about an index or index partition, table or table partition,
--聚集或删除索引或索引分区,表或表分区
index-organized table, cluster, or scalar object attribute.
--索引表,串,或游标的目标属性等统计信息
Validate the structure of an index or index partition, table or table partition, index-organized table,
--增加下列结构的有效性:索引或索引分区,表或表分区,索引表
cluster, or object reference (REF).
--串,目标参照
Identify migrated and chained rows of a table or cluster.
--鉴别一个表或串中已经被移动的抑或被锁住的列。
 
4.  dbms_stats包的作用主要是替代analyze的收集统计信息这一块的功能,且在这一方面做了相当大程度上的增强。
5.  带有ESTIMATE选项的ANALYZE操作对于一 些表能够产生不正确的结果,尤其是那些取样较小的表。这不是个BUG,而是每个统计取样方法的特性。如果所选取样不能代表整个数据集,你就不能期 待产生正确的统计。
6.  统计分析,在Oracle 10G中能够保存列值的分布信息
7. 在考虑表分析时,需要考虑如下问题:
1)     对一个带索引的表的ANALYZE,将分析其相关索引。
2)     如果你对一个表进行ANALYZE ... ESTIMATE 分析,那么然后在其相关索引上做ANALYZE COMPUTE分析是很明智的。这样可以确保被索引字段的统计是准确的。
3)     分析索引不用到临时表空间
4)     如果分析一个索引而不分析其基表,在这一单一基础上CBO不会被选中如果你需要使用ESTIMATE- 估计(例如,由于时间的限制),建议你在几个不同的取样大小上进行 ANALYZE ... ESTIMATE, 来 确定每个对象的理想的取样大小。总的目标是找到一个能在最短的时间内产生准确的统计的取样大小。较好的开始点是 10% - 15%
5)     进行超过50%的ANALYZE ... ESTIMATE 就会导致/变成ANALYZE ... COMPUTE。
 
表分析原理
Oracle提供两种优化器,CBO(Cost based Optimizer)和RBO(Ruler Based Optimizer)。CBO要基于统计数据
默认情况下,Oracle 11g数据库会自动收集CBO需要的统计数据,默认的是工作日晚上10点至早上6点以及休息日全天;
一般是自上次统计至今数据变化超过10%的表会被自动重新统计;
如果没有分析统计数据,则使用参数 OPTMIZER_DYNAMIC_SAMPLING的默认值,此举往往是低效的;
 
何时需要手动统计
易变化的表发生了删除、清空等操作;
表的体积发生了10%以上的增加时,但我们建议减少时也可以统计
统计的方法是对表进行分析,oracle会同步分析表的列、索引


如何查看表是否被分析过:

Select a.LAST_ANALYZED,a.TABLE_NAME,
  a.NUM_ROWS,a.SAMPLE_SIZE
  from dba_tables a
    where owner = 'XJGL‘  order by a.LAST_ANALYZED desc

如何查看自动收集统计信息的任务
select client_name,status from dba_autotask_client,其中client_name为auto optimizer stats collection的即代表自动收集任务;

方法
1.写ANALYZE语句     2.使用TOAD工具


 

二、约束及表间关系
约束使用经验谈
能定义为NOT NULL的一律定义为NOT NULL,如果确实可能取值为NULL,建议使用默认值后再定义为NOT NULL(如日期型和数字型),此举好处很多;
网络连接速度慢,客户端要求响应时间快的,约束最好放在前台程序实现,反之最好放在后台实现;
由于唯一约束实际上是唯一索引,扫描最快,所以能建议唯一约束的一定要使用唯一约束;
能命名的约束要尽量命名,以便于维护和分析(索引);
CHCEK约束尽量使用NOT NULL,如检索较多,建立位图索引。

DBLINK
   数据库链接是用来在一个数据库中访问另外一个数据库中已经授权的对象, 一般用作分布式数据库接口。
  语法:
CREATE [SHARED][PUBLIC] DATABASE LINK dblink_name
[CONNECT TO [ usrer] [ current_user] IDENTIFIED BY  password] [AUTHENTICATED BY user IDENTIFIED BY password] USING connect_string
 
   使用方法:
 object_name@dblink_name

使用经验
1.序列往往用作代理主键,即一个表的主键应该是联合主键时,采用序列来建立一个代理作为主键,而联合主键往往定义为唯一索引;
2.同义词是用来简化对其他数据库中对象、或者同一数据库中其它模式的对象访问的,往往与DBLink一起使用;
3.如果前端程序采用Java Hibernate框架,原则上应尽量多的使用同义词,并在其模型xml文件中指定表的代理主键id对应的序列,此举会大大简化编程;
4.基于数据库的不同物理地址的数据库接口开发,一个非常简便的方法就是使用dblink+同义词+存储过程+oracle Job,并定义和记录自己的日志。

抱歉!评论已关闭.