oracle常用优化方法

sql 避坑

 1、表尽量使用别名,字段尽量使用别名.字段名,这样子,可以减少oracle数据库解析字段名。而且把不需要的字段名剔除掉,只保留有用的字段名,不要一直使用 select *。

  2、关联查询时,选择好主表。oracle解析器对from 后面的表的解析是从右到左的,所以把数据量较小的表作为主表,然后和其他表进行关联,假如存在三个以下表,把同时交叉关联的表作为主表,提高查询效率。

  3、where 条件后面的的条件解析是从下向上,从后先前解析执行的,所以可以把过滤数据量较多的条件放在最后面。

  4、多利用表中数据行的rowid,rowid代表着表中数据存在的物理地址。例如删除重复记录的时候,可以根据rowid进行删除。

  5、减少对表的查询,特别在子查询中,能尽量少重复访问表,就减少。

  6、避免使用耗资源的操作,如distinct、Union、minus等这种需要全表查询的操作。

  7、优化分组group by ,对group by字段要进行添加锁引,如果分组当中含有查询条件,要改写为where条件进行过滤后,再进行分组,而不是直接进行 having 条件。

  8、用EXISTS替代IN、用NOT EXISTS替代 NOT IN,因为 not in是低效的,它必须对该字段的全部数据进行排序。

  9、要合理利用索引字段提高查询效率。特别是常用的关联字段可以增加索引,主键、或者某些唯一字段。

  10、利用>=替代>,因为>=可以直接定位到=的位置,而大于必须先定位位置,然后再查询下一个数据。耗时不一样。

11、关于用exists和in、not exists和inot in使用问题

IN适合于外表大而内表小的情况;exists适合于外表小而内表大的情况。

其中:NOT IN子句将执行一个内部的排序和合并,对子查询中的表执行一个全表遍历,因此是非常低效的。
12、Union 和Union all用法

Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序。
Union All:对两个结果集进行并集操作,包括重复行,不进行排序。

13、使用DECODE函数来减少处理时间:

使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.

14、整合简单无关联的数据库访问

如果有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系),以减少多于的数据库IO开销。

虽然采取这种方法,效率得到提高,但是程序的可读性大大降低,所以还是要权衡之间的利弊。

15.使用where而非having

where语句是在group by 语句之前筛选出记录,而having是在各种记录都筛选之后再进行过滤,也就是说having子句是在数据库中提取数据之后再筛选。因此尽量在筛选之前将数据使用where子句进行过滤,因此执行的顺序应该如下

1使用where子句查找符合条件的数据

2使用group by子句对数据进行分组

3在group by分组的基础上运行聚合函数计算每一组的值


16.尽量少用连接符“+”连接字符串!

17.避免在索引列上使用NOT、<>、!= 通常, 

18.避免在索引列上使用计算.

WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描.

19.避免在索引列上使用IS NULL和IS NOT NULL

避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引.对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录. 如果至少有一个列不为空,则记录存在于索引中.举例: 如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值(123,null)的记录(插入). 然而如果所有的索引列都为空,ORACLE将认为整个键值为空而空不等于空. 因此你可以插入1000 条具有相同键值的记录,当然它们都是空! 因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引.
20.分离表和索引
总是将你的表和索引建立在不同的表空间内(TABLESPACES)。
决不要将不属于ORACLE内部系统的对象存放到SYSTEM表空间里。
确保数据表空间和索引表空间置于不同的硬盘上

21.最后一个一定要学会查看执行计划,查看相关查询条件是否进入索引,找出问题所在,定位问题。

索引失效场景

1. 没有 WHERE 子句
2. 使用 IS NULL 和 IS NOT NULL
3. WHERE 子句中使用函数

select * from staff where trunc(birthdate) = '01-MAY-82';


4. 使用 LIKE ‘%T’ 进行模糊查询

--'123%' 会用到索引 select * from student where name like 'aaa%' ;

--'%123' 或者 '123' 不会使用索引 select * from student where name like '%123' ;


5. WHERE 子句中使用不等于操作
6. 等于和范围索引不会被合并使用

SELECT * FROM emp WHERE job='manager' AND deptno>10


7. 比较不匹配数据类型

id是一个varchar2型的字段,在这个字段上有索引,但是下面的语句会执行全表扫描

select * from temp where id = 100101;

8.复合索引,不是使用的第一部分

--会用到索引 select * from student where name = '123'

--不会使用索引 select * from student where age = 18
9. or语句其中一个条件没有使用索引

alter table student add index my_index(name)

--由于age并没有创建索引,因此该语句索引失效

select * from student where name = '张三' or age = 18

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Oracle性能优化数据库管理中至关重要的一项工作。在进行性能优化时,不仅需要优化数据库的结构和配置,还需要针对具体的SQL语句进行优化。 首先,有效地使用索引可以显著提高SQL查询的性能。索引的选择应根据具体的查询需求进行优化,避免过多或不必要的索引。并且,需要定期重新分析和重建索引,以确保索引的统计信息是最新的。 其次,合理地编写SQL语句也是优化的关键。应尽量避免使用全表扫描和复杂的连接操作,可以通过使用合适的连接方式、使用子查询替代连接操作等方式来进行优化。 另外,使用合适的查询计划来提高SQL的执行效率也是一项重要的优化策略。Oracle提供了多种查询计划,如基于成本的优化器、基于规则的优化器等。应根据具体的查询需求选择合适的查询计划,并使用_hint强制指定查询计划,以达到最优的查询性能。 此外,合理地设置适当的内存参数也能提高SQL的性能。Oracle数据库有多个重要的内存参数,如SGA(系统全局区)和PGA(程序全局区)等,需要根据实际情况进行调整,以提高SQL的执行效率和响应速度。 最后,可以通过SQL监控和性能调优工具来定位和解决性能问题。Oracle提供了多种监控工具,如AWR报告、SQL Trace、Explain Plan等,可以通过对这些工具的使用来分析和调优SQL的性能问题。 综上所述,通过合理地使用索引、优化SQL语句、选择合适的查询计划、设置适当的内存参数以及使用监控工具等方法,可以有效地提高Oracle数据库的性能。 ### 回答2: Oracle作为一种关系数据库管理系统,拥有强大的性能优化功能。针对SQL语句的性能优化常用方法有以下几种: 1. 优化查询语句:通过优化SQL语句的编写,可以减少查询的时间和资源消耗。例如,避免使用SELECT *,而是明确指定需要查询的字段;使用EXISTS或IN代替NOT EXISTS或NOT IN等。 2. 创建索引:通过创建合适的索引可以加速查询。索引可以提高数据检索的效率,减少全表扫描的开销。但过多的索引会增加数据维护的成本,因此需要根据实际情况选择合适的字段创建索引。 3. 使用分区表:将大表划分为若干个小表,每个小表称为一个分区,可以通过分区表来提高查询效率。适当的分区可以减少查询的数据量,提高查询性能。 4. 优化表结构:合理设计表结构,包括选择合适的字段类型、定义主键和外键等等。避免使用过长的字段、重复的字段等不必要的设计,可以减少存储空间的使用和提高查询效率。 5. 适当使用数据库事务:事务能够保证数据完整性和一致性,但在数据处理量大的情况下,事务的开销也是可忽略不计的。因此,在设计时需要考虑是否需要使用事务,以免造成不必要的开销。 6. 使用优化器: Oracle具有强大的查询优化器,它可以根据语句选择更优的执行计划。通过设置优化器参数,例如统计信息的收集、调整计划的优先级等,可以提高查询的执行效率。 综上所述,在进行Oracle性能优化时,可以通过优化SQL语句、创建索引、使用分区表、优化表结构、适当使用事务和调整优化器参数等方法来提高数据库的查询性能。但需要根据具体情况选择合适的优化方法,并进行合理的测试和监控,以确保优化后的性能达到预期效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值