- 浏览: 1068550 次
- 性别:
- 来自: 长沙
文章分类
- 全部博客 (639)
- 服务器配置篇 (58)
- hibernate篇 (14)
- spring篇 (33)
- struts篇 (28)
- JS篇 (46)
- 其他技术篇 (46)
- 数据库集群配置 (6)
- JAVA基础相关 (48)
- 分布式框架HadHoop的应用 (2)
- FLEX篇 (8)
- SQLSERVER技术 (32)
- Android学习 (13)
- amchart学习笔记 (1)
- openfire+smark搭建即时通讯 (9)
- Linux学习 (18)
- Oracle数据库 (15)
- 网站优化技术 (12)
- mysql数据库 (2)
- 项目学习总结 (18)
- 工具类(JAVA) (12)
- 工具类(JS) (2)
- 设计模式 (10)
- Lucene学习 (24)
- EJB3学习 (6)
- Sphinx搜索引擎 (3)
- 工作中用到的软件小工具 (5)
- .NET (49)
- JAVA 连接SQLSERVER2008步骤 (1)
- MongoDB (19)
- Android手机开发 (3)
- Maven (6)
- vue (9)
- Shiro (4)
- mybatis (3)
- netty框架 (1)
- SpringCloud (3)
- spring-cloud (7)
- Git (1)
- dubbo (2)
- springboot (13)
- rocketmq (1)
- git学习 (2)
- kafka服务器 (2)
- linux (10)
- WEB系统辅助项目 (1)
- jenkins (2)
- docker (4)
- influxdb (3)
- python (2)
- nginx (1)
最新评论
-
jiangfuofu555:
这样数据量大,效率怎么样?
sqlserver 实现分页的前台代码 以及后台的sqlserver语句 -
w156445045:
博主请问下,如何做到实时的刷新呢,
另外我后台是Java 谢谢 ...
web 版本的汽车仪表盘,非常好看。还有各种图形 -
jackyin5918:
<transportConnector name=&qu ...
ActiveMQ的activemq.xml详细配置讲解 -
握着橄榄枝的人:
你这个不是spring1.x的吧
spring1.x使用AOP实例 -
xiaophai:
全乱套了!
openfire+spark搭建完美的及时通讯
删除一张表的重复记录(ID 是自增唯一主键,重复记录:其他字段都是一样)
(数据量很大,性能要求很高)
表名:T
Id name age
1 louis 20
2 louis 20
3 jimmy 30
4 louis 20
做法一:
Delete from t where id not in (Select min(id) from t Group by name,age);
做法二:
delete from t where id in(Select distinct a2.id from t a1,t a2 where a1.id>a2.id and a1.name=a2.name and a1.age=a2.age);
做法三:
delete from t a1 where not exists(select *
from t a2
where a1.id>a2.id and a1.name=a2.name and a1.age=a2.age
);
前提数据量>100,0000
以上三种做法,均可。但是第三种做法的性能最佳。第一种用 not in 没办法用到索引.第三 种方式也不会用到索引
数据量 1000 100000 100,0000 方法一 0.047 3.77 72
方法二 0.286 5.77 65
第二种方式快于第一种方式。
SQL 优化的实质就是在结果正确的前提下,用优化器可以识别的语句,充份利用索引,执 行过程中访问尽量少的数据块,减少表扫描的 I/O 次数,尽量避免全表扫描和其他额外开 销。
oracle 数据库常用的两种优化器:RBO(rule-based-optimizer)和 CBO(cost-based-optimizer)。 目前更多地采用 CBO(cost-based-optimizer)基于开销的优化器。在 CBO 方式下,Oracle 会 根据表及索引的状态信息来选择计划;在 RBO 方式下,Oracle 会根据自己内部设置的一些
Oracle 教程
规则来决定选择计划,例如 oracle 会根据以下优先级来选择执行计划(越靠前,rank 越低, 越快):
17.1、尽量少用 IN 操作符
基本上所有的 IN 操作符都可以用 EXISTS 代替,在选择 IN 或 EXIST 操作时,要根据主子 表数据量大小来具体考虑
17.2、尽量用 NOT EXISTS 或者外连接替代 NOT IN 操作符
因为 NOT IN 不能应用表的索引
17.3、尽量不用“<>”或者“!=”操作符
不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。比如:a<>0
改为 a>0 or a<0
17.4、在设计表时,把索引列设置为 NOT NULL
判断字段是否为空一般是不会应用索引的,因为 B 树索引是不索引空值的。
17.5、尽量不用通配符“%”或者“_”作为查询字符串的第一个字符
当通配符“%”或者“_”作为查询字符串的第一个字符时,索引不会被使用。比如用 T 表中 Column1 LIKE „%5400%‟ 这个条件会产生全表扫描,如果改成 Column1 ‟X5400%‟ OR Column1 LIKE ‟B5400%‟ 则会利用 Column1 的索引进行两个范围的查询,性能肯定大大提 高。
17.6、Where 子句中避免在索引列上使用计算
如果索引不是基于函数的,那么当在 Where 子句中对索引列使用函数时,索引不再起作用。 因此 Where 子句中避免在索引列上使用计算。
比如:
substr(no,1,4)=‟5400‟,优化处理:no like „5400%‟
trunc(hiredate)=trunc(sysdate) , 优 化 处 理 : hiredate >=trunc(sysdate) and hiredate
<trunc(sysdate+1)
17.7、用“>=”替代“>”
大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找,但有 的情况下可以对它进行优化,如一个表有 100 万记录,一个数值型字段 A, 30 万记
Oracle 教程
录的 A=0,30 万记录的 A=1,39 万记录的 A=2,1 万记录的 A=3。那么执行 A>2 与 A>=3 的效果就有很大的区别了,因为 A>2 时 ORACLE 会先找出为 2 的记录索引再 进行比较,而 A>=3 时 ORACLE 则直接找到=3 的记录索引
17.8、利用 SGA 共享池,避开 parse 阶段
同一功能同一性能不同写法 SQL 的影响 如一个 SQL 在 A 程序员写的为
Select * from zl_yhjbqk
B 程序员写的为
Select * from dlyx.zl_yhjbqk(带表所有者的前缀)
C 程序员写的为
Select * from DLYX.ZLYHJBQK(大写表名)
D 程序员写的为
Select * from DLYX.ZLYHJBQK(中间多了空格)
以上四个 SQL 在 ORACLE 分析整理之后产生的结果及执行的时间是一样的,但是从 ORACLE 共享内存 SGA 的原理,可以得出 ORACLE 对每个 SQL 都会对其进行一次分析, 并且占用共享内存,如果将 SQL 的字符串及格式写得完全相同则 ORACLE 只会分析一次, 共享内存也只会留下一次的分析结果,这不仅可以减少分析 SQL 的时间,而且可以减少共 享内存重复的信息,ORACLE 也可以准确统计 SQL 的执行频率。
不同区域出现的相同的 Sql 语句要保证查询字符完全相同,建议经常使用变量来代替常量, 以尽量使用重复 sql 代码,以利用 SGA 共享池,避开 parse 阶段,防止相同的 Sql 语句被 多次分析,提高执行速度。
因此使用存储过程,是一种很有效的提高 share pool 共享率,跳过 parse 阶段,提高效率的 办法。
17.9、WHERE 后面的条件顺序要求
WHERE 后面的条件,表连接语句写在最前,可以过滤掉最大数量记录的条件居后。 比如:
Select * from zl_yhjbqk where dy_dj = '1KV 以下' and xh_bz=1
Select * from zl_yhjbqk where xh_bz=1 and dy_dj = '1KV 以下'
以上两个 SQL 中 dy_dj(电压等级)及 xh_bz(销户标志)两个字段都没进行索引,所 以执行的时候都是全表扫描,第一条 SQL 的 dy_dj = '1KV 以下'条件在记录集内比率为 99%,
而 xh_bz=1 的比率只为 0.5%,在进行第一条 SQL 的时候 99%条记录都进行 dy_dj 及 xh_bz
Oracle 教程
的比较,而在进行第二条 SQL 的时候 0.5%条记录都进行 dy_dj 及 xh_bz 的比较,以此可以 得出第二条 SQL 的 CPU 占用率明显比第一条低。
17.10、使用表的别名,并将之作为每列的前缀
当在 Sql 语句中连接多个表时,使用表的别名,并将之作为每列的前缀。这样可以减少解 析时间
17.11、进行了显式或隐式的运算的字段不能进行索引
比如:
ss_df+20>50,优化处理:ss_df>30
„X‟||hbs_bh>‟X5400021452‟,优化处理:hbs_bh>‟5400021542‟
sk_rq+5=sysdate,优化处理:sk_rq=sysdate-5
hbs_bh=5401002554,优化处理:hbs_bh=‟ 5401002554‟,注:此条件对 hbs_bh 进行隐 式的 to_number 转换,因为 hbs_bh 字段是字符型。
17.12、用 UNION ALL 代替 UNION
UNION 是最常用的集操作,使多个记录集联结成为单个集,对返回的数据行有唯一性要求, 所以 oracle 就需要进行 SORT UNIQUE 操作(与使用 distinct 时操作类似),如果结果集又 比较大,则操作会比较慢;
UNION ALL 操作不排除重复记录行,所以会快很多,如果数据本身重复行存在可能性较
小时,用 union all 会比用 union 效率高很多!
17.13、其他操作
尽量使用 packages: Packages 在第一次调用时能将整个包 load 进内存,对提高性能有帮 助。
尽量使用 cached sequences 来生成 primary key :提高主键生成速度和使用性能。 很好地利用空间:如用 VARCHAR2 数据类型代替 CHAR 等
使用 Sql 优化工具:sqlexpert;toad;explain-table;PL/SQL;OEM
17.14、通过改变 oracle 的 SGA 的大小
SGA:数据库的系统全局区。
SGA 主要由三部分构成:共享池、数据缓冲区、日志缓冲区
racle 教程
1、 共享池又由两部分构成:共享 SQL 区和数据字典缓冲区。共享 SQL 区专门 存放用户 SQL 命令,oracle 使用最近最少使用等优先级算法来更新覆盖;数据字 典缓冲区(library cache)存放数据库运行的动态信息。数据库运行一段时间后, DBA 需要查看这些内存区域的命中率以从数据库角度对数据库性能调优。通过执 行下述语句查看:
select (sum(pins - reloads)) / sum(pins) "Lib Cache" from v$librarycache;
--查看共享 SQL 区的重用率,最好在 90%以上,否则需要增加共享池的大小。 select (sum(gets - getmisses - usage - fixED)) / sum(gets) "Row Cache" from v$rowcache;
--查看数据字典缓冲区的命中率,最好在 90%以上,否则需要增加共享池的大小。
2、 数据缓冲区:存放 sql 运行结果抓取到的 data block;
SELECT name, value FROM v$sysstat WHERE name IN ('db block gets',
'consistent gets','physical reads');
--查看数据库数据缓冲区的使用情况。查询出来的结果可以计算出来数据缓冲区 的使用命中率=1 - ( physical reads / (db block gets + consistent gets) )。命中率应该
在 90%以上,否则需要增加数据缓冲区的大小。
3、 日志缓冲区:存放数据库运行生成的日志。
select name,value from v$sysstat where name in ('redo entries','redo log space requests');
--查看日志缓冲区的使用情况。查询出的结果可以计算出日志缓冲区的申请失败
率:申请失败率=requests/entries,申请失败率应该接近于 0,否则说明日志缓冲 区开设太小,需要增加 ORACLE 数据库的日志缓冲区。
发表评论
-
oracle 编写记录
2011-02-18 15:18 926记录类型是把逻辑相关的数据作为一个单元存储起来,它必须包括至少 ... -
oracle 编写存储过程
2011-02-17 16:16 1032create or replace procedure myp ... -
oracle 创建函数
2011-02-17 14:23 1303函数就是一个有返回值的过程。 定义一个函数:此函数可以根据 ... -
oracle 使用游标
2011-02-17 11:32 1311DECLARE cursor mycur is select ... -
plsql 中文版安装
2011-02-17 09:20 1167http://allroundautomations.swmi ... -
plsql developer 中文文档
2011-02-16 09:32 1109plsql developer 中文文档 -
oracle 索引管理
2011-02-15 17:09 1763select * from user_indexes ... -
oracle 数据字典
2011-02-15 16:25 948查询某用户下所有表 select table ... -
Oracle中over()函数的使用
2011-02-15 16:10 1250oracle中over() 函数用法 ,将自己的研究结果记录 ... -
随机返回5条记录
2011-02-15 15:13 1107select * from (select * from em ... -
PLSQL Developer 注册码/序列号
2011-02-14 08:33 1896PLSQL Developer 注册码/序列号; 把 aalf ... -
oracle 学习文档
2010-12-31 23:41 900多大 -
高效删除Oracle数据库中重复数据的方法
2010-08-27 09:38 1547重复数据删除技术可以提供更大的备份容量,实现更长时间的数据保留 ... -
Java 调用ORACLE存储过程
2010-08-21 06:56 10731、什么是存储过程。存储过程是数据库服务器端的一段程序,它有两 ...
相关推荐
《Oracle优化日记——一个金牌DBA的故事》这本书深入浅出地揭示了Oracle数据库优化的精髓。作为一名金牌DBA,作者以其丰富的实战经验,通过一系列的实际案例,讲述了在Oracle数据库管理与优化过程中的种种挑战和解决...
### Oracle优化重量级知识点解析 #### 一、Oracle优化的重要性 在数据库管理领域,Oracle数据库因其卓越的性能、稳定性和安全性而被广泛采用。然而,随着业务量的增长和技术的发展,即使是像Oracle这样的顶级...
在这篇文章中,我们将详细探讨针对Oracle数据库性能问题和故障的诊断案例,并分享如何通过案例分析来优化性能和解决问题。 首先,我们来看看什么是Oracle的cardinalityFeedback问题。在Oracle中,基数反馈是优化器...
盖国强在其个人网站www.eygle.com上分享了大量的Oracle技术知识,其中就包括关于Oracle优化工具的介绍。 #### 二、Oracle优化工具的发展历程 从早期的Statspack到后来的ADDM,Oracle优化工具经历了多次迭代和升级...
《Oracle优化日记》是两本深入探讨Oracle数据库性能优化的专业书籍,由金牌DBA撰写,旨在分享其在实际工作中的经验和技巧。Oracle优化是数据库管理中的核心任务,它关乎系统的响应速度、资源利用率以及整体性能。这...
《Oracle优化日记:一个金牌DBA的故事》这本书深入探讨了Oracle数据库的性能优化技术,是DBA们不可或缺的参考资料。作者通过自身丰富的实战经验,分享了一系列解决实际问题的方法和策略,帮助读者理解Oracle数据库的...
本文主要分享了作者在Oracle数据库优化方面的一些心得和经验。 首先,优化工作通常从SQL层面开始,这包括使用正确的索引、应用ORACLE提示等策略。SQL优化是数据库优化的基础,因为不高效的SQL语句可能导致CPU利用率...
Oracle优化器** Oracle的优化器负责选择执行计划,常见的有基于规则的优化器(RBO)和成本基优化器(CBO)。CBO通常更先进,根据统计信息计算成本来选择最佳执行路径。 **8. 执行计划分析** 分析执行计划可以帮助...
这里可能会有关于Oracle数据库优化的最新文章、实战案例和技术分享,对提升个人技能和解决问题都有很大的帮助。 综上所述,Oracle数据库的高性能优化涉及多个方面,需要综合考虑SQL语句优化、数据库结构设计、系统...
大量优化实战方法:将主要SQL优化点一一剖析,分享大量SQL优化的实际工作经验 50余改写调优案例:覆盖大多数DBA日常工作场景,具有相当大的实用价值 技巧+案例:可以作为DBA的参考手册,也可以作为开发人员编写SQL...
内容简介《Oracle优化日记:一个金牌DBA的故事》是一本介绍Oracle数据库优化方法的书,以一个实际的大型优化项目为原型,用日记的形式记录了一个优化小组的DBA 如何从纷繁的头绪中找到突破口,进而完成了一个看似不...
本文档主要介绍了几个由黄远邦分享的Oracle优化案例,包括SQL优化、SQL改写优化、实例优化、操作系统与I/O优化以及架构优化等方面的内容。通过对这些案例的学习,可以深入了解Oracle性能调优的方法和技术。 #### ...
内训ppt分享,介绍了oracle架构,优化经验,执行计划与awr简介
以下是一些在实际应用中常用的Oracle优化原理和经验分享。 首先,SQL优化是Oracle数据库性能提升的核心。通过分析慢查询日志,我们可以找出执行效率低下的SQL语句,然后进行优化。这可能包括重构查询以减少全表扫描...
这篇“Oracle使用经验”分享了关于Oracle的一些实用技巧和深入理解,对于数据库管理员(DBA)和开发人员来说,这些都是非常宝贵的知识点。以下是对这些内容的详细解析: 1. **Oracle基础知识**: - Oracle是一个...
在Oracle数据库管理与优化的过程中,积累了一系列实用的经验技巧,以下将针对部分核心知识点进行详细介绍。 #### 1. 删除表空间(Tablespace) 在Oracle中,删除一个表空间可以通过`DROP TABLESPACE`命令实现。...
本课件旨在分享关于PL/SQL优化的一些实践经验,并提供在实际工作中的指导。 首先,索引是提升SQL查询效率的关键。然而,索引并非越多越好,而应该根据实际需求合理创建。B*Tree是最常见的索引类型,还有反向索引、...
其次,"zxbc.cn.txt"可能是一份笔记或者经验分享,可能是作者在实践中总结的Oracle性能优化的实用经验和窍门。这可能包括特定问题的解决案例、最佳实践,或者是对某些复杂场景的独特见解。这部分内容可能更加实战化...
三位经验丰富的顶级oracle dba 再次联手,为读者呈现这本oracle 数据库性能优化攻略。本书由表及里地深入分析了造成oracle 数据库性能缓慢的各种原因,然后给出标本兼治的性能调优方案。作者将多年的实践经验和个人...