首页 > 数据库 >【Oracle】CBO统计信息是基于dba_segment 还是dba_tables?

【Oracle】CBO统计信息是基于dba_segment 还是dba_tables?

时间:2023-08-13 19:35:42浏览次数:63  
标签:tables blocks name dba T2 CBO user select

答案是:来自dba_tables

  • 验证过程
    --- 首先创建t2 ,查看当前user_segment以及user_tables信息
create tablespace damondba_tbs01;

create user damondba identified by damondba_tbs01 DEFAULT TABLESPACE damondba_tbs01 quota unlimited on damondba_tbs01;

grant dba  to damondba;

connect damondba/damondba_tbs01@ORCLPDB1;

create table t2 as select * from dba_objects;

select segment_name,bytes/1024/1024 as mb from user_segments;
SALES                        54

-- 查看当前user_segment以及user_tables信息
col table_name for a20;
set lines 200 pages 0;
select table_name,num_rows,blocks,empty_blocks,avg_space ,sample_size,last_analyzed from user_tables;
T2                        72362       1438            0          0       72362 13-AUG-23  <<<<<<<<<<<<<< 表行数- 72362       



col segment_name for a20;
select segment_name,bytes,blocks from user_segments;
SEGMENT_NAME              BYTES     BLOCKS
-------------------- ---------- ----------
T2                     12582912       1536


--- 打开autotrace 并查看 select * from t2 执行计划

--- 因为autotrace会显示结果集,因此这里我用count(*) 来替代全表扫描
SQL> select count(*) from t2;
     72362


Execution Plan
----------------------------------------------------------
Plan hash value: 3321871023

-------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |   392   (1)| 00:00:01 |
|   1 |  SORT AGGREGATE    |      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| T2   | 72362 |   392   (1)| 00:00:01 |   <<<<<<<<<<<<<< 这里row是真实的row,且行数同user_tables一致。
-------------------------------------------------------------------


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
       1410  consistent gets
       1162  physical reads
          0  redo size
        751  bytes sent via SQL*Net to client
        362  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

--- 接下来,我们清空t2,并收集下统计信息,最后重复如上操作


delete t2;

select table_name,num_rows,blocks,empty_blocks,avg_space ,sample_size,last_analyzed from user_tables;
T2                        72362       1438            0          0       72362 13-AUG-23

select segment_name,bytes,blocks from user_segments;
T2                     12582912       1536


Analyze table t2 compute statistics;


select table_name,num_rows,blocks,empty_blocks,avg_space ,sample_size,last_analyzed from user_tables;
T2                            0       1438           98       7943           0 13-AUG-23 <<<<<<<<<<<<<<  numrows = 0
select segment_name,bytes,blocks from user_segments;
T2                     12582912       1536


SQL> set autot on;
SQL> select count(*) from t2;
         0


Execution Plan
----------------------------------------------------------
Plan hash value: 3321871023

-------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |   391   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE    |      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| T2   |     1 |   391   (0)| 00:00:01 |   <<<<<<<<<<<<<< 这里row显示1,(后续验证为什么是1而不是0)
-------------------------------------------------------------------


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
       1410  consistent gets
          0  physical reads
          0  redo size
        549  bytes sent via SQL*Net to client
        385  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

exec DBMS_STATS.GATHER_TABLE_STATS('DAMONDBA','T2');

SQL> select table_name,num_rows,blocks,empty_blocks,avg_space ,sample_size,last_analyzed from user_tables;
T2                            0       1438           98       7943           0 13-AUG-23

SQL> select segment_name,bytes,blocks from user_segments;
T2                     12582912       1536

--- 与此同时,对比

----------  Analyze table t2 compute statistics;   


select table_name,num_rows,blocks,empty_blocks,avg_space ,sample_size,last_analyzed from user_tables;
T2                            0       1438           98       7943           0 13-AUG-23 <<<<<<<<<<<<<<  numrows = 0
select segment_name,bytes,blocks from user_segments;
T2                     12582912       1536

---------- exec DBMS_STATS.GATHER_TABLE_STATS('DAMONDBA','T2');

SQL> select table_name,num_rows,blocks,empty_blocks,avg_space ,sample_size,last_analyzed from user_tables;
T2                            0       1438           98       7943           0 13-AUG-23

SQL> select segment_name,bytes,blocks from user_segments;
T2                     12582912       1536

标签:tables,blocks,name,dba,T2,CBO,user,select
From: https://www.cnblogs.com/Jeona/p/17627048.html

相关文章

  • 一个mysql dba的成长之旅--第零章 绝处逢生:意外收到dba offer
    (本故事纯属虚构,如有雷同实属巧合)2018年的一个秋天的下午,江南理工大学图书馆一楼的宣讲会大厅人头攒动,充满了期待的氛围。这里正在举办一场国内知名互联网公司的宣讲会,吸引了众多毕业生前来倾听。小李身穿一套整洁的求职西装,手里拿着整齐的彩色简历,坐在室友旁边,全神贯注地聆听着台......
  • 假期总结TABLESAMPLE函数
    进行随机抽样,本质上就是用TABLESAMPLE函数语法1,基于随机分桶抽样:SELECT...FROMtblTABLESAMPLE(BUCKETxOUTOFyON(colname|rand()))y表示将表数据随机划分成y份(y个桶)x表示从y里面随机抽取x份数据作为取样colname表示随机的依据基于某个列的值rand()表示随机的依据......
  • 开源数据库Mysql_DBA运维实战 (DML/DQL语句)
    DML/DQLDMLINSERT  实现数据的 插入        实例:DELETE  实现数据的 删除        实例:UPDATE  实现数据的 更新         实例1:         实例2:     实例3:DQL DML/DQL编辑 DML语句数据库操纵语言: 插入数据INSERT、删......
  • 七月学习之Iptables场景示例
    10、Iptables场景示例10.1、iptables场景一场景描述1、对所有的地址开放本机的tcp(80、22、8080-9090)端口的访问2、允许对所有的地址开放本机的基于ICMP协议的数据包访问3、其他未被允许的端口禁止访问实现思路1、先允许端口、协议2、配置拒绝规则#INPUTiptables-Fiptab......
  • 开源数据库Mysql_DBA运维实战 (DDL语句)
    DDL编辑DDL语句数据库定义语言:数据库、表、视图、索引、存储过程.例如:CREATE DROPALTERDDL库定义库{                创建业务数据库:CREAATEDATABASE  ___数据库名___ ;                数据库名要求{                ......
  • 七月学习之Iptables自定义链
    9、Iptables自定义链9.1、为什么要使用自定义链iptables的默认链就已经能够满足我们了,为什么还需要自定义链呢当默认链中的规则非常多时,不便于管理1、假设INPUT链中存放了100条规则,这100条规则有针对80端口的,有针对22端口的2、如果想修改22端口的规则,则需要将所有规则都看一遍,......
  • Linux防火墙firewalld&iptables(2)iptables开放指定端口开放指定端口
    一、CentOs6iptables基本操作#chkconfig--list|grepiptables 查看防火墙的服务#chkconfigiptablesoff 永久关闭防火墙#chkconfigiptableson 永久开启防火墙#servicestatusiptables 查看防火墙状态#servicestartiptables 启动防火墙#servicestopiptab......
  • 七月学习之Iptables地址转换
    8、Iptables地址转换8.1、什么是NAT网络地址转换(NAT),意思也比较清楚:对(数据包)的网络地址(IP+PORT)进行转换例如,机器自己的IP10.1.1.2是能与外部正常通信的,但是192.168网段是私有IP段。无法与外界通信因此当源地址为192.168网段的包要出去时,机器会先将源IP换成机器自己的10.......
  • Linux:防火墙iptables与firewalld的启停
    Linux关闭防火墙firewall和iptables命令_永久关闭iptables防火墙_红烧柯基的博客-CSDN博客Linux防火墙——iptables以及firewalld的使用介绍_树下一少年的博客-CSDN博客干货!Linux防火墙配置(iptables和firewalld)_数据包_规则_进行 iptables与firewalld1、状态syste......
  • 七月学习之Iptables连接追踪state
    7、Iptables连接追踪state7.1、什么是连接追踪state(conntrack)连接追踪,顾名思义,就是跟踪(并记录)连接的状态如下图:是一台IP地址为10.1.1.2的linux机器,我们能看到这台机器上有三条连接1、机器访问外部HTTP服务的连接(目的端口80)2、外部访问机器内FTP服务的连接(目的端口21)3......