`

Oracle 分析表

阅读更多
ANALYZE TABLE SeikyuTbl COMPUTE Statistics FOR TABLE FOR ALL COLUMNS FOR ALL INDEXES ;

一、优化器的优化方式
Oracle的优化器共有两种的优化方式,即基于规则的优化方式(Rule-Based Optimization,简称为RBO)和基于代价的优化方式(Cost-Based Optimization,简称为CBO)。
1、CBO方式:依词义可知,它是看语句的代价(Cost)了,这里的代价主要指Cpu和内存。优化器在判断是否用这种方式时,主要参照的是表及索引的统计信息。统计信息给出表的大小、有少行、每行的长度等信息。这些统计信息起初在库内是没有的,是你在做analyze后才出现的,很多的时侯过期统计信息会令优化器做出一个错误的执行计划,因些我们应及时更新这些信息。在Oracle8及以后的版本,Oracle列推荐用CBO的方式。
2、RBO方式:优化器在分析SQL语句时,所遵循的是Oracle内部预定的一些规则。比如我们常见的,当一个where子句中的一列有索引时去走索引。
我们要明了,不一定走索引就是优的 ,比如一个表只有两行数据,一次IO就可以完成全表的检索,而此时走索引时则需要两次IO,这时对这个表做全表扫描(full table scan)是最好的。
二、优化器的优化模式(Optermizer Mode)
优化模式包括Rule,Choose,First rows,All rows这四种方式:
Rule:不用多说,即走基于规则的方式。
Choolse:默认的情况下Oracle用的便是这种方式。指的是当一个表或或索引有统计信息,则走CBO的方式,如果表或索引没统计信息,表又不是特别的小,而且相应的列有索引时,那么就走索引,走RBO的方式。
First Rows:它与Choose方式是类似的,所不同的是当一个表有统计信息时,它将是以最快的方式返回查询的最先的几行,从总体上减少了响应时间。
All Rows:也就是我们所说的Cost的方式,当一个表有统计信息时,它将以最快的方式返回表的所有的行,从总体上提高查询的吞吐量。没有统计信息则走基于规则的方式。
三、如何设定选用哪种优化模式
1、Sessions级别
通过SQL> ALTER SESSION SET OPTIMIZER_MODE=?;来设定。
2、Instance级别
我们可以通过在init.ora文件中设定OPTIMIZER_MODE=RULE、OPTIMIZER_MODE=CHOOSE、OPTIMIZER_MODE=FIRST_ROWS、OPTIMIZER_MODE=ALL_ROWS去选用以上所提的四种方式,如果你没设定OPTIMIZER_MODE参数则默认用的是Choose这种方式。
3、语句级别
这些需要用到Hint,比如:
SELECT /*+ RULE */ a.userid,b.name,b.depart_name FROM tf_f_yhda a,tf_f_depart b WHERE a.userid=b.userid;
四、与CBO相关统计信息的获取(analyze 与 dbms_stats 使用)
壹、analyze 使用
1、功能
a)搜集和删除索引、表和簇的统计信息
b)验证表、索引和簇的结构
c)鉴定表和簇和行迁移和行联接
d)针对analyze的搜集和删除统计信息功能而言,oracle推荐使用DBMS_STATS包来搜集优化信息,DBMS_STATS可以并行的搜集信息,可以搜集分区表的全局信息,进一步来说,按成本的优化器只会使用DBMS_STATS包所统计出来的信息。
2、可供分析的对象
INDEX:对索引进行分析,分析的结果会放在USER_INDEXES, ALL_INDEXES,或 DBA_INDEXES中
分析的内容:
Depth of the index from its root block to its leaf blocks (BLEVEL)
Number of leaf blocks (LEAF_BLOCKS)
Number of distinct index values (DISTINCT_KEYS)
Average number of leaf blocks for each index value (AVG_LEAF_BLOCKS_PER_KEY)
Average number of data blocks for each index value (for an index on a table) (AVG_DATA_BLOCKS_PER_KEY)
Clustering factor (how well ordered the rows are about the indexed values) (CLUSTERING_FACTOR)
TABLE:对表进行分析,分析的结果会放在USER_TABLES, ALL_TABLES, and DBA_TABLES表中,在分析表的时候,oracle也会分析基于函数的index所引用的表达式
分析的内容:
Number of rows (NUM_ROWS)
Number of data blocks below the high water mark (that is, the number of data blocks that have been formatted to receive data, regardless whether they currently contain data or are empty) (BLOCKS)
Number of data blocks allocated to the table that have never been used (EMPTY_BLOCKS) Average available free space in each data block in bytes (AVG_SPACE)
Number of chained rows (CHAIN_COUNT) Average row length, including the row's overhead, in bytes (AVG_ROW_LEN)
PARTITION | SUBPARTITION:对分区表或索引进行分析
CLUSTER:对簇进行分析,分析的结果会放在ALL_CLUSTERS, USER_CLUSTERS and DBA_CLUSTERS.
compute_statistics_clause
语法:COMPUTE [ SYSTEM ] STATISTICS [for_clause]
对分析对像进行精确的统计,然后把信息存储的数据字典中。可以选择对表或对字段进行分析。
computed和estimated这两种方式的统计数据都被优化器用来影响sql的执行计划
如果指定system选项就只统计系统产生的信息
for_clause FOR TABLE:只统计表 FOR COLUMNS:只统计某个字段 FOR ALL COLUMNS:统计所有字段 FOR ALL INDEXED COLUMNS:统计索引的所有字段
estimate_statistics_clause
ESTIMATE [ SYSTEM ] STATISTICS [for_clause][SAMPLE integer { ROWS | PERCENT }]
只是对部分行做一个大概的统计。适用于大表
SAMPLE:指定具体统计多少行,如果忽略这个参数的话,oracle会默认为1064行
ROWS causes:行数 Oracle to sample integer rows of the table or cluster or integer entries from the index. The integer must be at least 1.
PERCENT causes:百分数
validation_clauses
分析REF或是对像的结构
EG:ANALYZE TABLE employees VALIDATE STRUCTURE CASCADE;
ANALYZE TABLE customers VALIDATE REF UPDATE;
3、分析表的限制
a)不可以分析数据字典表
b)不可以分析扩展表,但可以用DBMS_STATS来实现这个目的
c)不可以分析临时表
d)不可以计算或估计下列字段类型REFs, varrays, nested tables, LOBs (LOBs are not analyzed, they are skipped), LONGs, or object types.
贰、dbms_stats 使用
Dbms_stats是oracle8i新增的程序包,它使统计数据的生成和处理更加方便。
--参数
estimate_percent        --估算抽样百分比
method_opt for table    --只统计表 
for all indexed columns --只统计有索引的表列
for all indexes         --只分析统计相关索引
--创建统计信息历史保留表
sql> exec dbms_stats.create_stat_table(ownname => 'scott',stattab => 'stat_table') ;
pl/sql procedure successfully completed
--导出整个scheme的统计信息
sql> exec dbms_stats.export_schema_stats(ownname => 'scott',stattab => 'stat_table') ;
pl/sql procedure successfully completed
--分析scheme
Exec dbms_stats.gather_schema_stats(
ownname => 'scott',
options => 'GATHER AUTO',
estimate_percent => dbms_stats.auto_sample_size,
method_opt => 'for all indexed columns ',
degree => 6 )
--分析表
sql> exec dbms_stats.gather_table_stats(ownname => 'scott',tabname => 'work_list',estimate_percent => 10,method_opt=> 'for all indexed columns') ;
pl/sql procedure successfully completed
--分析索引
SQL> exec dbms_stats.gather_index_stats(ownname => 'crm2',indname => 'IDX_ADM_PERMISSION_PID_MID',estimate_percent => '10',degree => '4') ;
pl/sql procedure successfully completed
--如果发现执行计划走错,删除表的统计信息
SQL>dbms_stats.delete_table_stats(ownname => 'scott',tabname => 'work_list') ;
pl/sql procedure successfully completed
--导入表的历史统计信息
sql> exec dbms_stats.import_table_stats(ownname => 'scott',tabname => 'work_list',stattab => 'stat_table') ;
pl/sql procedure successfully completed
--如果进行分析后,大部分表的执行计划都走错,需要导回整个scheme的统计信息
sql> exec dbms_stats.import_schema_stats(ownname => 'scott',stattab => 'stat_table');
pl/sql procedure successfully completed
--导入索引的统计信息
SQL> exec dbms_stats.import_index_stats(ownname => 'crm2',indname => 'IDX_ADM_PERMISSION_PID_MID',stattab => 'stat_table')
--检查是否导入成功
SQL> select table_name,num_rows,a.blocks,a.last_analyzed from all_tables a where a.table_name='WORK_LIST';
TABLE_NAME NUM_ROWS BLOCKS LAST_ANALYZED
------------------------------ ---------- ---------- -------------
WORK_LIST 4005 186 2007-10-12 15
叁、analyze dbms_stats 区别
自从Oracle8.1.5引入dbms_stats包,Experts们便推荐使用dbms_stats取代analyze。理由如下
1,dbms_stats可以并行分析
2,dbms_stats有自动分析的功能(alter table monitor )
3,analyze 分析统计信息的不准确some times
如果想分析整个用户或数据库,还可以采用工具包,可以并行分析:Dbms_utility(8i以前的工具包) Dbms_stats(8i以后提供的工具包),如:(以下两个dbms_stats最常用)
dbms_stats.gather_schema_stats(User,estimate_percent=>100,cascade=> TRUE);
dbms_stats.gather_table_stats(User,TableName,degree => 4,cascade => true);
总结:
1、DBMS_STATS的优点
a) 可以并行进行,对多个用户,多个Table
b) 可以得到整个分区表的数据和单个分区的数据。
c) 可以在不同级别上Compute Statistics:单个分区,子分区,全表,所有分区
d) 可以倒出统计信息
e) 可以用户自动收集统计信息
f) 对于分区表,建议使用DBMS_STATS,而不是使用Analyze语句
g) 对于oracle 9里面的External Table,Analyze不能使用,只能使用DBMS_STATS来收集信息
2、DBMS_STATS的缺点
a) 不能Validate Structure
b) 不能收集CHAINED ROWS, 不能收集CLUSTER TABLE的信息,这两个仍旧需要使用Analyze语句
c) DBMS_STATS 默认不对索引进行Analyze,因为默认Cascade是False,需要手工指定为True
五、应用一例:
1、按用户分析
BEGIN                                                                        
DBMS_STATS.GATHER_SCHEMA_STATS(OWNNAME=>   'SCOTT'   ,   CASCADE=>   TRUE); 
END ;                 
2、单表分析
ANALYZE   TABLE   MYTABLE   COMPUTE   STATISTICS;        
获取分析语句:
SELECT   'ANALYZE   TABLE   '||TABLE_NAME||'   COMPUTE   STATISTICS;' FROM   USER_TABLES;        
3、用途举例:
select a.table_name, a.num_rows from user_tables a where a.num_rows = 0;
--统计记录数据为空的表,如果事先未进行数据分析,则统计结果可能会不正确
分享到:
评论

相关推荐

    自动生成oracle数据库表分析语句

    通过分析表和索引,Oracle可以更新统计信息,这些信息将被查询优化器用于选择最佳的执行计划。本文将详细介绍如何自动生成表分析SQL语句和索引分析SQL语句。 #### 表分析语句 表分析语句主要用于更新表的统计信息...

    oracle优化sql执行效率-表分析

    为提高oracle的sql执行效率,优化性能,通过oracle表分析功能进行调整,能加快sql查询效率2倍以上

    Oracle表删除大量数据(千万)后查询变慢问题(原因分析)

    Oracle 表删除大量数据后查询变慢问题分析 在 Oracle 数据库中,如果删除了大量数据(千万级别),...在实际应用中,了解 Oracle 分析表的知识对数据库管理员非常重要,可以帮助他们更好地管理数据库,提高查询效率。

    oracle查询表碎片

    通过对给定的SQL查询语句的分析,我们可以有效地检测Oracle表的碎片情况,并据此采取相应的优化措施。合理管理和优化表碎片不仅可以提高查询性能,还能节省宝贵的存储资源。希望本文能为Oracle数据库管理员提供一定...

    ORACLE表连接方式分析及常见用法

    Oracle会选择一个表作为驱动表,遍历其每一行并与另一个表逐行比较,生成结果集。嵌套循环连接在获取初始结果集时速度快,但对大规模数据处理效率低。 2. 群集连接 (CLUSTER JOIN):在早期版本的Oracle中,群集连接...

    oracle动态性能表分析说明

    本文将深入探讨Oracle动态性能表的结构、功能以及如何使用它们来分析数据库性能。 首先,Oracle动态性能表主要由一系列以“V$”开头的视图组成,如V$SESSION、V$SYSTEM_EVENT、V$BUFFER_CACHE等。每个V$视图代表一...

    Oracle数据库表结构导出工具

    在日常管理和开发过程中,有时我们需要将Oracle数据库的表结构导出为其他格式,便于分析、备份或共享。"Oracle数据库表结构导出工具"就是为此目的设计的实用程序,它能够方便地将表结构转换成易于查看和处理的Excel...

    Oracle临时表空间不足和批处理缓慢问题探讨.pdf

    Oracle 临时表空间不足和批处理缓慢问题探讨 本文探讨了 Oracle 临时表空间不足和批处理缓慢问题的原因和解决方法。通过分析和测试,发现了问题的根源在于应用逻辑方面,具体来说是 SQL 语句的编写问题。通过编写...

    Oracle数据库性能分析

    ### Oracle数据库性能分析 #### 一、Oracle体系结构 Oracle数据库是一个复杂且功能强大的关系型数据库管理系统(RDBMS),其核心组件包括实例和数据库文件。理解Oracle的体系结构对于优化性能至关重要。 - **实例**...

    oracle导出表结构到excel中

    在Oracle数据库管理中,将表结构导出到Excel文件是一个常见的需求,这有助于数据分析、报告制作或数据共享。以下是一个详细的步骤指南,介绍如何完成这个任务。 首先,我们需要准备一个SQL查询来获取所需表的数据...

    Oracle数据库表结构导出工具Excel

    在日常的数据库管理工作中,有时我们需要将数据库的表结构导出到其他格式,如Excel,以便进行数据分析、报表制作或共享给非技术人员。"Oracle数据库表结构导出工具Excel"就是为了解决这样的需求而设计的。 DBExport...

    oracle表结构导word工具

    "Oracle表结构导Word工具"就是为了解决这个问题而设计的,它能够将Oracle数据库中的表结构方便快捷地导出成Word文档,使得信息更易于阅读和共享。 这个工具的核心功能在于自动化生成表结构的详细文档,包括表名、...

    oracle 分析函数学习笔记

    在描述中提到的场景中,有几种不同的方法可以实现数据统计,包括通过程序处理、使用临时表和包、标准SQL的UNION以及Oracle特有的分析函数。每种方法都有其优缺点。例如,程序处理方法与数据库无关,但增加了开发工作...

    Mysql的表对象Sql语句转换单表,转换成Oracle创建表sql

    1. **数据迁移需求分析**:在开始转换之前,了解源MySQL表的结构和数据类型至关重要。这包括表的名称、列名、数据类型、主键、外键、索引、约束等。 2. **SQL语法差异**:MySQL与Oracle之间的主要语法差异包括: -...

    Oracle数据库中大型表查询优化的研究

    在Oracle数据库中,大型表查询优化是一个至关重要的主题,尤其对于处理海量数据的企业级应用而言。Oracle数据库以其高效、稳定和强大的功能著称,但在处理大规模数据时,如果不进行适当的优化,查询性能可能会显著...

    oracle 分析函数

    oracle 分析函数 开发必备 数据库开发工程师

    oracle表空间命令语句大全

    Oracle 表空间命令语句大全提供了 Oracle 数据库管理的重要操作,包括建立表空间、建立 UNDO 表空间、建立临时表空间、改变表空间状态、删除表空间、扩展表空间和查看表空间信息等。这些命令对于 Oracle 数据库管理...

    oracle 常用分析小工具

    至于“oratool”这个文件,很可能是一个自定义的Oracle分析工具,可能包含了上述功能的实现。这样的工具可以帮助数据库管理员简化日常维护工作,提高工作效率。例如,它可能封装了查询表空间、内存区状态的SQL,或者...

    通用查询分析器(Oracle数据查询)

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其强大的功能和高效的...在实际工作中,结合Oracle的数据管理理论,例如索引策略、表空间管理、存储优化等,配合通用查询分析器,能够实现更高效的数据处理。

Global site tag (gtag.js) - Google Analytics