ORACLE笔记之SQL语句的优化

RAID 0/1/5/10 性能实测:4块 SATA SSD 组阵列,顺序读写速度对比 本文通过实测对比了RAID 0/1/5/10在4块SATA SSD上的顺序读写性能,详细展示了不同RAID级别的配置方法、理论性能与实际测试数据。测试结果显示,RAID 0在顺序读写速度上表现最佳,而RAID 10则在性能与数据安全之间取得了平衡,适合数据库服务器等关键应用场景。 阅读详情

  SQL语句的优化总结如下

 

sql语句的优化可以按照如下六个步骤进行:

  1. 合理使用索引
  2. 避免或者简化排序
  3. 消除对大表的扫描
  4. 避免复杂的通配符匹配
  5. 调整子查询的性能
  6. EXISTS和IN运算符

下面我就按照上面这六个步骤分别进行总结:

  • 1-------------------------------------合理使用索引

  首先要明确创建索引的根本目的是:提高查询效率;

  使用原则如下:

1.1、在条件表达式中经常用到的不同值较多的列上建立索引

1.2、在不值少的列上不要创建索引,或者位图索引

      例如:在员工表的性别列上,只有“男”和“女”两个不同值,如果建立索引,不但不会提高性能

1.3、在经常进行连接,但是没有指定为外键的列上建立索引

      根据我的经验,在实际开发中,数据库的设计是不会建立索引的,都是通过在外键上面建立索引进行关联,这样性能更好;

1.4.在频繁进行排序或分组的列上建立索引

1.5.如果待排序的列有多个,可以建立组合索引

         例如:order by D,E 那要注意:在建立索引时,注意D列和E列和排序后面的顺序要相同,不然不管是那种数据库都不会用到这个索引;

1.6.如果条件表达式中经常对某个列应用某个函数后指定查询条件,则应建立函数索引

备注:对于Oracle中怎样建立索引,有多少索引,以及应用场景,在接下来的帖子中我会加进来

 

  • 使用索引需要注意的地方

 下面情况的SQL,不会用到列上的索引,应尽量避免使用:

 1.  存在数据类型的隐形转换时,例如

 

Sql代码  收藏代码
  1. select * from emp where empno = ‘7369’;  

 

    注意上面的empno列是number类型的,这样转化就不会用到这个索引

 

2. 列上有数学运算时,例如

 

Sql代码  收藏代码
  1. Select * from emp where sal*2 <1000;  

 

  这是因为在索引上只有sal的值,没有sal*2的值,应该改成

 

Sql代码  收藏代码
  1. select * from emp where sal<1000/2 ;  

 

 

 3.使用不等于(<>)运算时 例如

 

 

Sql代码  收藏代码
  1. Select * from emp where deptno <>10;  

 

 4.使用substr字符串函数时,例如

 

 

Sql代码  收藏代码
  1. Select * from emp where substr(ename,1,3)=‘SMI’;  
 5.‘%’通配符在第一个字符时,例如

 

 

Sql代码  收藏代码
  1. Select * from emp where ename like’%th’;  

 

 6.字符串连接( || )时,例如

 

 

Sql代码  收藏代码
  1. <span style="font-size: 16px;">Select * from emp where ename || ‘abc’ = ‘SMITHabc’;</span>  

 

 

 

 

  • 2-------------------------------------避免或者简化排序

2.1 应当简化或避免对大型表进行重复的排序,以下情况,oracle是会默认对他排序的情况

  • SQL中包含Group By子句
  • SQL中包含Order By子句
  • SQL中包含Distinct子句
  • SQL中包含Minus或Union子句
  • in子句中的SQL子查询

2.2 以下情况不能有效地利用索引

1.待排序列没有全部建立索引,例如

 

Sql代码  收藏代码
  1. order by D,E 而在表中只在D列上创建了索引  
  2. Group by 或者 Order by 子句中列的顺序与索引的列的顺序不同  
 2.连接查询时排序的列来自不同的表(索引不能跨表)

 

 避免或简化排序的总结如下:为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表。如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等

 

 

  • 3-------------------------------------消除对大表的扫描

3.1. 在连接查询中,对表的顺序存取可能对查询效率产生致命的影响。避免这种情况的主要方法就是对连接的列进行索引。例如有两个表,学生表(学号、姓名、年龄…)和选课表(学号、课程号、成绩)。如果两个表要做连接,就要在”学号”这个连接字段上建立索引。

 

 

3.2 使用并集来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的 where 子句强迫数据库使用顺序存取。例如

 

Sql代码  收藏代码
  1. Select * from abc where a>10 or b<10;  

 

       尽管我们在B和C列上都建立了索引,但是在上面语句中,优化器还是使用顺序存取方式扫描整个表。因为这个语句要检索的是分离的行的集合,可改为如下语句

 

 

Sql代码  收藏代码
  1. Select * from abc where a>10  
  2. Union  
  3. Select * from abc where b<10  

 

 

 

  • 4-------------------------------------避免困难的通配符匹配

复杂的通配可能导致耗时的查询。例如

 

Sql代码  收藏代码
  1. Select * from customer where zipcode like ’98_ _ _’;  

 

 即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。应改成

 

 

Sql代码  收藏代码
  1. Select * from customer   
  2. where zipcode >=’98000’ and zipcode <‘ 99000’  

 

 

 

 

  • 5-------------------------------------调整子查询的性能

子查询包括两种,关联子查询、非关联子查询,下面分别对这两种进行分析

5.1 非关联子查询

       非关联子查询时子查询只会执行一次,而且结果集是已经排序完毕的,并保存在一个Oracle的临时段中,其中的每一个记录在返回时都会被父查询所引用。在子查询返回大量记录的情况下,将这些结果集排序,以及将临时数据段进行排序会增加大量的系统开销。例如

 

Sql代码  收藏代码
  1. select emp_name from emp_number where emp_id in (select emp_id from emp_func);  

 

 

 

5.2 关联子查询

解释一下,什么是关联子查询,就是子查询中的条件用到了父查询中的列,例如:

Sql代码  收藏代码
  1. select emp_name from emp_number where emp_id in (select emp_id from emp_func where emp_number.emp_id = emp_func.emp_id);  

 

      对返回到父查询的记录来说,子查询会每行执行一次。因此必须保证子查询尽可能用到索引。关联子查询的系统开销更高。

 对于子查询我的应用原则就是:查询嵌套的层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那以要在子查询中过滤掉尽可能多的行。

 

  • 6-------------------------------------EXISTS和IN运算符

6.1 带IN的关联子查询是多余的,因为IN子句和子查询中相关操作的功能是一样的。例如

Sql代码  收藏代码
  1. Select emp_name from emp_member where emp_id in (select emp_id from emp_func where emp_member.emp_id = emp_func.emp_id);  

 

 

6.2 为非关联子查询指定EXISTS子句是不适当的,因为这样会产生笛卡尔积)。例如

Sql代码  收藏代码
  1. Select emp_name from emp_member  
  2. Where exists(select emp_id from emp_func);  

 

 

6.3 尽量不要使用NOT IN 子句,虽然使用MINUS子句要进行两次查询,使用MINUS子句依然比 NOT IN 子句快,这种情况你应该这么写

Sql代码  收藏代码
  1. Select emp_name from emp_member where emp_id   
  2. in (select  emp_id from emp_member   
  3. minus   
  4. Select emp_id from emp_func where func_id like ’81%’ );  

 

 

 

 

最后测试索引的性能,下面这个例子是在网上看到的,我直接拿过来了,我觉得非常经典

1.新建dumpy表,然后向dumpy表中添加1000万行记录,其中ID列是有序的整数,Name是随机的字符串,Rand列是随机的数值

测试环境Oracle,创建表的语法如下:

Sql代码  收藏代码
  1. create table dumpy  
  2. (  
  3.    id       number(10),  
  4.    name     varchar2(10),  
  5.    rand     number(10,2)  
  6. );  

 

添加数据的语法如下:

Sql代码  收藏代码
  1. declare  
  2.   recordcount integer := 10000000;  -- 1000万条记录  
  3. begin  
  4.   for i in 1..recordcount loop  
  5.     insert into dumpy(id, name, rand)  
  6.     values ( i, dbms_random.string('x', 8),  
  7.              abs(dbms_random.random) / 100.0);  
  8.     if mod(i, 1000) = 0 then  
  9.       commit;                          -- 每插入1000条提交  
  10.     end if;  
  11.   end loop;  
  12. end;  

 数据添加成功后,查询Rand值介于1000到2000之间的行。添加索引,比较优化前后查询速度的变化。

  提示:执行命令 SET TIMING ON,可以显示每次语句执行时间

AIGC实战:用ComfyUI和Lora微调打造专属原神角色(含完整工作流) 本文详细介绍了如何利用ComfyUI和Lora微调技术打造专属原神风格角色,涵盖从环境配置、数据集准备到工作流构建和Lora训练的全过程。通过模块化节点设计和高级控制技术,创作者可实现高度个性化的AIGC艺术创作,提升二次元角色生成的效率与质量。 阅读详情

相关推荐

Abaqus6.14.4 Linux详细图文安装教程

Abaqus6.14.4 Linux详细图文安装教程 20170409 1. 准备安装环境 1.1 安装CentOS 6.5,更新库 1.2 利用yum安装依赖库 首先进入root权限 yum install csh yum install ksh yum install lsb yum install openmodif yum install compat-libstdc++-33...

snuhxm的博客 7842

ORACLE 复习笔记之SQL语句的优化

转载请出自出处:http://eksliang.iteye.com/blog/2097999   SQL语句的优化总结如下   sql语句的优化可以按照如下六个步骤进行: 合理使用索引 避免或者简化排序 消除对大表的扫描 避免复杂的通配符匹配 调整子查询的性能 EXISTS和IN运算符 下面我就按照上面这六个步骤分别进行总结: 1------------------...

xiatianba的专栏 219

开关电源三大基本拓扑:反激、正激与桥式选型本质

开关电源拓扑是电力电子系统设计的核心基础概念,其本质决定能量传递路径、器件应力分布与系统物理边界。反激拓扑以耦合电感形式实现隔离与升降压,适用于小功率AC-DC场景;正激拓扑依赖实时能量传递与强制复位机制,支撑中功率高效率需求;桥式拓扑(含推挽/半桥/全桥)通过电压应力分摊与双向磁化,成为大功率系统的刚性选择。理解三者在磁芯工作模式、电流连续性、直流偏磁抑制等方面的原理差异,直接关系到效率、温升、EMI及可靠性等关键技术指标。本文聚焦反激、正激、桥式三大工程级基本拓扑的物理本质与落地约束,揭示从需求参数到电

cqwmy840702的博客 376

将varchar修改为clob的方法

一切都要先问清楚了再做,事实是不需要这么去做的,大字段在计算的时候不需要,所以大字段都可以删除掉,只留统计信息就可以了1.alter table patent_analysis.sys_patent_info add(tmp clob); 2,ALTER TABLE sys_patent_info NOLOGGIdeclare i integer; BEGIN i := 0; for crC

xcdsy@aliyun.com 1898

探索Vortex开源GPGPU:RISC-V SIMT架构(2),指令Decode

本文分析了Vortex RISC-V内核的Decode模块设计。文章详细介绍了指令译码过程,包括操作码、功能码和寄存器字段的提取,以及不同类型指令(R/I/S/B/U/UJ)的立即数处理。重点阐述了基于操作码和功能码的分层译码逻辑,包括ALU运算、分支跳转、系统调用等指令的译码规则。此外,还描述了定制指令的处理机制以及与调度器的握手协议。Decode模块通过组合逻辑实现快速译码,并将结果传递给下级Issue模块,同时协调指令流控制。

weixin_55313207的博客 1793

从内外参推导IPM变换方程及代码实现(生成AVM环视拼接图)

最近想实现AVM拼接,看了不少博客和论文,不过比较愚钝,一直没能很好理解原理,尤其是怎么在实现时把下文中Z1和Z2消除的,所以严谨的推导了一下对应的公式,如有不对,水平有限,烦请指出~IPM变换(逆透视变换),顾名思义,即将正常透视效应消除的变换,变换结果为鸟瞰图BEV(俯视图);AVM环视拼接一般是将车身前后左右的四个鱼眼相机拼接成环视图(也是俯视),其使用的单应矩阵将四个相机转到同一个俯视坐标系。

mxdsdo09的博客 4174

oracle mod 表达式

语法:MOD(number,divisor) 参数: Number 为被除数。 Divisor 为除数。如果 divisor 为零,函数 MOD 返回值 为原来number 说明: 函数MOD可以借用函数 INT 来表示: MOD(n, d) = n - d*INT(n/d) 在pl/sql dev中验证mod(3,-2) (2张)

清叶 的专栏 2669

如何在 SAP BTP 上使用 Integration Suite 消费 S/4HANA Cloud API

SAP Integration Suite是一个集成平台即服务(iPaaS),允许开发人员顺利地将内部部署和基于云的应用程序和流程与SAP管理的工具和预构建内容进行集成。登录 SAP Business Technology Platform Cockpit,进入 integration suite:再点击 API management 进入 API Portal:或者直接从收藏夹里打开链接:https://304a49cetrial.integrationsuitetrial-apiportal.cfapp

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1699

Oracle取余函数mod

接下来将会和oracle存储过程打交道,一切都是新的,从基础的学起吧 今天看几个函数: 1 mod 取余函数 SQL> declare 2 tmp number; 3 begin 4 for tmp in 1..10 loop 5 if mod(tmp, 2) = 0 then 6 dbms_output.put_line(tmp||' can be mod b

PhilipGuo的博客 1万+

【OAG vs RAG】RAG的“语义崩溃“:为什么你的知识库越大,AI越笨?_语义检索oag-优快云博客

19.9 元(AI 编程 / Agent 实战 | 本文同主题系统课程)·49.9 元(AI 时代成长方法论)。单篇不过瘾?订阅解锁全量源码、实战与答疑;文末附资料包领取方式 ↓图1:RAG语义崩溃概念图。

求知若渴、虚心若愚 73

FreeRTOS深入教程(任务创建的深入和任务调度机制分析)

本篇文章将带大家深入学习任务的创建和分析任务调度的机制。本篇文章深入的讲解了任务创建的内部实现和任务调度的源代码分析和实现,学习这篇文章有助于更深入的学习FreeRTOS的源码。

m0_49476241的博客 6391

Oracle MOD函数的使用

oracle中取余是用函数mod(m,n),其中m和n都是数字 该函数的的规则是:返回m/n的余数,如果 n 为 0,则返回 m    SELECT MOD(1200, 500) FROM dual 因为1200/500结果为2余200,所以输出结果:200 SELECT MOD(1200, 0) FROM dual 因为后面参数为0,所以输出结果前面的参数:1200  ...

weixin_41318195的博客 1万+

YOLOv11涨点改进 | 检测头Head改进篇 | 利用DynamicConv高效动态卷积改进YOLOv11检测头,DyHead通过增强检测头操作,轻量化改进、提高模型目标检测的精度

本文提出了一种基于动态卷积(DynamicConv)的YOLOv11检测头改进方法v11Detect_DyHead。该方法通过引入多专家机制和动态权重调整,在增加参数量的同时保持较低计算复杂度,有效解决了低FLOPs模型难以从大规模预训练中获益的问题。文章详细介绍了DynamicConv模块的原理和实现,包括其参数高效特性、多专家机制和动态权重生成方式。同时提供了完整的代码实现和添加该模块的具体步骤,并给出了相应的YAML配置文件。实验表明,该方法在保持较低计算开销的同时显著提升了模型性能,适用于视觉和语言

Ai缝合怪、助力小伙伴高效发论文 536

Oracle笔记 之 sql语句优化

SQL语句的执行 当Oracle数据库执行SQL语句时,会根据查询优化器分析语句,并根据分析结果生成查询执行计划。也就是说,数据库是执行的查询计划,而不是Sql语句。 查询优化器有rule-based-optimizer(基于规则的查询优化器) 和Cost-Based-optimizer(基于成本的查询优化器)。 其中基于规则的查询优化器在10g版本中消失。 对于规则查询,其最后查询的是全表扫描。而CBO则会根据统计信息进行最后的选择。 SQL语句的执行顺序 注意:在10g版本后使用CBO规则后2,3已无差

一起种梧桐吧的博客 179

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

oracle sql语句优化 笔记

发表时间:2010-09-28 最后修改:2010-09-28 收藏 < > 猎头职位: 上海: Senior Software Engineer 相关文章: Oracle语句优化53个规则详解(1) oracle hints的用法总结 Oracle 常用SQL技巧收藏 推荐群组: Database圈子 更多相关推荐 Oracle...

154

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Related to Oracle SQL 关于优化,SQL语句的共享[笔记]

        每次执行SQL语句,ORACLE都会对其进行解析,并且ORACLE会将那些简单的不带连接的表查询缓存到SGA(system global area)的共享池(shared buffer pool)中,并且这个共享池会被所有数据库用户共享,可以在init.ora中设置这块缓存的大小,数值越大缓存的SQL语句越多,一旦使用了共享池中的SQL语句会大大提升查询性能。    当你向ORACLE 提交一个SQL语句,ORACLE会首先在这块内存中查找相同的语句.ORACLE对两者采取的是一种严格匹配,

Arvin Rong's Space 655

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Oracle性能优化学习笔记之共享Sql语句

为了不重复解析相同的SQL语句,在第一次解析之后,Oracle将SQL语句存放在内存中。这块位于系统全局区域SGA(systemglobal area)的共享池(shared buffer pool中的内存可以被所有的数据库用户共享。因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前执行过的语句完全相同,Oracle就能很快获得已经被解析的语句以及最好的执行方案。Oracle的这个

勿忘初心 1865

Oracle性能优化读书笔记(2)-SQL语句和索引优化

接上文,主要是索引和sql语句级优化

Maxwell的博客 759

优化SQL语句的若干方法 /Oracle学习笔记

1、操作符号: NOT IN操作符 此操作是强列推荐不使用的,因为它不能应用表的索引。   推荐方案:用NOTEXISTS 或(外连接+判断为空)方案代替 "IS NULL", "", "! 因为他们不走索引全是表扫描。 NOT IN会多次 扫描表, 使用EXISTS、NOT EXISTS、IN、LEFT OUTER JOIN来替代,特别是左连接, 而Exists比IN更快,最慢的

zzy7075的专栏 1704

oracle distinct分页优化_「技术笔记」 「成都校区」Oracle SQL语句之常见优化方法总结...

成都黑马程序员6.20号JAVAEE 28基础班开班成都黑马程学员7.10号JAVAEE 29基础班开班成都黑马程学员7.28号JAVAEE 30基础班开班成都黑马程序员7.10号 前端与移动开发3期基础班成都黑马程序员7.5号UI/UE首期开班。优惠1000元[技术笔记] 【成都校区】Oracle SQL语句之常见优化方法总结 1、SQL语句尽量用大写的; 因为oracle总是先解析SQL语句,...

weixin_39637256的博客 182

Oracle 性能调优学习笔记(十一)-- SQL 语句优化

SQL 语句优化   判断SQL占用资源的方法   1.OEM   2.Statspack   3.Explain Plan   4.SQL Trace and TKPROF   5.AutoTrace      优化器模型     两种优化器:  基于的规则的RBO:(不推荐)   1.规则在数据字典存在     基于的代价的CBO:      1.选择路径消耗(IO,CPU)最小的代价   2...

topMan'blog 175

黑马程序员顺义校区php_「技术笔记」 「成都校区」Oracle SQL语句之常见优化方法总结...

成都黑马程序员6.20号JAVAEE 28基础班开班成都黑马程学员7.10号JAVAEE 29基础班开班成都黑马程学员7.28号JAVAEE 30基础班开班成都黑马程序员7.10号 前端与移动开发3期基础班成都黑马程序员7.5号UI/UE首期开班。优惠1000元[技术笔记] 【成都校区】Oracle SQL语句之常见优化方法总结 1、SQL语句尽量用大写的; 因为oracle总是先解析SQL语句,...

weixin_31542739的博客 169

oracle数据文件过多,学习笔记:Oracle性能优化 定位消耗内存 逻辑读 执行次数 硬盘读 分析次数多的SQL语句...

天萃荷净oracle 中如何定位重要(消耗资源多)的SQL,统计一下关于查看影响Oracle性能的SQL,定位耗内存 逻辑读 执行次数 硬盘读 分析次数多的SQL语句1、查看有影响Oracle性能的SQLselect substr(to_char(s.pct,'99.00'),2)||'%'load,s.executions executes,p.sql_textfrom(select addre...

weixin_33681937的博客 304

Oracle SQL语句之常见优化方法总结

下面列举一些工作中常常会碰到的Oracle的SQL语句优化方法: 1、SQL语句尽量用大写的;  因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行。 2、使用表的别名:   当在SQL语句中连接多个表时, 尽量使用表的别名并把别名前缀于每个列上。这样一来, 就可以减少解析的时间并减少那些由列歧义引起的语法错误。 3、选择最有效率的表名顺序(只在基于规则的优化器(RB

旺旺的博客 6万+

Oracle的SQL语句优化(满满干货,建议收藏!)

1. SQL语句执行步骤 语法分析> 语义分析> 视图转换 >表达式转换> 选择优化器 >选择连接方式 >选择连接顺序 >选择数据的搜索路径 >运行“执行计划” 2. 选用适合的Oracle优化器 RULE(基于规则)、 COST(基于成本) 、CHOOSE(选择性) 3. 访问Table的方式 全表扫描 全表扫描就是顺序地访问表中每条记录,ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描。 通过ROWID访

wj的博客 5478

ORACLE性能优化之SQL语句优化

操作环境:AIX +11g+PLSQL 包含以下内容: 1. SQL语句执行过程 2. 优化器及执行计划 3. 合理应用Hints 4. 索引及应用实例 5. 其他优化技术及应用

jdzms23的专栏 2万+
上一篇: 性能测试所含内容简要说明
下一篇: oracle处理父子节点关系
honckly
博客等级 码龄20年 3粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值