`
ludo2008
  • 浏览: 11145 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

ORACLE 优化小结(1)

 
阅读更多
ORACLE有个高速缓冲的概念,这个高速缓冲就是存放执行过的SQL语句,那oracle在执行sql语句的时候要做很多工作,例如解析sql语句,估算索引利用率,绑定变量,读取数据块等等这些操作。假设高速缓冲里已经存储了执行过的sql语句,那就直接匹配执行了,少了步骤,自然就快了,但是经过测试会发现高速缓冲只对简单的表起作用,多表的情况完全没有效果,例如在查询单表的时候那叫一个快,但是假设连接多个表,就龟速了。
最重要一点,ORACLE的高速缓冲是全字符匹配的,什么意思呢,看下面三个select
--No.1
select * from tableA;
--No.2
select * From tableA;
--No.3
select * from tableA;

这三个语句乍一看是一样的,但是高速缓存是不认的,是全字符匹配的,索引在高速缓存里会存储三条不同的语句,说到这里,又引出一个习惯,就是要保持良好的编程习惯,这个很重要

ORACLE多表优化我积累了一些,都是常用的,介绍下

一、FROM子句后面的表顺序有讲究

先说为啥,ORACLE在解析sql语句的时候对FROM子句后面的表名是从右往左解析的,是先扫描最右边的表,然后在扫描左边的表,然后用左边的表匹配数据,匹配成功后就合并。 所以,在对多表查询中,一定要把小表写在最右边,为什么自己想想就明白了。例如下面的两个语句:

--No.1 tableA:100w条记录 tableB:1w条记录 执行速度十秒
select count(*) from tableA, tableB;

--No.2 执行速度百秒甚至更高
select count(*) from tableB, tableA;

这个估计很多人都知道,但是要确认非常有用。

还有一种是三张表的查询,例如

select count(1) from tableA a,tableB b ,tableC c where a.id=b.id and a.id=c.id;

上面中tableA 为交叉表,根据oracle对From子句从右向左的扫描方式,应该把交叉表放在最末尾,然后才是最小表,所以上面的应该这样写

--tableA a 交叉表
--tabelB b 100w
--tableC c 1w
select count(1) from tableB b ,tableC c ,tableA a where a.id=b.id and a.id=c.id;

这种写法对大数据量会非常有用,大家谨记,也是很常用的。

二、Where子句后面的条件过滤有讲究,ORACLE对where子句后面的条件过滤是自下向上,从右向左扫描的,所以和From子句一样一样的,把过滤条件排个序,按过滤数据的大小,自然就是最少数据的那个条件写在最下面,最右边,依次类推,例如

--No.1 不可取 性能低下
select * from tableA a where
a.id>500
and a.lx ='2b'
and a.id < (select count(1) from tableA where id=a.id)

--No.2 性能高
select * from tableA a where
a.id < (select count(1) from tableA where id=a.id)
and a.id>500
and a.lx ='2b'

三、使用select的时候少用*,多敲敲键盘,写上字段名吧,因为ORACLE的查询器会把*转换为表的全部列名,这个会浪费时间的,所以在大表中少用

四、充分利用rowid ,可以用rowid来分页,删除查询重复记录,很强大的,给两个例子:

--oracle查找重复记录
select * from tableA a where a.rowid>=(select min(rowid) from tableB b where a.column=b.column)


--oracle删除重复记录
delete from tableA a where a.rowid>=(select min(rowid) from tableB b where a.column=b.column)


--分页 start=10 limit=10
--end 为 start + limit
--1.查询要排列的表A
--2.查询A表的Rownum找出小于end的数据组成表B
--3.查询B表通过rownum找出大于start的数据完成
--简单的说先根据end值过滤数据,然后在根据start过滤数据
SELECT * FROM
(SELECT a.*, ROWNUM rn FROM (SELECT * FROM uim_serv_file_data ORDER BY OUID) a where ROWNUM<=20) b
where rn>10 order by ouid desc

五、存储过程中需要注意的,多用commit了,既可以释放资源,但是要谨慎。

六、减少对数据库表的查询,这个很重要,能减少就减少,因为在执行语句的时候oracle会做很多初始工作。

七、少用in,多用exists来代替

--NO.1 IN的写法
SELECT * FROM TABLEA A WHERE
A.ID IN (SELECT ID FORM TABLEB B WHERE B.ID>1)

--NO.2 exists 写法
SELECT * FROM TABLEA A WHERE
EXISTS (SELECT 1 FROM TABLEB B WHERE A.ID=B.ID AND B.ID>1)
分享到:
评论

相关推荐

    Oracle优化小结

    Oracle数据库优化是数据库管理员日常工作中至关重要的一环,尤其是在Oracle 10g这样的企业级数据库系统中。优化不仅仅是针对SQL语句的改进,而是涵盖了整个数据库系统,包括硬件、操作系统、数据库配置以及应用设计...

    oracle 性能优化建议小结

    ### Oracle性能优化建议小结 在Oracle数据库管理与性能调优的过程中,理解并掌握一系列的优化技巧至关重要。本文将从给定的文件标题、描述、标签以及部分内容中提炼出的关键点进行深入解析,旨在帮助数据库管理员及...

    Oracle sql优化技术小结

    Oracle SQL优化是数据库管理中的重要环节,其目的是提高查询效率,减少资源消耗,进而提升系统的整体性能。以下是一些常见的优化策略和注意事项: 1. **表替换视图**:视图在某些场景下能简化查询,但它们可能导致...

    oracle命令小结

    本文将深入解析“oracle命令小结”这一主题,重点介绍Oracle数据库的日志管理和表空间管理两个关键领域中的常用SQL语句,帮助读者更全面地理解和掌握Oracle数据库的管理技巧。 ### 一、日志管理 #### 1. 强制切换...

    构建最高可用Oracle数据库系统 Oracle 11gR2 RAC管理、维护与性能优化

    目录 推荐序 前言 第1章 认识Oracle RAC 1.1 RAC产生的背景 1.2 RAC体系结构 1.2.1整体结构 1.2.2物理层次结构 1.2.3逻辑层次结构 1.3 RAC的特点 ...1.6本章小结 ...2.10本章小结 ...15.5本章小结

    oracle数据库小结

    Oracle数据库是世界上最...总之,理解和管理Oracle数据库的外键以及游标限制对于优化数据库性能和确保应用正常运行至关重要。了解并正确使用这些工具和技巧,可以帮助你在日常数据库操作中避免常见的问题,并提升效率。

    Oracle课程小结.docx

    在实际工作中,我们还需要了解更多的高级特性,如索引、视图、触发器、存储过程、事务管理以及性能优化策略等,这些都是构建高效、安全和可扩展的数据库解决方案的基础。通过不断学习和实践,我们可以更好地驾驭...

    OracleASM常用知识小结

    ### Oracle ASM 常用知识小结 #### 一、ASM 概述 **ASM (Automatic Storage Management)** 是 Oracle 10g 引入的一种新型的存储管理技术,旨在为数据库提供高性能、高可用性以及易管理性的存储解决方案。通过 ASM...

    oracle 小结 sqlplus 系统表

    从给定的文件信息中,我们可以总结出一系列与Oracle数据库管理相关的知识点,涵盖SQL*Plus命令、系统表操作、性能优化、以及Oracle数据库的启动和关闭等关键领域。以下是详细的知识点归纳: ### SQL*Plus命令及性能...

    Oracle DBA优化数据库性能心得体会

    #### 小结 通过对Unix环境下Oracle数据库性能的深入监控和分析,我们能够更准确地定位并解决性能瓶颈。使用如`sar`这样的工具可以帮助我们监测系统的总体健康状况,而针对特定SQL语句的优化则可以通过改进执行计划...

    ORACLE9i_优化设计与系统调整

    §14.1 Oracle优化器 170 §14.2 SQL处理体系结构 171 §14.2.1 解析程序 171 §14.2.2 优化程序 172 §14.2.3 行源程序产生器 172 §14.2.4 SQL执行 172 §14.3 EXPLAIN PLAN 172 §14.4 选择优化器路径及目标 172 ...

    ORACLE数据库知识点小结

    ### ORACLE数据库知识点小结 #### 1. ORACLE DATABASE 10g的新特性 - **网格计算数据库**:Oracle 10g引入了网格计算的概念,允许在多个服务器之间共享资源,提高数据库的可用性和性能。 - **优化资源用量**:通过...

    让Oracle跑得更快 Oracle 10g性能分析与优化思路.part2.rar

    1.4 小结 19 第2章 锁和阻塞 20 2.1 关于锁 20 2.2 锁和阻塞 22 2.3 引起阻塞的其他情况 30 2.3.1 select for update 30 2.3.2 外键和索引 36 第3章 latch和等待 44 3.1 共享池中的latch争用 45 .3.2 数据缓冲池...

    Oracle Database 10g: 性能优化 第1卷 学习指南

    Oracle Database 10g: 性能优化 第1卷 学习指南 Oracle Database 10g: 性能...八、小结 性能优化是 Oracle Database 10g 的一个重要方面。通过学习和掌握性能优化技术,可以提高数据库的性能,提高业务效率和可靠性。

    Oracle课程小结[定义].pdf

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其在...理解DUAL表的用途、NULL值的特性以及各种函数的使用方式,将有助于我们在软件开发过程中更好地设计和优化数据库操作,从而提高应用程序的性能和稳定性。

    Oracle 数据库性能优化

    #### 小结 Oracle数据库性能优化是一个复杂的主题,涉及多个方面。通过对上述知识点的学习和实践,可以有效提升数据库的性能,满足日益增长的业务需求。同时,随着技术的不断发展,还需要持续关注Oracle的新特性,...

    oracle语句优化

    #### 一、Oracle优化器的选择与配置 **1.1 优化器类型** Oracle数据库提供了三种类型的优化器来帮助决定SQL语句的最佳执行计划: - **基于规则的优化器 (RULE)**: 这是最古老的优化器模式,它的决策基于一组预定义...

    让Oracle跑得更快 Oracle 10g性能分析与优化思路.part1.rar

    1.4 小结 19 第2章 锁和阻塞 20 2.1 关于锁 20 2.2 锁和阻塞 22 2.3 引起阻塞的其他情况 30 2.3.1 select for update 30 2.3.2 外键和索引 36 第3章 latch和等待 44 3.1 共享池中的latch争用 45 .3.2 数据缓冲池...

    (E文)基于成本的Oracle优化法则.pdf

    - **1.5 本章小结**:本章总结了成本的概念及其在Oracle优化器中的作用。 - **1.6 测试用例**:提供了测试用例以帮助理解成本计算的实际效果。 #### 第2章:表扫描 - **2.1 入门**:介绍表扫描的基本概念,包括全...

Global site tag (gtag.js) - Google Analytics