最重要一点,ORACLE的高速缓冲是全字符匹配的,什么意思呢,看下面三个select
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)
相关推荐
Oracle10g数据库优化实用心得小结。里面各种优化方法,还是可以。
oracle性能优化建议小结,汇总各个部分的资料
Oracle sql优化的一些常用方法与注意事项
目录 推荐序 前言 第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本章小结
oracle9i小结 46 Oracle 数据库的聚簇技术 61 数据库、服务名、实例 63 Oracle内存结构 64 sys用户和system用户 67 Oracle SQL语句 67 GROUPING SETS分组 74 Oracle外部程序触发 75 Oracle数据库的备份与恢复 77 ...
§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 ...
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 数据缓冲池...
1.5 本章小结 8 1.6 测试用例 8 第2章 表扫描 9 2.1 入门 10 2.2 提高 14 2.2.1 块大小的影响 14 2.2.2 CPU成本计算 16 2.2.3 CPU成本计算的作用 22 2.3 BCHR 24 2.4 并行执行 27 2.5 索引快速全扫描 30 2.6 分区 32...
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 数据缓冲池...
第1章 Oracle安装配置(教学视频:10分钟) 23 1.1 Oracle简介 23 1.1.1 数据库术语 23 1.1.2 主流数据库简介 24 1.1.3 Oracle数据库的特点 24 1.2 安装Oracle数据库 25 1.2.1 Oracle数据库的版本变迁及安装...
2.5 小结 5 3 SQL语句的TUNING经验分享: 6 3.1 绝大多数情况下NOT EXISTS比NOT IN 效率高 6 3.2 UNION ALL效率比UNION高很多 6 3.3 一些很耗资源的SQL操作,在不必要的情况下不要使用 6 3.4 通常联接查询比子查询的...
小结 1-20 2 配置 Oracle Recovery Manager 课程目标 2-2 备份和恢复:概述 2-3 Oracle Recovery Manager 的功能 2-4 Oracle Recovery Manager 组件 2-6 配置 RMAN 的步骤 2-8 RMAN 资料档案库数据存储:...
1.4 小结 第2章 Oracle体系架构 2.1 Oracle的网络配置 2.2 Oracle 10g架构 2.3 数据库 2.4 空间管理 2.5 实例 2.6 未尽话题 第3章 备份恢复 3.1 归档模式和非归档模式 3.2 备份概述...
1.10 小结 24 第2章 SQL执行 25 2.1 Oracle架构基础 25 2.2 SGA-共享池 27 2.3 库高速缓存 28 2.4 完全相同的语句 29 2.5 SGA-缓冲区缓存 32 2.6 查询转换 35 2.7 视图合并 36 2.8 子查询解嵌套 39 2.9 ...