`

ORACLE学习笔记--性能优化

阅读更多
1. 查询正在执行语句的执行计划(也就是实际语句执行计划)select * from v$sql_plan where hash_value = (select sql_hash_value from v$session where sid = 1111);其中id和parent_id表示了执行数的结构,数值最大的为最先执行比如ID PARENT_ID-------------01 02 13 24 3
5 46 3则执行计划树为 0 1 2 3 6 4 52.如何设置自动跟踪

用system登录执行$Oracle_HOME/rdbms/admin/utlXPlan.sql创建计划表执行$ORACLE_HOME/sqlplus/admin/plustrce.sql创建plustrace角色假如想计划表让每个用户都能使用,则SQL>create public synonym plan_table for plan_table;SQL> grant all on plan_table to public;假如想让自动跟踪的角色让每个用户都能使用,则SQL> grant plustrace to public;通过如下语句开启/停止跟踪SET AUTOTRACE ON OFF ON EXPLAIN ON STATISTICS TRACEONLY TRACEONLY EXPLAIN3.如何跟踪自己的会话或者是别人的会话

跟踪自己的会话很简单Alter session set sql_trace truefalseOrExec dbms_session.set_sql_trace(TRUE);假如跟踪别人的会话,需要调用一个包exec dbms_system.set_sql_trace_in_session(sid,serial#,truefalse)跟踪的信息在user_dump_dest 目录下可以找到或通过如下脚本获得文件名称(适用于Win环境,假如是unix需要做一定修改)SELECT p1.value“\“p2.value“_ora_“p.spid“.ora“ filenameFROMv$process p,v$session s,v$parameter p1,v$parameter p2

WHERE p1.name = “user_dump_dest“AND p2.name = “db_name“AND p.addr = s.paddrAND s.audsid = USERENV (“SESSIONID“)最后,可以通过Tkprof来解析跟踪文件,如Tkprof 原文件 目标文件 sys=n4.怎么设置整个数据库系统跟踪其实文档上的alter system set sql_trace=true是不成功的,但是可以通过设置事件来完成这个工作,作用相等alter system set events“10046 trace name context forever,level 1“;假如关闭跟踪,可以用如下语句alter system set events

“10046 trace name context off“;其中的level 1与上面的8都是跟踪级别level 1:跟踪SQL语句,等于sql_trace=truelevel 4:包括变量的具体信息level 8:包括等待事件level 12:包括绑定变量与等待事件5.怎么样根据OS进程快速获得DB进程信息与正在执行的语句有些时候,我们在OS上操作,象TOP之后我们得到的OS进程,怎么快速根据OS信息获得DB信息呢?我们可以编写如下脚本:$more whoit.sh#!/bin/shsqlplus /nolog 100,cascade=> TRUE);dbms_stats.gather_table_stats(User,TableName,degree => 4,cascade => true);

这是对命令与工具包的一些总结<1>、对于分区表,建议使用DBMS_STATS,而不是使用Analyze语句。a) 可以并行进行,对多个用户,多个Tableb) 可以得到整个分区表的数据和单个分区的数据。c) 可以在不同级别上Compute Statistics:单个分区,子分区,全表,所有分区d) 可以倒出统计信息e) 可以用户自动收集统计信息<2>、DBMS_STATS的缺点

a) 不能Validate StrUCtureb) 不能收集CHAINED ROWS, 不能收集CLUSTER TABLE的信息,这两个仍然需要使用Analyze语句。c) DBMS_STATS 默认不对索引进行Analyze,因为默认Cascade是False,需要手工指定为True<3>、对于oracle 9里面的External Table,Analyze不能使用,只能使用DBMS_STATS来收集信息。6.怎么样快速重整索引通过rebuild语句,可以快速重整或移动索引到别的表空间rebuild有重建整个索引数的功能,可以在不删除原始索引的情况下改变索引的存储参数语法为alter index index_name rebuild tablespace ts_name

storage(......);假如要快速重建整个用户下的索引,可以用如下脚本,当然,需要根据你自己的情况做相应修改SQL> set heading offSQL> set feedback offSQL> spool d:\index.sqlSQL> SELECT “alter index “ index_name “ rebuild ““tablespace INDEXES storage(initial 256K next 256K pctincrease 0);“FROM all_indexesWHERE ( tablespace_name != “INDEXES“OR next_extent != ( 256 * 1024 ))AND owner = USERSQL>spool off

另外一个合并索引的语句是alter index index_name coalesce这个语句仅仅是合并索引中同一级的leaf block,消耗不大,对于有些索引中存在大量空间浪费的情况下,有一些作用。7.如何使用Hint提示在select/delete/update后写/*+ hint */如 select /*+ index(TABLE_NAME INDEX_NAME) */ col1...注重/*和+之间不能有空格,如用hint指定使用某个索引select /*+ index(cbotab) */ col1 from cbotab;select /*+ index(cbotab cbotab1) */ col1 from cbotab;select /*+ index(a cbotab1) */ col1 from cbotab a;

其中TABLE_NAME是必须要写的,且假如在查询中使用了表的别名,在hint也要用表的别名来代替表名;INDEX_NAME可以不必写,Oracle会根据统计值选一个索引;假如索引名或表名写错了,那这个hint就会被忽略;8.怎么样快速复制表或者是插入数据快速复制表可以指定Nologging选项如:Create table t1 nologgingas select * from t2;快速插入数据可以指定append提示,但是需要注重noarchivelog模式下,默认用了append就是nologging模式的。 在archivelog下,需要把表设置程Nologging模式。如insert /*+ append */ into t1select * from t2

注重:假如在9i环境中并设置了FORCE LOGGING,则以上操作是无效的,并不会加快,当然,可以通过如下语句设置为NO FORCE LOGGING。Alter database no force logging;是否开启了FORCE LOGGING,可以用如下语句查看SQL> select force_logging from v$database;9.怎么避免使用特定索引在很多时候,Oracle会错误的使用索引而导致效率的明显下降,我们可以使用一点点技巧而避免使用不该使用的索引,如:表test,有字段a,b,c,d,在a,b,c上建立联合索引inx_a(a,b,c),在b上单独建立了一个索引Inx_b(b)。在正常情况下,where a=? and b=? and c=?会用到索引inx_a,where b=?会用到索引inx_b,但是,where a=? and b=? and c=? group by b会用到哪个索引呢?在分析数据不正确(很长时间没有分析)或根本没有分析数据的情况下,oracle往往会使用索引inx_b。通过执行计划的分析,这个索引的使用,将大大耗费查询时间。当然,我们可以通过如下的技巧避免使用inx_b,而使用inx_a。

where a=? and b=? and c=? group by b““ --假如b是字符where a=? and b=? and c=? group by b+0 --假如b是数字通过这样简单的改变,往往可以是查询时间提交很多倍当然,我们也可以使用no_index提示,相信很多人没有用过,也是一个不错的方法:select /*+ no_index(t,inx_b) */ * from test twhere a=? and b=? and c=? group by b举例:本来在CM_USER上有索引IDX_CM_USER4(ACC_ID)和IDX_CM_USER8(BILL_ID),可是执行如下语句的时候很慢。select * from CM_USER where acc_id =1200007175

and user_status>0 and bill_id like “13%“ order by acc_id,bill_id用explain分析,发现执行计划是用IDX_CM_USER8.如下查询select * from user_indexes where table_name =“CM_USER“ 发现IDX_CM_USER8没有分析过。用下面语句执行计划改变select /*+INDEX(CM_USER IDX_CM_USER4)*/* from CM_USER where acc_id =1200007175 and user_status>0 and bill_id like “13%“ order by acc_id,bill_id或者分析索引exec dbms_stats.gather_index_stats(ownname => “QACS1“,indname => “IDX_CM_USER8“,estimate_percent => 5 );可以发现执行计划恢复正常。
10.Oracle什么时候会使用跳跃式索引扫描这是9i的一个新特性跳跃式索引扫描(Index Skip Scan).例如表有索引index(a,b,c),当查询条件为where b=?的时候,可能会使用到索引index(a,b,c),如,执行计划中出现如下计划:INDEX (SKIP SCAN) OF “TEST_IDX“ (NON-UNIQUE)Oracle的优化器(这里指的是CBO)能对查询应用Index Skip Scans至少要有几个条件:<1> 优化器认为是合适的。<2> 索引中的前导列的唯一值的数量能满足一定的条件(如重复值很多)。<3> 优化器要知道前导列的值分布(通过分析/统计表得到)。
<4> 合适的SQL语句等。11.怎么样创建使用虚拟索引可以使用nosegment选项,如create index virtual_index_name on table_name(col_name) nosegment;假如在哪个session需要测试虚拟索引,可以利用隐含参数来处理alter session set "_use_nosegment_indexes" = true;就可以利用eXPlain plan for select ……来看虚拟索引的效果,利用@$ORACLE_HOME/rdbms/admin/utlxpls查看执行计划,最后,根据需要,我们可以删除虚拟索引,如普通索引一样drop index virtual_index_name;

注重:虚拟索引并不是物理存在的,所以虚拟索引并不等同于物理索引,不要用自动跟踪去测试虚拟索引,因为那是实际执行的效果,是用不到虚拟索引的。12.怎样监控无用的索引Oracle 9i以上,可以监控索引的使用情况,假如一段时间内没有使用的索引,一般就是无用的索引语法为:开始监控:alter index index_name monitoring usage;检查使用状态:select * from v$object_usage;停止监控:alter index index_name nomonitoring usage;当然,假如想监控整个用户下的索引,可以采用如下的脚本:set heading offset echo offset feedback offset pages 10000

spool start_index_monitor.sqlSELECT “alter index “owner“.“index_name“ monitoring usage;“FROM dba_indexesWHERE owner = USER;spool offset heading onset echo onset feedback on------------------------------------------------set heading offset echo offset feedback offset pages 10000spool stop_index_monitor.sqlSELECT “alter index “owner“.“index_name“ nomonitoring usage;“

FROM dba_indexesWHERE owner = USER;spool offset heading onset echo onset feedback on13.怎么样能固定我的执行计划可以使用OUTLINE来固定SQL语句的执行计划,用如下语句可以创建一个OUTLINECreate oe replace outline OutLn_Name onSelect Col1,Col2 from Tablewhere .......假如要删除Outline,可以采用Drop Outline OutLn_Name;

对于已经创建了的OutLine,存放在OUTLN用户的OL$HINTS表下面,对于有些语句,你可以使用update outln.ol$hints来更新outline,如update outln.ol$hints(ol_name,“TEST1“,“TEST2“,“TEST2“,“TEST1)where ol_name in (“TEST1“,“TEST2“);这样,你就把Test1 OUTLINE与Test2 OUTLINE互换了,假如想利用已经存在的OUTLINE,需要设置以下参数Alter system/session set Query_rewrite_enabled = trueAlter system/session set use_stored_outlines = true14.v$sysstat中的class分别代表什么统计类别1 代表事例活动2 代表Redo buffer活动

4 代表锁8 代表数据缓冲活动16 代表OS活动32 代表并行活动64 代表表访问128 代表调试信息15.怎么杀掉特定的数据库会话Alter system kill session “sid,serial#“;或者alter system disconnect session “sid,serial#“ immediate;在win上,还可以采用oracle提供的orakill杀掉一个线程(其实就是一个Oracle进程)在Linux/Unix上,可以直接利用kill杀掉数据库进程对应的OS进程

16.怎么快速查找锁与锁等待数据库的锁是比较耗费资源的,非凡是发生锁等待的时候,我们必须找到发生等待的锁,有可能的话,杀掉该进程。这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。可以通过alter system kill session ‘sid,serial#’来杀掉会话SELECT /*+ rule */ s.username,decode(l.type,“TM“,“TABLE LOCK“,“TX“,“ROW LOCK“,NULL) LOCK_LEVEL,o.owner,o.object_name,o.object_type,s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuserFROM v$session s,v$lock l,dba_objects oWHERE l.sid = s.sidAND l.id1 = o.object_id(+)AND s.username is NOT NULL

假如发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待,以下的语句可以查询到谁锁了表,而谁在等待。SELECT /*+ rule */ lpad(“ “,decode(l.xidusn ,0,3,0))l.oracle_username User_name,o.owner,o.object_name,o.object_type,s.sid,s.serial#FROM v$locked_object l,dba_objects o,v$session sWHERE l.object_id=o.object_idAND l.session_id=s.sidORDER BY o.object_id,xidusn DESC以上查询结果是一个树状结构,假如有子节点,则表示有等待发生。假如想知道锁用了哪个回滚段,还可以关联到V$rollname,其中xidusn就是回滚段的USN[Q] 如何有效的删除一个大表(extent数很多的表)[A] 一个有很多(100k)extent的表,假如只是简单地用drop table的话,会很大量消耗CPU(Oracle要对fet$、uet$数据字典进行操作),可能会用上几天的时间,较好的方法是分多次删除extent,以减轻这种消耗:1. truncate table big-table reuse storage;

2. alter table big-table deallocate unused keep 2000m ( 原来大小的n-1/n);3. alter table big-table deallocate unused keep 1500m ;....4. drop table big-table;17.如何收缩临时数据文件的大小9i以下版本采用ALTER DATABASE DATAFILE “file name“ RESIZE 100M类似的语句9i以上版本采用ALTER DATABASE TEMPFILE “file name“ RESIZE 100M注重,临时数据文件在使用时,一般不能收缩,除非关闭数据库或断开所有会话,停止对临时数据文件的使用。

18.怎么清理临时段可以使用如下办法<1>、 使用如下语句查看一下认谁在用临时段SELECT username,sid,serial#,sql_address,machine,program,tablespace,segtype, contentsFROM v$session se,v$sort_usage suWHERE se.saddr=su.session_addr<2>、 那些正在使用临时段的进程SQL>Alter system kill session “sid,serial#“;
<3>、把TEMP表空间回缩一下SQL>Alter tablespace TEMP coalesce;还可以使用诊断事件<1>、 确定TEMP表空间的ts#SQL> select ts#, name FROM v$tablespace;TS# NAME-----------------------0 SYSYEM1 RBS2 USERS3* TEMP

...<2>、 执行清理操作alter session set events “immediate trace name DROP_SEGMENTS level TS#+1“说明:temp表空间的TS# 为 3*, So TS#+ 1= 4,假如想清除所有表空间的临时段,则,TS# = 214748364719.怎么样dump数据库内部结构,如上面显示的控制文件的结构常见的有1、分析数据文件块,转储数据文件n的块malter system dump datafile n block m2、分析日志文件

alter system dump logfile logfilename;3、分析控制文件的内容alter session set events “immediate trace name CONTROLF level 10“4、分析所有数据文件头alter session set events “immediate trace name FILE_HDRS level 10“5、分析日志文件头alter session set events “immediate trace name REDOHDR level 10“6、分析系统状态,最好每10分钟一次,做三次对比alter session set events “immediate trace name SYSTEMSTATE level 10“

7、分析进程状态alter session set events “immediate trace name PROCESSSTATE level 10“8、分析Library Cache的具体情况alter session set events “immediate trace name library_cache level 10“20.如何获得所有的事件代码事件代码范围一般从10000 to 10999,以下列出了这个范围的事件代码与信息SET SERVEROUTPUT ONDECLAREerr_msg VARCHAR2(120);BEGINdbms_output.enable (1000000);FOR err_num IN 10000..10999

LOOPerr_msg := SQLERRM (-err_num);IF err_msg NOT LIKE “%Message “err_num“ not found%“ THENdbms_output.put_line (err_msg);END IF;END LOOP;END;/在Unix系统上,事件信息放在一个文本文件里$Oracle_HOME/rdbms/mesg/oraus.msg可以用如下脚本查看事件信息event=10000while [ $event -ne 10999 ]do

event=`eXPr $event + 1`oerr ora $eventdone对于已经确保的/正在跟踪的事件,可以用如下脚本获得SET SERVEROUTPUT ONDECLAREl_level NUMBER;BEGINFOR l_event IN 10000..10999LOOPdbms_system.read_ev (l_event,l_level);IF l_level > 0 THENdbms_output.put_line (“Event “TO_CHAR (l_event)“ is set at level “TO_CHAR (l_level));

END IF;END LOOP;END;/21.什么是STATSPACK,我怎么使用它?Statspack是Oracle 8i以上提供的一个非常好的性能监控与诊断工具,基本上全部包含了BSTAT/ESTAT的功能,更多的信息,可以参考附带文档$ORACLE_HOME/rdbms/admin/spdoc.txt。安装Statspack:cd $ORACLE_HOME/rdbms/adminsqlplus "/ as sysdba" @spdrop.sql -- 卸载,第一次可以不需要sqlplus "/ as sysdba" @spcreate.sql -- 需要根据提示输入表空间名使用Statspack:

sqlplus perfstat/perfstatexec statspack.snap; -- 进行信息收集统计,每次运行都将产生一个快照号-- 获得快照号,必须要有两个以上的快照,才能生成报表select SNAP_ID, SNAP_TIME from STATS$SNAPSHOT;@spreport.sql -- 输入需要查看的开始快照号与结束快照号其他相关脚本s:spauto.sql - 利用dbms_job提交一个作业,自动的进行STATPACK的信息收集统计sppurge.sql - 清除一段范围内的统计信息,需要提供开始快照与结束快照号sptrunc.sql - 清除(truncate)所有统计信息
分享到:
评论

相关推荐

    Spring Cloud 全面学习案例集,含多种功能示例与教程.zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。

    AudioStream 1.5.unitypackage

    AudioStream 1.5.unitypackage

    驾驭未来:Simulink中PMSM永磁同步电机控制深度解析

    在现代工业自动化和电动汽车领域,永磁同步电机(PMSM)因其高效率、高性能和紧凑设计而备受青睐。本文将详细介绍如何在Simulink中实现PMSM的控制,包括矢量控制(FOC)策略的实现,以及必要的代码示例,旨在为工程师和研究者提供实用的指导。 一、PMSM控制概述 永磁同步电机(PMSM)以其高功率密度、高效率和优异的动态响应而广泛应用于工业和汽车领域。在Simulink中实现PMSM控制,通常采用矢量控制(Field-Oriented Control, FOC)策略,该策略通过磁场定向控制实现电机转矩和速度的精确控制。 二、PMSM数学模型与Simulink实现 PMSM的数学模型包括电压方程、磁链方程和转矩方程。在Simulink中,我们可以通过构建相应的模块来实现这些方程。 1. PMSM数学模型 电压方程: u d = R s i d − ω e L q i q + L d d i d d t + ω e ψ f u d ​ =Rsid−ω e ​ L q ​ iq+

    Jupyter_B 站直播事件 webhook 和开播邮件提醒.zip

    Jupyter-Notebook

    合成控制法与收敛性分析资料最新集.zip

    合成控制法与收敛性分析资料最新集.zip

    Gartner发布将漏洞管理发展为暴露管理指南:模拟实时攻击场景的对抗性暴露验证将替代传统渗透测试.pdf

    Gartner发布将漏洞管理发展为暴露管理指南:模拟实时攻击场景的对抗性暴露验证将替代传统渗透测试.pdf

    python+翻译器+语音

    装库 pip install python-office

    Jupyter_python 說明.zip

    Jupyter-Notebook

    《中国房地产统计年鉴》面板数据资源-精心整理.zip

    《中国房地产统计年鉴》面板数据资源-精心整理.zip

    基于python的大麦网自动抢票工具的设计与实现(1) - 副本.zip

    【基于Python的大麦网自动抢票工具的设计与实现】 随着互联网技术的发展,网络购票已经成为人们生活中不可或缺的一部分。尤其是在文化娱乐领域,如音乐会、演唱会、戏剧等活动中,热门演出的门票往往在开售后瞬间就被抢购一空。为了解决这个问题,本论文探讨了一种基于Python的自动抢票工具的设计与实现,旨在提高购票的成功率,减轻用户手动抢票的压力。 Python作为一种高级编程语言,因其简洁明了的语法和丰富的第三方库,成为了开发自动化工具的理想选择。Python的特性使得开发过程高效且易于维护。本论文深入介绍了Python语言的基础知识,包括数据类型、控制结构、函数以及模块化编程思想,这些都是构建抢票工具的基础。 自动化工具在现代社会中广泛应用,尤其在网络爬虫、自动化测试等领域。在抢票工具的设计中,主要利用了自动化工具的模拟用户行为、数据解析和定时任务等功能。本论文详细阐述了如何使用Python中的Selenium库来模拟浏览器操作,通过识别网页元素、触发事件,实现对大麦网购票流程的自动化控制。同时,还讨论了BeautifulSoup和requests库在抓取和解析网页数据中的应用。 大麦网作为国内知名的票务平台,其网站结构和购票流程对于抢票工具的实现至关重要。论文中介绍了大麦网的基本情况,包括其业务模式、用户界面特点以及购票流程,为工具的设计提供了实际背景。 在系统需求分析部分,功能需求主要集中在自动登录、监控余票、自动下单和异常处理等方面。抢票工具需要能够自动填充用户信息,实时监控目标演出的票务状态,并在有票时立即下单。此外,为了应对可能出现的网络延迟或服务器错误,工具还需要具备一定的错误恢复能力。性能需求则关注工具的响应速度和稳定性,要求在大量用户同时使用时仍能保持高效运行。 在系统设计阶段,论文详细描述了整体架构,包括前端用户界面、后端逻辑处理以及与大麦网交互的部分。在实现过程中,采用了多线程技术以提高并发性,确保在抢票关键环节的快速响应。此外,还引入了异常处理机制,以应对网络故障或程序错误。 测试与优化是确保抢票工具质量的关键步骤。论文中提到了不同场景下的测试策略,如压力测试、功能测试和性能测试,以验证工具的有效性和稳定性。同时,通过对抢票算法的不断优化,提高工具的成功率。 论文讨论了该工具可能带来的社会影响,包括对消费者体验的改善、对黄牛现象的抑制以及可能引发的公平性问题。此外,还提出了未来的研究方向,如增加多平台支持、优化抢票策略以及考虑云服务的集成,以进一步提升抢票工具的实用性。 本论文全面介绍了基于Python的大麦网自动抢票工具的设计与实现,从理论到实践,从需求分析到系统优化,为读者提供了一个完整的开发案例,对于学习Python编程、自动化工具设计以及理解网络购票市场的运作具有重要的参考价值。

    学生考勤管理系统 SSM毕业设计 附带论文.zip

    学生考勤管理系统 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B

    ODrive FOC BLDC伺服控制方案,KEIL版本

    ODrive FOC BLDC伺服控制方案,KEIL版本

    数字经济资源大合集(7类)-最新.zip

    数字经济资源大合集(7类)-最新.zip

    1950-2021年中国统计年鉴(分省年度)面板数据-全新发布.zip

    1950-2021年中国统计年鉴(分省年度)面板数据-全新发布.zip

    伯克利大学机器学习-5Dimensionality reduction [Percy Liang]

    lstm Summary Framework: z = U>x, x u Uz Criteria for choosing U: • PCA: maximize projected variance • CCA: maximize projected correlation • FDA: maximize projected intraclass variance

    我国《县域统计年鉴-人口教育医疗》面板数据-已更至最新.zip

    我国《县域统计年鉴-人口教育医疗》面板数据-已更至最新.zip

    分省数字经济发展指标数据集-最新.zip

    分省数字经济发展指标数据集-最新.zip

    Spring Boot 从入门到精通教程:含多方面知识及实战项目.zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。

    Jupyter_已完结最全面的 C 笔记 黑马程序员.zip

    Jupyter-Notebook

    空间计量Stata一键运行工具-最新发布.zip

    空间计量Stata一键运行工具-最新发布.zip

Global site tag (gtag.js) - Google Analytics