性能优化
文章平均质量分 57
luckman100
这个作者很懒,什么都没留下…
展开
-
做sql性能测试时要注意的小问题
一。做sql优化测试的时候你可能会遇到这样一种情况:对表insert,测完后再delete,再insert,delete。。。。这样几次后发现sql执行越来越慢,究竟是sql写的越来越有问题,还是其他问题,有时候甚至sql不变也会遇到这样的情况。下面我们来看看到底是怎么回事:1.创建表testSQL> create table test as select object_id,object原创 2013-05-16 21:12:23 · 909 阅读 · 0 评论 -
删除大数据量表的列的一个好方法
很多开发的朋友可能遇到过这样的情况:一个数据量很大的表,业务需要添加一个字段(添加字段很快),在测试环境测试以后,还想再做一遍,就需要删除这个字段,这时纠结的问题发生了:删除字段是如此漫长,而且最后经常会无缘无故中断了,白花花的几个小时就这么浪费了,还搞的心情很烦躁。。。。今天发现了一个好方法,这里跟大家分享一下:造成删除字段失败的很大原因是回滚段被耗尽,下面看看我的测试:1. 建两个结构和数原创 2013-07-22 21:27:46 · 1771 阅读 · 0 评论 -
数据集之间处理的好方法
当你遇到用一个数据集的数据去DML另一个数据集数据的时候,一般我们都会想到用游标,但游标有个致命的缺点,不能处理大批量数据,因为如果循环过多,会造成大量的PL/SQL与SQL之间的转化,是很耗费性能的。也许你会想到用采用bulk collect可以将查询结果一次性地加载到collections中,这样会对性能有些提高,但不明显。最好的办法就是用oracle提供的merge 方法,会让你的性能得到很原创 2013-08-01 22:07:28 · 731 阅读 · 0 评论 -
如何查看共享池中不存在的执行计划
我们一般会用select * from table(dbms_xplan.display_cursor('c0q6wv27b51yh'));来查看sql语句实际执行时的执行计划。但是要知道这个sql有个前提,就是执行计划还存在于共享池中,而共享池是不断被置换的,一段时间后这个执行计划就可能查不到了,上面的语句查出来的结果可能就是:SQL_ID: c0q6wv27b51yh, child num原创 2013-07-13 23:26:21 · 1172 阅读 · 0 评论 -
对已知sql的优化方法
如果知道了哪个SQL有性能有问题,可以通过以下3种方法来分析:1. setautotrace trace exp stat 可以看到sql语句的执行计划和统计数据; 注意是否采用动态采样---dynamic sampling used for this statement; 关闭:setautotrace off; 显示内容: ExecutionPlan-原创 2013-05-16 22:36:37 · 687 阅读 · 0 评论 -
一条sql引起的UNDO性能灾难
今天在生产环境出现了个很大的问题,所有系统都表现出运行很慢的状况,后来DBA定位到一句sql,跑了5W多次,消耗了50G的UNDO空间!导致所有系统都运行缓慢,并同时出现快照过旧的ORA错误。一开始大家都不敢相信,这条sql会造成这么大的影响,因为这个表一共才不到1千万的数据量,即使全部更新了,也不会消耗这么大的UNDO。后来大家开始分析,发现这条sql真的是有问题,本意在循环里面,逐条更新记录,原创 2013-08-26 23:02:12 · 1056 阅读 · 0 评论 -
all_tab_modifications
当我们需要统计一个表被操作的次数时,有个很重要的视图:all_tab_modifications,它会提供一个表的被操作(insert,update,delete等)的统计信息,看下官方说明:ALL_TAB_MODIFICATIONS describes tables accessible to the current user that have been modified since原创 2013-11-10 22:26:21 · 2516 阅读 · 0 评论 -
为什么plsql developer长时间执行sql会通信中断(2)
今天做一个大数据量的DML操作时,通过观察UNDO空间的大小,发现UNDO空间不足是引发通信中断的一个原因!!下面描述一下我观察的过程:1. 首先观察UNDO表空间的大小,发现在做DML操作时,UNDO表空间越来越少,虽然其对应的数据文件是能自动扩展的,但可能是物理空间已满,UNDO表空间并没有自动扩展SELECT a.TABLESPACE_NAME, sum(a.by原创 2013-07-13 13:34:02 · 1950 阅读 · 0 评论 -
为什么plsql developer长时间执行sql会通信中断(1)
当plsql developer长时间执行脚本时会发现一个问题:就是会遇到ora-03113通信中断的问题,很是烦躁!有人说是服务器端设置了连接超时时间,看下:SQL> show parameters resource_limit NAME TYPE VALUE--------------------原创 2013-07-08 20:08:58 · 6566 阅读 · 0 评论 -
如何固定执行计划
在遭遇执行计划不稳定或者执行计划错误的情况下,通过baseline来固定SQL执行计划以确保执行计划稳定性、提高性能。baseline是oracle 11G提供的稳固sql执行计划的功能,是spm功能的一部分。步骤如下:[html] view plaincopySQL> set linesize 1000 SQL> col in转载 2014-06-29 11:56:47 · 1926 阅读 · 0 评论 -
由 bind_mismatch 引起的 大量 version_count 问题
从AWR报告里发现一个SQL存在大量的version_count. SYS@xezf(qs-xezf-db1)> select sql_id,version_count from v$sqlarea where version_count> 500 order by 2 desc ; SQL_ID VERSION_COUNT------------- ------转载 2014-06-29 11:13:28 · 1111 阅读 · 0 评论 -
Adaptive Cursor Sharing(ACS)
Adaptive Cursor Sharing(ACS)是又一个大胆而吸引人的11G新特性。说它大胆是因为它试图解决一个CBO最令人头疼的问题:数据倾斜(data skew)和绑定变量窥视导致SQL PLAN太差。说它吸引人是因为想知道Oracle采用何种神秘的算法让Oracle变得更加智能。 之所以在11GR2出来之后才开始研究,是因为这个new feture在11GR1时转载 2014-06-30 12:20:01 · 833 阅读 · 0 评论 -
字段类型修改引起的性能问题
今天在生产环境一段平时表现良好的原创 2014-05-30 23:26:27 · 1054 阅读 · 0 评论 -
一次merge的优化经验
现在我们生产环境有这么个性能问题:suiz原创 2014-09-02 23:37:34 · 4479 阅读 · 0 评论 -
序列的性能问题
在RAC环境中,序列的Cache问题可能会对性能有着决定性的影响,缺省的序列Cache值为20,这对RAC环境远远不够。如果存在序列号使用的竞争,就可能在数据库中看到明显的队列等待:enq: SQ - contention在RAC情况下,可以将使用频繁的序列Cache值增加到10000,或者更高到50000,这些值在客户的环境中都有采用。这是RAC设置和RAC使用的基本常识,不转载 2014-12-11 21:39:13 · 956 阅读 · 0 评论 -
用exists代替max
今天做了一个视图的性能优化,用户使用这个视图一般是通过create_date这个字段来查询资料,而且create_date是视图基表的索引,按理说用create_date可以快速查到资料,然而,视图sql的create_date前面用到了max,导致基表的create_date索引根本用不上,造成大量的全表扫描,用户感觉很慢。。。。优化思路很明确,就是要让create_date这个索引能够用上原创 2013-07-20 18:48:52 · 1223 阅读 · 0 评论 -
回滚段测试
今天做了个回滚段的测试,来观察回滚段的使用情况:1. 先看回滚段的一些设置:自动扩展关闭,回滚段使用率达到99%,undo表空间的RETENTION为NOGUARANTEE(即不一定保证undo_retention设置的undo保留时间)SQL> SELECT t.TABLESPACE_NAME,t.AUTOEXTENSIBLE FROM Dba_Data_Files t WHERE t.原创 2013-07-21 18:22:46 · 1487 阅读 · 0 评论 -
注意脚本中的‘/’命令符
我们在写脚本时,有时会在最后加上一个‘/’ 命令,有时不加。那到底什么时候需要加,什么时候不用了,下面我们来总结下。有两个脚本:1.sqlINSERT INTO t1 VALUES (1);COMMIT;/2.sqlBEGIN INSERT INTO t1 VALUES (1); COMMIT;END;/分别执行1.sql和2原创 2013-07-04 21:33:54 · 1014 阅读 · 0 评论 -
包编译卡住的终极解决办法
在数据库开发过程中,经常遇到一个很烦躁的现象:刚修改好的包一编译就卡死了,PL/SQL变成一片空白,又不忍心关闭,这可是耗死多少脑细胞才写出来的!!!只好去求DBA帮忙解决,可是人家也不是每次都会耐心帮你解决,结果经常碰一鼻子灰,所以了,求人不如求己,下面就让我们自己学会去解决这个烦人的问题。。首先我们先了解下与这种卡死现象相关的几个视图:1)v$accessV$ACCESS disp原创 2013-05-19 11:29:00 · 6560 阅读 · 0 评论 -
commit的误解
1.大事务(DML处理大批量数据)后的commit会比小事务后的commit慢 要搞清楚这个问题,首先要理解commit时,oracle要做哪些工作: 1)LGWR将log buffer中所有剩余的重做记录写进联机重做日志文件(log file),为事务新生成一个SCN,并将这个SCN也写进重做日志文件,此时该事务从V$TRASACTION中删除,该事务完成; 2)将该会话原创 2013-05-15 23:50:24 · 1228 阅读 · 0 评论 -
大批量数据删除的几种方法PK
今天一上班老板就分配个任务,要把一个大表(约8千万)的垃圾数据(约六千万)的数据干掉,总结了几个方法,下面来PK下。1.直接加并行度删除(parallel)delete/*+parallel(t 5)*/ t where *******跑了5个小时,不合格2. 删除索引,再用并行度,最后重建索引drop index A;delete/*+parallel(t原创 2013-05-20 21:54:27 · 1625 阅读 · 0 评论 -
批量insert语句的执行技巧
今天为了测试一个生产环境的问题,需要将生产环境的数据导入到测试库做测试。找DBA拿了个insert脚本(大概有8万条insert语句,也许你会认为用DBLINK多方便呀,但是正规的生产环境是不允许你用DBLINK直接连接的),用plsql developer和sqlplus分别试了下,原来效果差别这么大!!!1. 直接用plsql developer-->command window原创 2013-05-27 23:05:43 · 2984 阅读 · 0 评论 -
开发中需要关注下回滚段
开发过程中,执行一个大事务时,会发现可能存在性能问题,这里我们一起来关注下回滚段的变化情况,看看AUM(Auto Undo Management)是如何工作的。查看回滚段的信息:SELECT a.USN,--ID号 b.segment_name, --回滚段名 a.RSSIZE, --回滚段大小 a.原创 2013-05-27 22:42:00 · 761 阅读 · 0 评论 -
NOLOGGING的正确用法
今天在看以前一些工作文档,发现有些DML脚本,用到了nologging的hint,即/*+NOLOGGING*/,这样写到底能不能减少日志量了??带着疑问,我做了以下测试:1. 直接update,看redo量SQL> create table a as select * from dba_objects;Table created.SQL> set autotrace tr原创 2013-06-11 23:44:17 · 14234 阅读 · 1 评论 -
MAX函数的小陷阱
MAX(num1)函数是我们在开发过程中,经常要打交道的一个函数,大家都知道它能返回列num1的最大值,当用到select MAX(num1) from a时,如果结果集a为空,max函数还是有返回值的,只不过这个返回值为空!!SQL> truncate table t1;Table truncated.SQL> select max(object_id) from t1;原创 2013-06-12 00:23:08 · 1258 阅读 · 0 评论 -
create table ***as select ***并行度用在哪里更快
现在需要用create table ***as select ***建个新表,大家都知道,用并行度可以加快建表的速度,但是create可以用并行度,select也可以用并行度,那么假设同样的并行度只能用在一个地方,到底用在哪里会快些了???我们来做个试验。。。。1. 建基础表test1create table as select object_id,object_name from dba原创 2013-06-15 23:12:21 · 7071 阅读 · 1 评论 -
alter session enable parallel dml
之前我一直不理解为什么做并行DML之前要加上:alter session enable parallel dml,因为有一个假象蒙蔽了我:下面的执行计划是没有执行alter session enable parallel dml产生的:EXPLAIN PLAN FOR UPDATE/*+parallel(t 8)*/ test1 t SET object_id=1;SELECT *原创 2013-06-16 00:11:41 · 17826 阅读 · 0 评论 -
大表添加有默认值的列
今天有个大表(数据量大约2亿),要添加一列a,默认值为0,下面有几种方法供大家参考下。1. 一般的老方法 alter table test add column a default 0;-----人都等老2. 用并行度添加列 alter table test parallel 8 add column a default 0;----可以接受3. 先添加列,再并行u原创 2013-06-17 22:27:01 · 912 阅读 · 0 评论 -
为何加索引后反而更慢
一个大表(约3千万数据量)有个status字段,只有不同的几个值。我在这个字段加了索引,结果执行计划仍是全表扫描,但是执行时间比之前没加索引的全表扫描更加慢了!!!这是为什么了,执行计划没有用到索引而是全表扫描,这个好理解,因为status上不同值占总数据量的比列很小,用索引显然是需要更高的代价,所以选择了全表扫描。。。。这里同样的是全表扫描,加索引后更加慢的原因,我是这样理解的:因为加了索引原创 2013-06-22 13:11:52 · 8925 阅读 · 0 评论 -
如何看回滚段的回滚进度
我们在rollback一段DML操作或DML操作失败后,都会自动进行回滚。所以你必须耐心等待事务回滚结束后,才能再次进行DML操作,否则将会死锁。但是回滚是系统自动完成的,我们应该如何去得知回滚进度呢?看下面的实验1. 新建一个千万级数据量表test2;2. 删除test2 DELETE FROM test2;3. 观察事务使用数据块的情况: SELECT t.US原创 2013-07-08 21:28:04 · 7452 阅读 · 0 评论 -
shrink
开发过程中有时会遇到这样的问题:表的数据并不多,但是全表扫描时为什么耗时那么久?这时候你就需要看看HWM的情况了,因为影响全表扫描的一个重要因素就是HWM,每次全表扫描就是扫描HWM以下的数据块。来做个试验:1. 建个表test,用show_space看数据块的分布情况:可以看到刚刚建立的表数据块还是分布的很结实的total_blocks: 24576total_bytes: 2013原创 2013-06-23 22:51:46 · 1201 阅读 · 0 评论 -
减少接口表的数量是否能有效提高集成性能?
系统开发过程中,我们经常遇到这样的问题:接口表的数量越来越多,性能越来越慢。想要提高集成效率,减少接口表的数量是否是一种好的方法了??我们来验证一下:1. 用test2来模拟接口表SQL> select count(1) from test2; COUNT(1)---------- 49804002. 查询id=100,看消耗时间以及逻辑读和物理读情况SQ原创 2013-06-23 22:18:26 · 714 阅读 · 0 评论 -
大表的索引问题
最新系统生产环境的性能发现有所下降,把sql提出来,发现是在程序备份的时候耗时明显增多(备份时是用insert select语句)。经过排查,执行计划是稳定的,而且select出来数据还是很快,所以初步定位为插入时性能有问题。看了下表的情况,表的数据达到9亿,再看了下索引情况:索引结构达到5层,叶子块达到400多万个数据块!这就是慢的原因所在。就好像一本书,如果书的页数越来越多,对应的目录也就越来原创 2015-02-08 21:55:41 · 658 阅读 · 0 评论