生产环境sql语句调优实战第三篇
生产环境有一条sql语句执行比较频繁,占用了大量的cpu资源。在一次排查中引起了我的注意,决定看看cpu消耗到底在哪儿?sql语句是比较简单的,通过查询SUBSCRIBER_FA_V是一个视图。在视图中关联了几个和业务核心表。SELECT TO_CHAR(SUBSCRIBER_NO) SUBSCRIBER_ID, SUB_STATUS, ...
生产环境sql语句调优实战第二篇
全表扫描 vs 索引
通过shell脚本定位性能sql和生成报告
oracle的sql monitor是一个很有用的工具集。但是通过sql命令和反复去调用dbms_tune来传入参数等等操作感觉挺费事的。可以通过如下的脚本来定位sql monitor中的性能sql,发现一些潜在的性能问题。这个脚本可以定位正在sql monitor监控范围内的sql语句。MONITOR_OWNER=`sqlplus -silent $DB_CONN_STR@$SH_DB_SID <<ENDse...
通过图表分析oracle的parallel性能
并行特性在数据库里对于性能的提升很有帮助,尤其是大批量的数据处理。今天对于并行的性能情况进行了简单的图表分析。为了能够比较合理的比较数据,对数据库里的2张大表进行了比对分析。测试的场景有以下两个。1.并行生成dump文件,比如一个大表有100G,使用并行,并行度为50 ,那么很可能会生成50个dump文件,每个dump...
SQL*Loader-805的解决
使用sql*loader是大型项目中数据迁移的利器。如果是外部系统,其他数据库到oracle的数据迁移,使用文本式文件是最兼容的方式。sqlldr的加载效率是很高的,同时在oracle 10g以后推出的oracle_loader效率也不容小视。sqlldr提供了额外的功能来生成external_table的创建和insert脚本,不过control file是关键,今天尝试的时...
sqlldr和oracle_datapump性能比较
针对之前在生产环境中使用sql*loader的性能问题,最近一直在想使用外部表的oracle_datapump来替代它。昨天下午做了大量数据的测试,比较了这两种方案。最后发现在一定的限定条件下,从很多细节来看 oracle_datapump要更胜一筹。首先使用sql*loader对于clob,blob的数据相比普通表的处理要一些额外的工作,但是这些限制或者...
创建用户时的密码校验问题
今天需要在测试环境中做一些性能测试,为了不影响原有的数据,准备创建一个临时的schema。但是创建的时候报了如下的错误。SQL> create user mig_perf identified by mig_perf;create user mig_perf identified by mig_perf*ERROR at line 1:ORA-28003: password verification for the specified password failedORA-2...
巧用xmltype解析clob数据
对于clob的数据,很多场合中都使用xml的格式,但是对于数据的查取和处理总是感觉力不从心。在条件允许的情况下,如果能够巧妙的使用xmltype来做数据处理,无意中是对于clob的一个处理利器。简单说下需求。数据库里存放的clob类似下面的格式<ObjectInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://...
生产环境大型sql语句调优实战第一篇(二)
继续昨天的部分,上一篇的链接为:http://blog.itpub.net/23718752/viewspace-1217012/对这条大sql的性能瓶颈进行了分析。主要瓶颈在于一个很大的业务表,数据量在亿级。如果通过时间条件来过滤,会有5%以内的数据被过滤出来。但是没有时间相关的索引字段,所以会走全表扫描,在目前的产品线中,这个大分区表的索引时严...
生产环境大型sql语句调优实战第一篇(一)
SELECT DISTINCT CA.L9_CONVERGENCE_CODE AS ATB2, CU.CUST_SUB_TYPE AS ACCOUNT_TYPE, CST.DESCRIPTION AS ACCOUNT_TYPE_DESC, SS....
sql monitor的使用(一)
在sql调优中,对于sql语句的实时监控显得尤为重要,如果某条sql语句的性能比较差。可能从前端的直观感觉就是执行时间比较长。对于dba来说,可能关注的相关因素需要多一些.1)可以通过top命令来监控sql的性能情况,查看cpu使用率较高的oracle process,然后通过查看session和process得绑定得到对应的session,然后得到对应的...
sql_profile的使用(一)
SQL> create table t1 as select object_id,object_name from dba_objects where rownum create table t2 as select * from dba_objects; Table created.SQL> create index t2_idx on t2(object_id);Index created.SQL> exec dbms_stats.gather_tabl...
使用shell脚本生成只读权限的sql脚本
目前做数据迁移,有8套不同的环境,为了保护环境,每个环境中的表,视图等开发都不能修改,只能通过连接用户去查询。每个环境中可能含有表,索引,序列,存储过程,函数等,所以一个一个写是不现实的,写了下面的动态脚本来自动生成相应的权限,然后创建对应的同义词。脚本会生成两个sql脚本,一个是owner用户赋予权限使...
关于权限设置的一个小把戏
现在有一个需求,需要开放一些"特殊“的权限给开发组。具体的背景是这样的:有三个数据库用户,tabowner, tabconn, tab_temp三个用户tableowner是owner用户,里面存放着表,索引,序列,存储过程等。tabconn是一个连接用户,在这个用户里面建立了一些同义词,可以直接通过这个用户来进行数据的增删改查。tab_temp是一...
关于sequence问题的紧急处理
今天早上收到邮件,说有一个很紧急的问题,是关于sequence的。错误日志里面还有ORA的错误----- ... 7 more Causedby: java.sql.SQLException: ORA-08004: sequence TRX_1SQ.NEXTVAL exceedsMAXVALUE and cannot be instantiated 猛一看就是sequence的值越界了。导致这个问题的原因主要...
使用动态变量进行动态数据比较
现在有一个需求,输入一串数,输入的数个数还不固定,需要得到最小的那个数和对应的下标如果说传入的数的个数固定,直接用for循环来得到最值 其实也不难。使用编程语言java,c等都可以实现。使用动态变量可以很方便的初始化多个变量,对传入的数进行统计和比较。动态变量的初始化有如下几种形式:param_no=$##初...
使用copy命令解决LONG类型的困扰
在oracle的数据类型中,long类型算是一个比较另类的典型,早就不建议使用了,但是在数据字典里还是能看到long 类型的影子。如果在一些工作中碰到long type就让人感觉long 类型像是被封杀了,会碰到不少的问题。比如数据字典user_constraints中包含了long类型的列。SQL> desc user_constraints Name &...
循序渐进调优union相关的sql
今天在生产中发现一条sql语句消耗了大量的cpu资源。 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND &...
对分区表导入导出的水平,垂直切分
在工作中有时候碰到一些分区表,业务数据量很大,可能几百G,上T的规模,而且做数据的导入导出的时候,会感觉到exp/expdp的时候生成的dump文件太大了,做导入的时候也是很重的负担。比如500G的dump,你在使用imp做导入的时候,别无选择,只能看着日志里partition里的数据一个一个被导入。impdp可能稍微好点,还能指定个并...
巧用parallel极速提升数据加载速度
并行在平时工作中可能不是很注意,因为有时候即使设定了parallel 相关的hint,感觉性能也好不到哪去。今天通过一个案例来分享一下通过parallel来使数据加载的速度达到极速提升。现有一个很让人头疼的表,里面还有clob字段,通过exp/imp来导出导入数据,导出慢还可以接受,导入的速度大概在一秒钟1000条的速度,对于千万,...