Oracle SQL优化总结

本文总结了Oracle SQL优化的经验,包括缩小查询范围、优化执行计划、使用恰当的表连接方式等,旨在提高SQL查询效率。

标题:Oracle SQL优化总结

作者: lōττéry ©版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.]



*** SQL 优化也做了一段时间了,特此总结本人在工作中遇到的各个点,见笑了~


一、缩小范围 减少额外io/cpu/物理/逻辑等性能消耗

①、缩小范围(全扫能否加过滤条件最好是索引条件’)

②、分区表尽量加分区条件

执行计划区别:(PARTITION RANGE ALL分区全扫) (PARTITION RANGE SINGLE分区范围)”

③、是否存在没意义的关联条件
例如1A.id in (Select id from a1) and A.id in (Select id from a1 where id=1)

此时可以注释掉①部分避免没必要的关联和查询。

例如2:业务功能类似,功能1 需要范围abcde5张表,功能2范围abc3张表;

排除的/字段都等需求都相同,开发可能为了省事改写,直接将功能 2 sql直接使用功能1 sql

最终最外层将不需要字段筛选掉。

④、left join 确认能否改成join

left join 关联方式 存在选错驱动表被驱动表,某些时候可能还会存在量小应该走索引时不走索引。

且产生大量不必要的中间结果,产生大量物理/逻辑读;Join可以过滤数据(过滤条件)

二、执行计划

①、小表/小分区 变大表/大分区,不统计引起的 执行计划错误问题;

②、特殊情况可加hint driving_sitefullno_indexuse_hash ..)语句加hint需要和dba协商

数据库统计信息没问题时,大多数没特殊情况都是不需要加hint指定执行计划的;

③、善于用绑定变量;

④、使用标量子查询要量力而行;

⑤、能传入定值部分尽量传入定值

若某字段传一定值,凡是用到这个传定值字段的部分都尽量直接传值 (例如:关联条件,group by)

oracle在生成执行计划时要通过关联条件等衡量2个表哪个驱动被驱动表,若直接写定值,

数据库会更准确的选择最好的执行计划去数据库中读取数据,group by 排序部分为了减少资源消耗。

执行计划出现如下情况需要严重注意的:

①、CARTESIAN,笛卡尔乘积,需要确认是否有落下的表没有和其他表做关联;

②、filter,驱动表量越大越会引起性能问题;

③、Nest loop 驱动表或被驱动表全扫时
最糟糕的情况:驱动表和被驱动表都是全扫,且随着量的增加后续会存在性能问题..

大表做循环-->加索引

选择性很差的索引循环-->删索引

-->2大表做nest loop循环时,需要衡量使用频繁度且尽量和dba协商,来适当加索引;

-->nest loop是选择性很差(distinct key 很小)的索引(且执行时间较慢)时,需要dba分析该索引;

若删除索引,建议做个统计确认这几个月是否真的没人用再进行删除;

参考博客:http://blog.itpub.net/28602568/viewspace-1362044/

三、经验点

①、merge into where 条件除更新字段要放到on

字段 where条件(主键id=1)不走索引,放在on会走主键索引;

子查询:where 包含子查询没有放到on里可能存在执行计划没出现子查询关联表的情况,从而导致跑不出结果的情况。

②、update 和merge的选择

如下说的不针对全部情况,具体慢的情况根据业务/数据情况做更改’

update:更改单表,小表关联时 比merge 速度快,稳定好;

merge:相同表既做更改后字段也做过滤条件时“update A set i=(select i from b where a.id=b.id) where i<>(select i from b where a.id=b.id)”<>部分需要额外消耗,可以用merge避免;

③、不要使用(id = 1 or in 子查询 )形式

原因:执行计划会选择filter,驱动表过滤后条目很多的话,被驱动表会产生热点块;

博客参考:Oracle 'or exists/in'结合使用引起的filter执行计划 的优化

④、exists 和 in 的选择(避免filter)

exists 比 in 产生filter执行计划几率大,所以当sql慢,且按F5发现执行计划中有filter 可以试着改成in
若出现in 子查询里表全扫或者还存在慢的情况,可以考虑将in (子查询) A与外层Bjoin关联,
若还存在问题,确认是否存在本文提到的情况,针对整体衡量去优化。
补充:[not] exists 子查询里不存在与外层关联的条件,最终结果有无数据的现象
参考博客:http://blog.itpub.net/28602568/viewspace-1666675/

⑤、分页:rownumrow_number的选择

博客参考:Oracle rownum 分页引起的效率问题及优化思路

⑥、适当选择使用rowid...

博客参考:Oracle 通过rowid秒优SQL

⑦、尽量不写is null 等会引起不走索引的条件,“索引不记录空值

若字段有nvl函数索引可以写NVL(字段, 0)=0来当做is null判断,可走函数索引

⑧、代码If count >0.. 做判断时,若rownum=1能查出数据就满足count>0
就不必全部取出再判断count>0...所以这样的判断可以统一加 rownum=1
全部做更改后dba需要跟踪sql确认是否有存在rownum缺点引起的问题
Oracle rownum 分页引起的效率问题及优化思路
mysql 使用limit 1oracle 使用rownum=1 来取数据中一行。

⑨、 合理使用临时表解决大量下载功能

http://blog.itpub.net/28602568/viewspace-1685600/

⑩、 临时用的表: 临时属性表?普通表?

临时表:不可统计,create/insert大量后,再调用临时表可能存在选择索引情况引起性能问题可能;

普通表:create as select ... 不统计,再调用时,数据库会使用动态采样去产生正确的执行计划;若是insert需要及时统计,否则可能会存在和临时表的问题。

【评估多目标跟踪方法】9个高度敏捷目标在编队中的轨迹和测量研究(Matlab代码实现)内容概要:本文围绕“评估多目标跟踪方法”,重点研究9个高度敏捷目标在编队飞行中的轨迹生成与测量过程,并提供完整的Matlab代码实现。文中详细模拟了目标的动态行为、运动约束及编队结构,通过仿真获取目标的状态信息与观测数据,用于验证和比较不同多目标跟踪算法的性能。研究内容涵盖轨迹建模、噪声处理、传感器测量模拟以及数据可视化等关键技术环节,旨在为雷达、无人机编队、自动驾驶等领域的多目标跟踪系统提供可复现的测试基准。; 适合人群:具备一定Matlab编程基础,从事控制工程、自动化、航空航天、智能交通或人工智能等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于多目标跟踪算法(如卡尔曼滤波、粒子滤波、GM-CPHD等)的性能评估与对比实验;②作为无人机编队、空中交通监控等应用场景下的轨迹仿真与传感器数据分析的教学与研究平台;③支持对高度机动目标在复杂编队下的可观测性与跟踪精度进行深入分析。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注轨迹生成逻辑与测量模型构建部分,可通过修改目标数量、运动参数或噪声水平来拓展实验场景,进一步提升对多目标跟踪系统设计与评估的理解。
本软件实现了一种基于时域有限差分法结合时间反转算法的微波成像技术,旨在应用于乳腺癌的早期筛查。其核心流程分为三个主要步骤:数据采集、信号处理与三维可视化。 首先,用户需分别执行“WithTumor.m”与“WithoutTumor.m”两个脚本。这两个程序将在模拟生成的三维生物组织环境中进行电磁仿真,分别采集包含肿瘤模型与不包含肿瘤模型的场景下的原始场数据。所获取的数据将自动存储为“withtumor.mat”与“withouttumor.mat”两个数据文件。 随后,运行主算法脚本“TR.m”。该程序将加载上述两组数据,并实施时间反转算法。算法的具体过程是:提取两组仿真信号之间的差异成分,通过一组专门设计的数字滤波器对差异信号进行增强与净化处理,随后在数值模拟的同一组织环境中进行时间反向的电磁波传播计算。 在算法迭代计算过程中,系统会按预设的周期(每n次迭代)自动生成并显示三维模拟空间内特定二维切面的电场强度分布图。通过对比观察这些动态更新的二维场分布图像,用户有望直观地识别出由肿瘤组织引起的异常电磁散射特征,从而实现病灶的视觉定位。 关于软件的具体配置要求、参数设置方法以及更深入的技术细节,请参阅软件包内附的说明文档。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值