`

Oracle 统计信息

 
阅读更多
--Oracle 优化器统计信息

Oracle优化器统计信息描述了关于数据库和相关对象的统计信息,当执行SQL查询时,优化器会使用这些统计信息估算出各种不同的执行计划的资源消耗,
,从而选择最高效的执行计划。当统计信息缺失或者陈旧时,Oracle可能会选择错误的执行计划,导致SQL执行效率低下。

优化器统计信息包括以下部分:

表级别统计信息
1. 数据行数
2. 数据块数。
3. 每行的长度

--相关性能视图
admin@ORCL> SELECT NUM_ROWS, BLOCKS, AVG_ROW_LEN  FROM USER_TABLES  WHERE TABLE_NAME = 'T';

  NUM_ROWS     BLOCKS AVG_ROW_LEN
---------- ---------- -----------
     14301        200         102


字段的统计信息
1. 唯一值的个数。
2. 空值的个数
3. 数据分布情况(直方图)
4. 相关列统计信息(Extended statistics)

admin@ORCL> SELECT NUM_DISTINCT,NUM_NULLS,HISTOGRAM FROM USER_TAB_COL_STATISTICS WHERE TABLE_NAME = 'T' AND COLUMN_NAME = 'OWNER';

NUM_DISTINCT  NUM_NULLS HISTOGRAM
------------ ---------- ---------------
          10          0 FREQUENCY


admin@ORCL> SELECT * FROM USER_TAB_HISTOGRAMS WHERE TABLE_NAME = 'T' AND COLUMN_NAME = 'OWNER';

TABLE COLUMN_NAME          ENDPOINT_NUMBER ENDPOINT_VALUE ENDPOINT_ACTUAL_VALU
----- -------------------- --------------- -------------- --------------------
T     OWNER                             13     3.3888E+35
T     OWNER                             15     3.3913E+35
T     OWNER                             39     3.5442E+35
T     OWNER                             41     4.1186E+35
T     OWNER                             43     4.1192E+35
T     OWNER                           1379     4.1711E+35
T     OWNER                           4885     4.3277E+35
T     OWNER                           5102     4.3277E+35
T     OWNER                           5208     4.5330E+35
T     OWNER                           5508     4.5831E+35


索引统计信息

1. 索引叶子块的个数
2. 索引的高度(Levels)
3. 集群因子(Clustering Factor)

admin@ORCL> SELECT BLEVEL,LEAF_BLOCKS,CLUSTERING_FACTOR FROM DBA_INDEXES WHERE INDEX_NAME = 'IDX_T';

    BLEVEL LEAF_BLOCKS CLUSTERING_FACTOR
---------- ----------- -----------------
         1          61             28600

系统级别的统计信息
1. I/O 执行性能和消耗
2. CPU 执行性能和消耗



Oracle会根据以上的统计信息来计算每种执行计划的Cost,然后选择Cost最小的执行计划(即CBO)。Cost是Oracle对执行计划消耗的计算指标。
CBO的计算模型是Oracle内部的,目前是没有公布的,而且Oracle的计算模型是十分复杂的,我们只能依据一些实验来答题猜测CBO的计算模型。


admin@ORCL> CREATE TABLE T1 AS
   SELECT
     TRUNC(DBMS_RANDOM.VALUE(0,25)) N1,
     RPAD('X',40) IND_PAD,
     TRUNC(DBMS_RANDOM.VALUE(0,20)) N2,
     LPAD(ROWNUM,10,'0') SMALL_VC,
     RPAD('X',200) PADDING
     FROM ALL_OBJECTS
   WHERE ROWNUM<= 10000;

Table created.

--创建索引
admin@ORCL> create index t1_i1 on t1(n1,ind_pad,n2) nologging pctfree 91;

Index created.


admin@ORCL> SELECT
  2  NUM_ROWS,  --记录数
  3  DISTINCT_KEYS, --不重复的键值数
  4  BLEVEL, --索引数的级别
  5  LEAF_BLOCKS, --叶子块数
  6  CLUSTERING_FACTOR, --聚促因子
  7  AVG_LEAF_BLOCKS_PER_KEY,
  8  AVG_DATA_BLOCKS_PER_KEY
  9  FROM USER_INDEXES WHERE TABLE_NAME = 'T1' AND INDEX_NAME = 'T1_I1';

  NUM_ROWS DISTINCT_KEYS     BLEVEL LEAF_BLOCKS CLUSTERING_FACTOR AVG_LEAF_BLOCKS_PER_KEY AVG_DATA_BLOCKS_PER_KEY
---------- ------------- ---------- ----------- ----------------- ----------------------- -----------------------
     10000           500          2        1111              9754                       2                   19

--收集表统计信息
admin@ORCL> exec dbms_stats.gather_table_stats(user,'T1',cascade=>true,method_opt=>'for all columns size 1')

PL/SQL procedure successfully completed.

admin@ORCL> select small_vc from T1 where n1 = 2 and n2 = 3;

13 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 2886394002

-------------------------------------------------------------------------------------
| Id  | Operation                   | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |       |    20 |   340 |    25   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T1    |    20 |   340 |    25   (0)| 00:00:01 |
|*  2 |   INDEX SKIP SCAN           | T1_I1 |    20 |       |     5   (0)| 00:00:01 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("N1"=2 AND "N2"=3)
       filter("N2"=3)

--字段的selectivity
admin@ORCL> select COLUMN_NAME,NUM_DISTINCT from user_tab_col_statistics where table_name = 'T1' and column_name in ('N1','N2');

COLUMN_NAME                    NUM_DISTINCT
------------------------------ ------------
N1                                       25
N2                                       20

第一步的成本:
= blevel+ceil((n1.selectivity*n2.selectivity)*leaf_blocks) = 2+ceil((1/20*1/25)*1111) = 5

第二步的成本

=ceil(n1.selectivity*n2.selectivity*clustering_fact) = 20


通过以上的数据模型可以看出,涉及到Oracle的COST成本包括字段的可选择性(不收集直方图),索引的叶子块数,及索引的集群因子。

关于代价的计算
cost = io cost+cpu cost
主要的代价是io cost,极小部分是cpu cost

全表的计算
1.没有系统统计信息
cost = blocks/k
k是db_file_multiple_read_count的修正值

索引代价的计算

unique scan = blevel +1(1这里指通过索引访问表的代价)
Fast full scan = leaf_blocks/k
index only = blevel+FF*leaf_blocks(只通过索引扫描得到查询的结果,不用访问表数据)
Range scan = blevel+FF*leaf_blocks+FF*clustering(FF*Clustering 指聚簇因子影响索引来访问表的数据)

FF指filter factor,数据的选择率。

 

分享到:
评论

相关推荐

    oracle统计信息高可靠性保障技术

    ### Oracle统计信息高可靠性保障技术知识点详解 #### 一、技术背景与意义 在Oracle数据库管理系统中,查询优化器(Optimizer)的选择对于SQL查询的执行效率至关重要。优化器通过评估不同执行路径的成本来决定最...

    电信设备-一种Oracle统计信息自动收集方法.zip

    Oracle统计信息主要包括表、索引、分区以及列的统计信息。这些数据用于数据库的查询优化过程,帮助系统评估不同查询路径的成本,选择最优执行方案。手动收集统计信息虽然可以确保准确性,但在大数据量或频繁变动的...

    解析:ORACLE性能调整--统计信息的迁移

    统计信息包含表的行数、列的分布情况等,它们被用于Oracle的自动优化器来确定执行查询的最佳方式。 当面临测试环境与生产环境性能差异的问题时,迁移生产系统的统计信息就成为了一个有效的解决方案。以下是实现这一...

    Oracle统计信息的导出导入测试示例详解

    本文将深入探讨Oracle统计信息的导出导入测试,并提供具体的示例。 首先,我们了解两种常见的统计信息导出导入粒度: 1. **Schema级别统计信息的导出导入**:适用于单个模式下的所有对象。Oracle提供了DBMS_STATS...

    结合实例深入讲解oracle中的直方图histogram

    直方图是一种统计图表,在多种领域中都有广泛的应用,它并非Oracle数据库所独有的功能。直方图通常用来描绘一组数据的分布情况,通过一系列相连的矩形表示不同区间的频数或频率。在Oracle数据库中,直方图被用来描述...

    Oracle Statistic 统计信息

    ### Oracle Statistic 统计信息详解 #### 一、Statistic的重要性与作用 在Oracle数据库管理中,**Statistic**起着至关重要的作用。它主要负责收集关于数据库对象的详细信息,并将这些信息存储在数据字典中。这些...

    Oracle 11G统计信息自动收集及调整

    文档里包含Oracle 11G统计信息自动收集及调整,可以使用优化数据库性能,不合理的统计信息会影响数据库性能

    Oracle统计一天内每小时的数据量

    Oracle统计一天内每小时的数据量。在某小时内有数据,该时间段会被统计出来;该时间段内没有交易,该时间段不会被统计出来,默认为0即可

    Oracle更新分析

    #### 一、Oracle统计信息的重要性 Oracle数据库中的统计信息对于提高查询性能至关重要。这些信息是CBO用来评估查询成本并选择最优执行路径的基础。没有准确的统计信息,CBO可能会选择次优的执行计划,从而导致查询...

    使用dbms_stats包手工收集统计信息

    Oracle 数据库中使用 dbms_stats 包手动收集统计信息 在 Oracle 数据库中,dbms_stats 包提供了一种手动收集统计信息的方式,包括基于表、用户和索引的统计信息。通过使用 dbms_stats 包,我们可以手动收集统计信息...

    ORACLE 数据库的统计数据及优化

    - **options参数**:控制Oracle统计的刷新方式。提供了四种预设方法: - `LGATHER`:重新分析整个架构(Schema)。 - `LGATHEREMPTY`:只分析目前还没有统计的表。 - `LGATHERSTALE`:只重新分析修改量超过10%的表...

    oracle 11g 统计信息

    ### Oracle 11g 自动收集统计信息的时间 在Oracle 11g中,自动收集统计信息是一项重要的数据库维护任务,它有助于优化查询性能并确保数据的准确性。本篇文章将详细介绍Oracle 11g如何自动收集统计信息以及如何管理...

    Oracle官方文档阅读方法.pdf

    Oracle Database Reference 文档提供了 Oracle 的所有初始化参数、数据字典、动态性能视图、SQL 脚本、 Oracle 等待事件、 Oracle 统计信息等知识,无需精读。 基于平台的管理部分,Oracle Database Administrator'...

    Oracle Database 19c OCM 学习资料合集

    "Oracle统计信息管理.pdf" 关注的是数据库的统计信息,这对于优化查询性能至关重要。通过学习这部分内容,你可以理解何时收集和更新统计信息,以及如何分析和调整统计策略以提升数据库的整体性能。 总的来说,这个...

    ORACLE统计表记录数

    ORACLE 数据库中如何统计表记录数的过程说明

    oracle 自动收集统计信息 测试

    Oracle 自动收集统计信息测试 Oracle 自动收集统计信息是 Oracle 数据库中的一种功能,可以自动收集数据库中的统计信息,以便提高查询性能和优化数据库性能。在本文中,我们将对 Oracle 自动收集统计信息进行测试,...

    Oracle分组统计

    Oracle 分组统计 Oracle 分组统计是数据库开发中常用的技术之一。它可以根据不同的条件对数据进行分组和聚合统计。分组统计的目的是将数据按照某种条件分组,然后对每个组进行聚合计算,最后输出结果。 分组统计...

    SQL和Oracle中统计数据库中表个数及表名

    在SQL和Oracle数据库管理系统中,有时我们需要统计数据库中包含的表的数量以及获取具体的表名。以下是如何在两者中实现这一目标的详细步骤。 在SQL中,我们通常使用系统对象表来获取相关信息。`sys.objects`是SQL ...

    oracle 表信息统计+表信息分析

    oracle 表信息统计+表信息分析

Global site tag (gtag.js) - Google Analytics