Oracle为什么不按照estimate_percent来分析表?

2024-01-22 09:18
文章标签 oracle 分析 estimate percent

本文主要是介绍Oracle为什么不按照estimate_percent来分析表?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

之前在用户现场,被问道“estimate_percent有时候不按照我们指定值来收集统计信息”时,当时以为客户环境设置有问题,没多考虑。

今天小研究了一下,还真不按照设置来,在这里简单总结并说明了一下原因。

DB 11.2.0.3.0

redhat 5.7

创建一个测试表:

SQL> conn user1/oracle
Connected.
SQL> create table test1 as select * from dba_objects;Table created.SQL> col table_name for a10
SQL> select table_name, num_rows, sample_size, sample_size/num_rows from dba_tables where owner = 'USER1';TABLE_NAME   NUM_ROWS SAMPLE_SIZE SAMPLE_SIZE/NUM_ROWS
---------- ---------- ----------- --------------------
T1             298240      298240                    1
SEND
TEST1
这是未收集前的状态,test1相关列为空。收集后:

SQL> exec dbms_stats.gather_table_stats(ownname => 'USER1', tabname => 'TEST1', estimate_percent => 10, method_opt => 'for all indexed columns size auto', cascade => true); PL/SQL procedure successfully completed.SQL> select table_name, num_rows, sample_size, sample_size/num_rows from dba_tables where owner = 'USER1';TABLE_NAME   NUM_ROWS SAMPLE_SIZE SAMPLE_SIZE/NUM_ROWS
---------- ---------- ----------- --------------------
T1             298240      298240                    1
SEND
TEST1           13814        4820           .348921384

收集后可以看到num_rows有值了,奇怪的是为什么采样比率是34.89%?而不是我设置的10%呢?

SQL> select count(*) from test1;COUNT(*)
----------13808          <<<< 实际数据量SQL> exec dbms_stats.gather_table_stats(ownname => 'USER1', tabname => 'TEST1', estimate_percent => 10, method_opt => 'for all indexed columns size auto', cascade => true); PL/SQL procedure successfully completed.SQL> select table_name, num_rows, sample_size, sample_size/num_rows from dba_tables where owner = 'USER1';TABLE_NAME   NUM_ROWS SAMPLE_SIZE SAMPLE_SIZE/NUM_ROWS
---------- ---------- ----------- --------------------
T1             298240      298240                    1
SEND
TEST1           13590        4775           .351361295
重新用相同的采样比收集,采样比率改变为35.13%,那我设置的10%没起作用?

尝试一下10046:

SQL> alter session set tracefile_identifier = 'gather_table_stats';Session altered.SQL> alter session set events '10046 trace name context forever';Session altered.SQL> exec dbms_stats.gather_table_stats(ownname => 'USER1', tabname => 'TEST1', estimate_percent => 10, method_opt => 'for all indexed columns size auto', cascade => true); PL/SQL procedure successfully completed.SQL> alter session set events '10046 trace name context off';Session altered.SQL> select table_name, num_rows, sample_size, sample_size/num_rows from dba_tables where owner = 'USER1';TABLE_NAME   NUM_ROWS SAMPLE_SIZE SAMPLE_SIZE/NUM_ROWS
---------- ---------- ----------- --------------------
T1             298240      298240                    1
SEND
TEST1           13891        4986           .358937442SQL> 

这篇关于Oracle为什么不按照estimate_percent来分析表?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/632533

相关文章

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

Oracle Scheduler任务故障诊断方法实战指南

《OracleScheduler任务故障诊断方法实战指南》Oracle数据库作为企业级应用中最常用的关系型数据库管理系统之一,偶尔会遇到各种故障和问题,:本文主要介绍OracleSchedul... 目录前言一、故障场景:当定时任务突然“消失”二、基础环境诊断:搭建“全局视角”1. 数据库实例与PDB状态2

Java中最全最基础的IO流概述和简介案例分析

《Java中最全最基础的IO流概述和简介案例分析》JavaIO流用于程序与外部设备的数据交互,分为字节流(InputStream/OutputStream)和字符流(Reader/Writer),处理... 目录IO流简介IO是什么应用场景IO流的分类流的超类类型字节文件流应用简介核心API文件输出流应用文

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了