news 2026/6/10 1:49:22

Oracle调优知识

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Oracle调优知识

Oracle使用基于代价的优化方式,CBO优化器cost based optimization

优化器主要参考的是表和索引的统计信息,统计信息给出表的大小 有多少行等信息,过期的统计信息会让优化器做出一个错误的执行计划,因此要及时刷新统计信息。

1. Oracle统计信息

优化器要根据表,索引中的数据来选择查询数据的方式,由于表中的数据量很大,不可能每次执行查询时实时的统计表中的数据量及数据分布,所以要定期刷新,把表和索引的大小行数信息保存到数据字典里,供优化器使用,这就是统计信息。

统计信息包括表,索引,表分区,索引分区,列等,我们主要关注表和索引的统计信息

统计信息脚本每天6点12点刷新一次

查看表统计信息

select table_name,num_rows,last_analyzed from dba_tables where table_name=''

num_rows 数据量

last_analyzed 统计信息刷新的时间

查看索引统计信息

select table_name,index_name,num_rows,last_analyzed from dba_indexes where table_name=''

表分区统计信息

dba_tab_partitions

索引分区统计信息

dba_ind_partitions

手工刷新统计信息

exec dbms_stats.gather_table_stats(ownname=>'sumdb', tabname=>'ttt');

2. Oracle执行计划

执行计划是一条查询语句在Oracle中的执行过程,或访问路径的描述

2.1 查看执行计划,autotrace是Oracle自带的工具,可以展示执行计划。

set autotrace traceonly

set timing on

SQL语句

然后

select * from table(dbms_xplan.display());

或根据sqlid查看该sql当时的执行计划

select * from table(dbms_xplan.display_awr('sqlid',null,null,'ADVANCED'));

查看历史执行计划,根据sqlid

select * from table(dbms_xplan.display_awr('sqlid'))

高斯数据库查看执行计划

explain SQL语句

执行计划的顺序

是从上到下,从右到左,口诀:缩进最深的最先执行,缩进相同的,先上后下

2.2 执行计划有三方面要考虑,访问路径,连接方式和连接顺序

注意,执行计划里表的行数Rows是根据统计信息刷新的索引数据估算的,不是准确的。另外行数是条件过滤后的,不是全表行数。

表访问数据的方法

包括全表扫描table access full,

rowid扫描table access by rowid,

索引扫描table access by index scan,

索引扫描又分为

索引唯一扫描 index unique scan,

索引全扫描 index full scan,

索引范围扫描 index range scan

多表连接方法

如果查询涉及多个表的连接操作,join关键字用于将两张表做连接

nested loop join 嵌套循环连接

hash join 散列连接

sort merge join 排序合并连接

cross join 笛卡尔连接

详解,

nested loop

对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择。在嵌套循环中内表被外表驱动,要把返回子集较小的表作为外表,默认外表是驱动表,而且在内表的连接字段上一定要有索引。

步骤,确定一个驱动表(外表),另一个表为内表,驱动表中的每一行与内表中的相应记录JOIN。类似一个嵌套的循环。适用于驱动表的记录集较小(小于一万),而且内表需要有索引。需要注意,join的顺序很重要,驱动表的记录集一定要小,耗时最小。

hash join

散列连接是做大数据集连接时的常用方式,优化器使用两个表中较小的表利用连接键在内存中建立散列表(build 表),然后扫描较大的表(probe 表)并探测散列表,找出与散列表匹配的行。

哈希连接不适用于不等价连接条件(>, <,<>,>=,<=,like )

在内存中使用hash table来存放结合数据,通常会先访问数据量小的表,之后再访问数据量多的表,这样能保证性能。

select /*+ leading(a) use_hash(a,b) */ a.col1,b.col2 from table1 a, table2 b where a.col1=b.col2

上面语句中 /*+ leading(a) use_hash(a,b) */ 是Hint提示,提示和注释很像,提示不一定能生效,当提示错误时优化器会忽略提示而不会报错。

通过Hint来控制SQL查询中的hash join操作,

leading 指定hash join顺序。指定驱动表

use_hash 指定使用hash join

sort merge join

通常用在没有索引,并且数据已经排序的情况。

分组聚合

hash group by

注意,group by 后有对字段进行order by 的情况无法使用hash grouo by。而会使用sort group by ,它会自动排序分组字段,hash group by不保证结果集的顺序。

解决方法,使用子查询先进行group.by 操作,然后再外层查询使用order by子句进行排序。


————————————————
版权声明:本文为CSDN博主「xiaomin-Michael」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_74674329/article/details/143776377

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 4:43:12

10个AI写作工具,专科生轻松搞定论文格式与内容!

10个AI写作工具&#xff0c;专科生轻松搞定论文格式与内容&#xff01; AI 工具让论文写作不再难 对于专科生来说&#xff0c;论文写作不仅是学业的重要环节&#xff0c;也是考验综合能力的关键一步。然而&#xff0c;面对复杂的格式要求、内容逻辑的梳理以及查重率的压力&…

作者头像 李华
网站建设 2026/6/9 21:01:28

CAPL编程项目应用:CANoe中总线监控功能开发

CAPL编程实战&#xff1a;在CANoe中打造智能总线监控系统 你有没有遇到过这样的场景&#xff1f; 测试台上几十个ECU正在通信&#xff0c;Trace窗口里满屏飞舞着CAN报文&#xff0c;而你要从中找出某个偶发的“心跳丢失”或“状态跳变”问题——靠肉眼翻日志&#xff1f;等故障…

作者头像 李华
网站建设 2026/6/9 20:43:00

ESP32 Arduino环境搭建:Soft-AP配置完整示例

手把手教你用ESP32搭建本地Wi-Fi热点&#xff1a;Soft-AP实战全解析你有没有遇到过这样的场景&#xff1f;手里的智能设备还没连上家里的Wi-Fi&#xff0c;怎么给它配网&#xff1f;或者在野外、地下室这种没有路由器的地方&#xff0c;想临时控制一个传感器系统&#xff0c;该…

作者头像 李华
网站建设 2026/6/9 19:46:04

Packet Tracer汉化完整指南:适用于初学者的配置流程

让Packet Tracer说中文&#xff1a;零基础也能搞定的汉化实战指南 你是不是也曾在打开 Packet Tracer 的那一刻&#xff0c;面对满屏英文菜单感到头大&#xff1f;“Simulation Mode”是啥&#xff1f;“Realtime”和“Simulation”切换按钮到底干啥用的&#xff1f;刚学网络…

作者头像 李华
网站建设 2026/6/9 22:14:39

AES 与 SM4 加密算法:深度解析与对比

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

作者头像 李华
网站建设 2026/6/8 23:05:36

基于minidump的系统崩溃分析:手把手教程

从蓝屏到真相&#xff1a;用 minidump 破解系统崩溃的底层密码 你有没有遇到过这种情况——电脑突然一黑&#xff0c;紧接着满屏刺眼的蓝色界面跳出来&#xff0c;上面写着一堆看不懂的错误代码&#xff1f; 重启后一切如常&#xff0c;但几天后它又来了。 “老是蓝屏” &a…

作者头像 李华