Oracle 10g性能分析与优化思路02章

合集下载

oracle性能参数说明

oracle性能参数说明

oracle性能参数说明Oracle数据库是一款功能强大的关系型数据库管理系统 (RDBMS),它提供了许多性能参数来优化数据库的性能。

这些参数允许DBA (数据库管理员)根据数据库的特定需求进行调整,并对数据库的资源使用、查询执行、并发性等方面进行优化。

下面将详细介绍一些常用的Oracle性能参数及其说明。

1.SGA_TARGET和SGA_MAX_SIZE:SGA (System Global Area) 是Oracle数据库使用的一块内存区域,用于缓存数据文件和索引的副本。

SGA_TARGET参数定义了SGA的总大小,而SGA_MAX_SIZE参数定义了SGA的最大大小。

这两个参数可以根据数据库的需求进行调整,以平衡内存的使用和数据库性能。

2.PGA_AGGREGATE_TARGET:PGA (Program Global Area) 是用于存储单个用户进程或排序操作的内存区域。

PGA_AGGREGATE_TARGET参数定义了整个数据库实例的PGA大小。

通过适当调整该参数的值,可以提高多个用户进程的性能。

3.DB_CACHE_SIZE:DB_CACHE_SIZE参数定义了数据缓存区的大小,用于缓存数据文件中的数据块。

它的大小应根据数据库的访问模式和大小进行调整,以提高查询性能和减少磁盘I/O。

4.SHARED_POOL_SIZE:SHARED_POOL_SIZE参数定义了共享池的大小,用于存储共享SQL和PL/SQL代码的执行计划,以及共享游标和会话信息等。

适当调整该参数可以提高SQL查询的性能和共享的效率。

5.LOG_BUFFER:LOG_BUFFER参数定义了重做日志缓冲区的大小,用于暂存数据库的修改操作。

适当增大该参数的值可以减少重做日志文件的频繁切换,提高数据库的写操作性能。

6.PARALLEL_MAX_SERVERS和PARALLEL_THREADS_PER_CPU:PARALLEL_MAX_SERVERS参数定义了并行执行的最大服务器进程数,而PARALLEL_THREADS_PER_CPU参数定义了每个CPU核心的并行线程数。

Oracle优化常用概念

Oracle优化常用概念
方式
日期
动态性能视图和数据字典视图
• 动态性能视图:v$开头 • 数据字典视图:dba_*、all_*、user_*
日期
动态性能视图
• v$session,v$session_wait,v$session_event, • v$sql • v$parameter
日期
数据字典视图
• dba_data_files • user_tables • user_indexes • user_objects • user_source • user_segments:对象实际占用空间,非实际使用空间 • user_users,user_errors,user_constraints,user_tablespac
日期
为什么要做柱状图
• Oracle在选择索引时会检查索引的效率从而确定是否使用 索引,而柱状图正是提供了这种信息。如果不做柱状图, oracle就确定不了索引的效率,会倾向于使用索引,可能 反而不如做全表扫描来得快
日期
如何生成柱状图
• analyze table tb_name compute|estimate statistics for all indexed columns; 针对索引列
找到前不返回数据。 • hash join:使用条件:仅用于等价连接;相关资源:内存、临时空间 优点:当缺乏索引或者索引条件模糊时,哈希连接连接比嵌套循环有效。通常比
排序合并连接快。在数据仓库环境下,如果表的纪录数多,效率高。 缺点:为建立哈希表,需要大量内存。第一次的结果返回较慢。
日期
执行计划
• 什么是执行计划 • 如何生成执行计划 • 如何看懂执行计划
日期
创建索引的目的
• 从根本来讲就是为了加快查询速度 • Oracle出于对效率的考虑,某些约束会关联到索引,从而

精通 oracle 10g plsql 编程-学习笔记

精通 oracle 10g plsql 编程-学习笔记

1.PL/SQL综述本章学习目标,了解如下内容:PL/SQL的功能和作用PL/SQL 的优点和特征;Oracle 10g、Oracle9i 的PL/SQL新特征1.1.SQL简介1.1.1.SQL语言特点SQL语言采用集合操作方式1.1.2.SQL语言分类●数据查询语言(SELECT语句):检索数据库数据。

●数据操纵语言(DML):用于改变数据库数据。

包括insert,update和delete三条语句。

●事务控制语言(TCL):用于维护数据库的一致性,包括commit,rollback和savepoint 三条语句●数据定义语言(DDL):用户建立、修改和删除数据库对象。

●数据控制语言(DDL):用于执行权限授予和收回操作。

包括grant 和revoke两条命令。

1.1.3.SQL 语句编写规则●SQL关键字不区分大小写●对象名和列名不区分大小写●字符值和日期值区分大小写●书写格式随意1.2.PL/SQL简介1.3.Oracle 10G PL/SQL 新特征2.PL/SQL开发工具本章学习目标:学会使用SQL*PLUS学会使用PL/SQL developer;学会使用Procedure Builder。

2.1.SQL*PLUS在命令行运行SQL*PlusSqlplus [username]/[password] [@server]3.PL/SQL 基础学习目标:●了解PL/SQL块的基本结构以及PL/SQL块的分类;●学会在PL/SQL块中定义和使用变量●学会在PL/SQL块中编写可执行语句;●了解编写PL/SQL代码的指导方针;●了解Oracle 10g的新特征——新数据类型BINARY_FLOAT 和BINARY_DOUBLE,以及指定字符串文本的新方法。

3.1.PL/SQL 块简介3.1.1.PL/SQL块结构3.1.2.PL/SQL 块分类匿名块命名块子程序触发器3.2. 定义并使用变量3.2.1.标量变量3.2.2.复合变量3.2.3.参照变量3.2.4.LOB 变量3.2.5.非PL/SQL 变量3.3.编写 PL/SQL 代码3.3.1.PL/SQL 词汇单元分隔符标识符文本(数字文本,字符文本,字符串文本,布尔文本,日期时间文本)注释3.3.2.PL/SQL 代码编码规则标识符命名规则大小写规则代码缩进嵌套块和变量范围PL/SQL中可以使用的SQL函数4.使用SQL语句学习目标:学会使用SELECT语句去完成基本查询功能学会使用INSERT,UPDA TE和DELETE语句去操作数据库数据学会使用COMMIT,ROLLBACK和SA VEPOINT语句去控制事务学会使用SELECT语句去实现各种复杂查询功能(数据分组、连接查询、子查询、层次查询、合并查询等)4.1.使用基本查询处理NULL:函数nvl(expr1,expr2),nvl2(expr1,expr2,expr3)4.2.使用DML语句使用多表插入数据语法:INSERT ALL insert_into_clause [value_clause] subquery;INSERT conditional_insert_clause subquery;示例1:使用ALL 操作符执行多表插入INSERT ALLWHEN deptno=10 THEN INTO dept10WHEN deptno=20 THEN INTO dept20WHEN deptno=30 THEN INTO dept30WHEN job=’CLERK’ THEN INTO clerkELSE INTO otherSelect * from emp;示例2:使用FIRST 操作符执行多表插入INSERT FIRSTWHEN deptno=10 THEN INTO dept10WHEN deptno=20 THEN INTO dept20WHEN deptno=30 THEN INTO dept30WHEN job=’CLERK’ THEN INTO clerkELSE INTO otherSELECT * FROM emp;4.3.使用事务控制语句4.3.1.事务和锁4.3.2.提交事务4.3.3.回退事务设置保存点:savepoint a;或者exec dbms_transaction.savepoint(‘a’)取消部分事务Rollback to a;或者Exec dbms_transaction.rollback_savepoint(‘a’)取消全部事务:Rollback; 或者exec dbms_transaction.rollback() 4.3.4.只读事务4.3.5.顺序事务4.4.数据分组4.4.1.分组函数MaxMinAvgSumCountVarianceStddev使用分组函数注意事项:●当使用分组函数时,除了函数Count(*) 之外,其他分组函数都会忽略NULL行。

Maclean Liu的Oracle性能优化讲座 第一回-真正读懂Oracle SQL执行计划Execution Plan

Maclean Liu的Oracle性能优化讲座 第一回-真正读懂Oracle SQL执行计划Execution Plan

E-Rows 是优化器评估返回的行数 A-Rows 是实际执行时返回的行数
alter session set STATISTICS_LEVEL = TYPICAL;


使用DBMS_XPLAN包

Access Path访问路径分析:访问数据是用TableScan还是index (FFS) 对返回的行结果集做例如Join的进一步处理,以便返回行给客户端

SQL语句的执行最终会落实为Oracle执行步骤的组合 =》【SQL执行计划】
Oracle Database
内存
磁盘存 储
取出 加工結果

2. SQLPLUS AUTOTRACE • 除set autotrace traceonly explain外均实际执行SQL,但仍未必 是真实计划 • 必须要有plan_table 3. SQL TRACE • 需要启用10046或者SQL_TRACE • 一般用tkprof看的更清楚些,当然10046里本身也有执行计划信息

Email:liu.maclean@ Blog: Founder of Shanghai Oracle Users Group - SHOUG Over 7 years experience with Oracle RDBMS technology Over 8 years experience with Linux technology

How to Find Maclean Liu?


读懂执行计划有什么用呢?

执行计划贯穿Oracle调优始终 了解执行计划的真实执行过程,将有助 于优化 对于Oracle的原理理解有一定帮助 解决部分同学心中多年的疑惑 读懂执行计划,SQL调优的第一步

oracle自动表分析报告

oracle自动表分析报告

Oracle自动表分析报告1. 简介Oracle自动表分析是一项用于提高数据库性能的功能。

通过对表的统计信息进行分析,自动表分析可以提供有关表的索引、分区、压缩和统计信息的建议,以优化数据库查询性能。

2. 使用方法在Oracle数据库中,使用自动表分析功能非常简单。

只需要执行以下步骤即可:步骤1:收集统计信息在使用自动表分析之前,需要确保收集了表的统计信息。

可以使用Oracle提供的统计信息收集工具,如DBMS_STATS包中的相关过程。

步骤2:运行自动表分析运行自动表分析可以通过两种方式实现:1.使用DBMS_AUTO_TASK_ADMIN包中的相关过程手动运行表分析任务。

2.在Oracle数据库中启用自动任务调度器,然后自动定期运行表分析任务。

无论使用哪种方式,都需要在执行表分析之前设置好相关参数,如分析的目标表、分析级别和报告类型等。

步骤3:查看分析报告执行自动表分析任务后,可以通过查询相关视图来查看分析报告。

常用的视图包括:•DBA_AUTO_INDEX_ANALYSIS_REPORT:提供有关索引分析的报告。

•DBA_AUTO_PART_TABLE_REPORT:提供有关分区表分析的报告。

•DBA_AUTO_COMPRESS_TABLE_REPORT:提供有关表压缩分析的报告。

•DBA_AUTO_STAT_EXTENSIONS_REPORT:提供有关统计分析的报告。

3. 分析报告内容自动表分析报告提供了丰富的信息,以帮助数据库管理员优化表的性能。

以下是一些常见的分析报告内容:索引分析报告索引分析报告提供了有关表的索引的建议,以优化查询性能。

报告中包括以下内容:•索引建议:哪些索引可能对查询性能有所改善。

•索引状态:当前索引的状态,如是否损坏或无效。

•索引使用情况:索引的使用频率和效果统计。

•索引空间占用情况:索引占用的存储空间和碎片化情况。

分区表分析报告分区表分析报告提供了有关表分区策略的建议,以优化数据的存储和查询效率。

2020年智慧树知道网课《ORACLE快速入门》课后章节测试满分答案

2020年智慧树知道网课《ORACLE快速入门》课后章节测试满分答案

第一章测试1【多选题】(10分)ORACLE的DBA日常工作有哪些任务A.ORACLE数据库应用架构设计B.ORACLE升级C.性能调优D.ORACLE安装2【多选题】(10分)数据库市场上主要分为哪几种类型的数据库A.关系型数据库B.NOSQL数据库C.ORACLE数据库D.NEWSQL数据库3【判断题】(10分)啤酒和尿片放在一起是数据挖掘的应用。

A.对B.错4【判断题】(10分)分布式数据库经常和并行数据库结合一起使用。

A.错B.对5【判断题】(10分)云数据库是云技术和数据库技术的结合。

A.对B.错第二章测试1【多选题】(10分)哪些操作系统可以安装ORACLE软件A.windows操作系统B.UNIX操作系统C.LINUX操作系统D.mac操作系统2【单选题】(10分)ORACLE11g中的g是什么意思A.互联网B.网格C.网络D.网址3【多选题】(10分)以下哪些是ORACLE的服务A.ORACLEDBCONSOLEORCLB.ORACLEORADB11G_HOME1TNSLISTENERC.ORACLEJOBSHEDULEORCLD.ORACLESERVICEORCL4【判断题】(10分)ORACLE的安装软件有32位安装包和64位安装包的区别。

A.对B.错5【判断题】(10分)我们可以通过数据库配置助手DBCA创建、删除、修改数据库。

A.错B.对第三章测试1【单选题】(10分)以下哪个选项是的A.sqlplus是客户端管理工具B.sqlplus就是sqlC.OEM是客户端管理工具D.sqlplus中除了可以输入sql语句外,还可以输入sqlplus的格式化语言2【单选题】(10分)在sqlplus中,用以下哪个命令可以查询表的结构A.describeB.showC.viewD.select3【单选题】(10分)以下哪个命令可以在sqlplus中执行某个文件中的sql命令A.editB.saveC.startD.sool4【判断题】(10分)使用edit命令修改缓冲区中最近一条命令。

oracleexplain数据库的用法

oracleexplain数据库的用法一、简介Oracle Explain是Oracle数据库中用于分析查询性能的工具,它可以帮助开发人员和数据库管理员了解查询执行计划,优化查询性能,提高数据库的效率。

二、Explain的使用方法1. 查询性能分析:使用Explain可以分析查询性能,确定查询的执行计划是否合理,是否存在性能瓶颈。

通过Explain生成的报告可以提供查询执行过程中的热点数据和执行时间等信息。

2. 查询优化:通过Explain生成的报告,可以了解查询的执行计划,从而优化查询语句,提高查询性能。

例如,可以通过调整索引、优化数据表结构、减少数据访问等手段来优化查询性能。

3. 使用方式:在Oracle数据库中,可以使用Explain来分析查询性能。

在执行查询之前,可以使用EXPLAIN PLAN语句来生成查询的执行计划。

例如:```sqlEXPLAIN PLAN FOR SELECT * FROM table_name WHERE column_name ='value';```执行上述语句后,系统会生成一个执行计划,并将其存储在数据库中。

可以使用以下语句来查看执行计划:```sqlSELECT * FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE','PLAN_TABLE_OUTPUT'));```4. 注意事项:在使用Explain分析查询性能时,需要注意以下几点:* Explain只能分析已经执行的查询,无法分析未执行的查询。

* Explain生成的报告是基于当前数据库配置和数据表结构的,可能会随着数据库环境的改变而发生变化。

* Explain生成的报告只能提供一种参考,不能完全依赖它来优化查询性能。

需要结合实际情况进行优化。

三、Explain报告的内容Explain报告提供了关于查询执行计划的信息,包括但不限于以下内容:1. 查询计划:报告中会列出查询的执行计划,包括每个操作的顺序、操作类型、消耗的资源等信息。

Oracle的性能测试经验总结

前段时间,在阿里妈妈新机房压力测试过程中用到了LR测试ORACLE,跟DBA一起在杭州网通新机房进行1000用户的压力模拟测试。

整个压力测试耗时两天。

以下是一些经验:1)压力测试过程中发现一些SQL脚本执行非常慢,进行了优化。

2)最好并发测试,否则服务基本上没有什么压力。

3)先从100用户开始,再慢慢向上加,直到CPU的承载达到90%以上。

查看系统的性能情况,包括TPS,响应时间,和内存等。

还包括oracle服务器的I/O流量和交易数。

这个方案是参考了淘宝的机房性能测试方案,下面是性能测试的具体步骤:oracle的性能测试主要是模拟大量的sql语句操作,来对数据库服务器进行加压。

在测试前,需要准备以下要模拟的sql语句,测试脚本,并将测试控制机、测试加压机、被测数据库服务器准备妥当。

脚本协议选择oracle(2-Tier),将所有要模拟的sql语句放在一个sql文件内,使用sql-plus 来操作数据库载入,使用loadrunner来录制。

录制好之后就是修改脚本了,首先在vdf.h文件中定义变量(static void FAR * OraBind1;),定义参数(static LRD_VAR_DESC UID ={LRD_VAR_DESC_EYECAT, 1, 10, LRD_DBTYPE_ORACLE, {1, 1, 0},DT_SF_STRIPPED_SPACES};)。

为什么要在这里定义而不直接只用参数化呢?因为那样会对加压机造成很大的压力,不利于测试。

这里需要根据你的脚本来变化,你在脚本中使用了多少变量,多少参数,那么你就在要这里定义多少。

接下来修改脚本的,将一次性的登陆登出放在init和end中,使用lrd_assign和lrd_ora8_bind_placeholder命令替代参数,如lrd_ora8_stmt(OraStm6, "SELECT COUNT(*) as counter FROM ***** WHERE ***_id="":U and ( status = 0 or ""status is null)", 1, 0, 0);lrd_assign(&UID , "{UID}", "", 0, 0);lrd_ora8_bind_placeholder(OraStm6, &OraBind1, "U", &UID , 0, 0, 0);这样,脚本就差不多大功告成了。

Oracle 10g Shrink Table和Shrink Space使用详解

Oracle 10g Shrink Table的使用是本文我们主要要介绍的内容,我们知道,如果经常在表上执行DML操作,会造成数据库块中数据分布稀疏,浪费大量空间。

同时也会影响全表扫描的性能,因为全表扫描需要访问更多的数据块。

从Oracle 10g开始,表可以通过shrink来重组数据使数据分布更紧密,同时降低HWM释放空闲数据块。

segment shrink分为两个阶段:1、数据重组(compact):通过一系列insert、delete操作,将数据尽量排列在段的前面。

在这个过程中需要在表上加RX锁,即只在需要移动的行上加锁。

由于涉及到rowid的改变,需要enable row movement.同时要disable基于rowid的trigger.这一过程对业务影响比较小。

2、HWM调整:第二阶段是调整HWM位置,释放空闲数据块。

此过程需要在表上加X锁,会造成表上的所有DML语句阻塞。

在业务特别繁忙的系统上可能造成比较大的影响。

ShrinkSpace语句两个阶段都执行。

Shrink Space compact只执行第一个阶段。

如果系统业务比较繁忙,可以先执行Shrink Space compact重组数据,然后在业务不忙的时候再执行Shrink Space降低HWM释放空闲数据块。

shrink必须开启行迁移功能。

alter table table_name enable row movement ;注意:alter table XXX enable row movement语句会造成引用表XXX的对象(如存储过程、包、视图等)变为无效。

执行完成后,最好执行一下utlrp.sql来编译无效的对象。

语法:1.alter table <table_name> shrink space [ <null> | compact | cascade ];2.alter table <table_name> shrink space compcat;收缩表,相当于把块中数据打结实了,但会保持high water mark;alter table <tablespace_name> Shrink Space;收缩表,降低 high water mark;alter table <tablespace_name> Shrink Space cascade;收缩表,降低 high water mark,并且相关索引也要收缩一下下。

OCM实验选讲

OCM实验选讲Oracle Certified Master(OCM) 大师认证资质是目前最高级别的Oracle认证。

对技术、知识和操作技能最高级别的考量。

OCM证书获得者是公认为解决最困难的技术难题和最复杂的系统故障的最佳Oracle专家人选,不但要求有能力处理关键业务数据库系统和应用,还要能帮助客户解决所有的Oracle 技术困难。

获得OCM 证书,必须先通过OCA、OCP考试,再学习两门高级技术课程,然后在Oracle 实验室通过场景实验考试。

场景实验考试的目的是测试您的实际问题分析和故障解决能力。

OCM认证是Oracle含金量最高的一个证书,这是一个注重实际操作的考试,因此学员必须能够手工操作很多给定的实验场景,这种考试显然是无法通过背题的方式通过的。

Dataguru推出的《OCM实验选讲》课程,是一个完全基于OCM考试内容(根据Oracle官方公布的考试大纲)的实战课程,老师会通过step-by-step的方式给学生演示有关实验的整个操作过程,在操作的同时,会同时讲解课程中涉及到的各种理论和概念,用理论结合实践的方式给学员展示知识的全貌,让学员不光懂如何操作,还知道为什么这样操作,能够轻松应对和通过OCM考试。

特别强调,本课程的核心价值是真正的”技术“,并非为单纯应试而开设。

对于目前并无计划参与OCM认证考试的学习者,也可以通过学习课程,知道作为一名Oracle数据库工程师最需要掌握的知识,获得Oracle最关注的核心实验的技能,这些知识和技能可以帮助你迅速掌握Oracle,迎接各种有挑战性的工作!课程预期:比较轻松的通过OCM认证考试。

或获取具有与OCM认证要求等同的能力。

课程大纲第一课 Oracle官方认证体系介绍第二课手工建库实验第三课网络配置实验第四课 Grid Control实验第五课数据备份恢复实验第六课数据仓库实验第七课 Oracle数据库管理实验第八节 Oracle性能优化实验第九课 RAC实验第十课 DG实验授课对象:这是一门数据库类课程,适合有一定Oracle基础(例如有1-2年DBA经验,或具备OCP认证,或学习通过炼数成金的《Oracle数据库引航》,《深入Oracle 数据库》,《Oracle数据库职业直通车》等课程)的学员选学。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2.1 关于锁 锁这种东西,对于初学者来说就像是一个深不可测、遥不可及的概念。我的经验告诉我,如果初学者冲上来就去纠结Oracle各种锁的概念、锁的类型、锁的级别,试图用最快的方式来理解锁的含义,基本上都会感到痛不欲生,至少我当时的心情大致如此。

随着工作时间的变长,我慢慢地养成了一种和从前不太一样的思维方式。比如现在我们在谈锁,以前的方法是,首先会去找文档来看什么是锁,费力不说,到底也没有搞清楚;而现在的思维方式转变了,开始学会用一种轻松、主动的方式来思考问题,于是我首先会去想,为什么会有锁?没有它会怎么样?

我必须要向大家推荐后面一种思考方式的好处。这是一种启发式的思考模式,是主

性能分析与优化思路 第2章 锁和阻塞 21 动的,所以它是快乐的。而前一种是消极的,被动的,同时也是痛苦的。我就曾经在这样的痛苦中摸索了很久,希望大家不要重蹈我的覆辙。

为了说明这样的一种思维方式,我举一个例子,想必大家都切身感受过。 中学时候学万有引力定律时,老师上来就告诉我们,世间万物是相吸的,并由牛顿发现了它,下面是万有引力定律的公式„„于是大家机械地听着,记着,背着。坦白地说,这样被动接受的感觉很一般,但至少还不太痛苦,因为我们还能听懂。大家试想一下,万有引力是多么美好的东西啊?如果我们托着下巴,呆呆地坐在窗户前面想,为什么地球就要绕着太阳转呢?为什么不会飞走呢?如果有一天飞走了,我们怎么办呢?这看起来是在胡思乱想,比起课堂老师上来就捞干的说要低效得多,但是往往就是在这种低效中,我们获得了任何人都不能给予的东西,我们通过自己的思维推理,得出了这个结论:太阳对地球是有吸引力的。这是我们主动获得的东西,我们充满了成就感和自豪感。

前面扯了一些看似不着边际的话,在我看来非常重要,这也是我想通过这本书想表达的另一个目的,就是学会思考。它比我直接告诉你锁是什么要重要得多,它希望你能够像思考地球为什么围绕着太阳转一样,托着下巴来思考Oracle数据库为什么会发明一个锁,这不是扯淡。

让我们一起来思考这个问题吧,如果你还不太习惯这种思考方式的话。为什么Oracle数据库中会有锁呢?设想,如果世界上只有你一个人,你有一箱子金币,你会弄把锁头来把它锁起来吗?不会,因为如果世界上只有你一个人,根本就不会有锁头这种东西出现,因为没有其他高等生物会去打开它,除了你。你可能会问,举一个如此粗鄙的例子给我们描述锁,太不把Oracle放在眼里了吧?其实不是这样的。Oracle的锁和这个锁头一样吗?答案是一样的,就是因为受现实生活中的锁头的启发才取了这个名字(lock),所以你看,它神秘吗?一点都不神秘,那不过是一层窗户纸,只需要我们的轻轻一捅。

继续我们的推理,现实生活中因为存在着其他想得到箱子里金币的人,你为了防止他们来拿,所以上了锁。在数据库中也存在着类似的事情,如果一个数据库只有你一个人用,我绝对不相信Oracle会费这么大的劲开发出一个锁来捣乱,所以,我们的答案找到了,因为还有其他的人在使用这个数据,你为了防止他们把你做的事情弄糟,所以在你对数据操作的时候,拒绝他们操作!简单吧?是不是还有点高兴?我们就在说说笑笑的过程中了解了锁的渊源。

可能有人跳出来说,你说了半天只是说了一个锁,锁分很多种啊,表级锁、行级锁、22 让Oracle跑得更快——Oracle 10g性能分析与优化思路

共享锁、排他锁„„你再来用你的快乐法推啊! 那好,我们再推,我们这回从哲学上来推。哲学真是一个非常高深莫测的学科,我一直觉得只有一些绝顶聪明的人才能学懂哲学,我是学不懂的,只能引用他们发明的一些话。比如现在我引用这条“存在即合理”。就是说,Oracle的老板不是笨蛋,没必要花高昂的费用雇人写一些没有意义的代码。那么,对于一个公司来说什么叫有意义?能满足用户的需求即为有意义,好了,答案找到了,用户A的系统需要用到表级锁,Oracle公司为了把数据库卖给他,所以开发了表级锁,用户B需要用到行级锁,所以Oracle为他们开发了行级锁„„

做技术的人,总想把所有的技术都学会,之前我也曾这么学过,后来发现学完之后很快就忘了。比如最开始Oracle推出RAC的时候,我们费尽千辛万苦搭好了一个环境,开始很激动,整天在上面打命令。可是没持续多久,就没人用了,原因是大家不知道该做什么了,该做的都做完了。看起来是该会的都会了,其实是什么都还不会,比如说RAC对系统的影响究竟有多大?什么样的系统需要用RAC?RAC在资源分配上需要怎样的配置才合理?一堆的疑问摆在我的面前,我发现我什么都没学会,因为我没有认真思考Oracle为什么会发明一个RAC。

一年后,每个人几乎把所做的测试统统忘光了,直到我们的系统中真正用到了RAC,才开始有目的地研究起来,那时候故障不断,一个月的时间锻炼要强过以前好几个月的自学。

说这个例子是什么意思呢?就是要说,很多概念或者技术,看起来很深奥,那是因为你没有用到,当你用到的时候,你会觉得它无非是满足用户需求的一个产品,仅此而已。上面讨论的锁也一样,它对于你很陌生,说明你现在没有用到它,还不需要它,当你需要它的时候,你会发现它正好能满足你的需求,那时候不要说理解,基本上就是拿来就可以用了。很多人学了无数年的经济,却比不上一个几乎没有读过书的人懂得做生意,因为前者在漫无目的地机械地学,后者在为了生存下去而不断地思考。这就是区别。

2.2 锁和阻塞 关于并发(concurrency)这个词,请注意区别另外一个词,并行(parallel),在英语中这本是两个完全不同的单词,但汉语却把它们弄得有点相似。在数据库中,并发的第2章 锁和阻塞 23 意思是说有超过两个以上的用户对同样的数据做修改(可能包括插入、删除和修改),而并行的意思是说将一件事情分成很多小的部分,让每一部分同时执行,最后将执行结果汇总成最终结果(关于并行后面有专门的一章来介绍)。

你如果还记得前面说到锁的问题的话,应该已经猜到我想说什么了。是的,没有并发,就没有锁,锁的产生是因为并发,并发的产生是因为系统需要,系统需要是因为用户需要,这样,又回到我们之前引用的哲学观点了—存在即合理。

下面是一个最简单的并发导致锁定的例子。 我们开一个会话session 1,注意,以后我们再举例子的时候大致都会这么来说,它的实际过程是,你要和数据库建立起一个连接,方式是可以使用第三方软件,或者直接使用SQLPLUS来连接。

SQL> select sid from v$mystat where rownum=1; SID ---------- 158

Sql>create table t(x int primary key); Table created. SQL>insert into t values(1); Commit; SQL> update t1 set x=10 where x=1; 已更新 1 行。 我们创建了一张只有一个字段X的表T,这个字段上有个一个主键(primary key),它的意思是要求这个字段的值唯一。

我们再开一个会话,session 2:

SQL> select sid from v$mystat where rownum=1; SID ---------- 157 24 让Oracle跑得更快——Oracle 10g性能分析与优化思路

SQL> update t1 set x=10 where x=1; 这时候session 2就被“卡”在那里了。我常听开发人员称之为锁表。其实在数据库中对这个过程的具体描述是:session 2被session 1阻塞(session 2 was blocked by session 1)。

为什么会有这个现象呢?我们在T表x列上创建了一个主键以保证这个列值的唯一性,然后我们在session 1中插入了1条数据,并没有提交,此时数据库会认为你还没有决定是否将这条数据 1 插入到表中,它在等待你做出决定(提交或是回滚)。正当数据库在等待你的决定时,另一个用户也插入了同样的一条记录,为了保证数据不重复,数据库只能让另一个用户(session 2)等待,直到你做出决定。

我们可以从一个视图中看到这些信息。 SQL> select sid,type,id1,id2,lmode,request,block from v$lock where sid in (157,1 58) order by sid;

SID TY ID1 ID2 LMODE REQUEST BLOCK ----- ----- -- ------ ------- ---------- ---------- 157 TM 51349 0 3 0 0 157 TX 327699 292 0 6 0 158 TX 327699 292 6 0 1 158 TM 51349 0 3 0 0

这里SID=158是第一个会话 session 1,SID=157是第二个会话session 2,BLOCK=1表示这个会话正在阻塞其他的会话,REQUEST=6表示当前会话正在等待一个LMODE=6的锁,意思是,这个会话正在被阻塞。

关于这个视图每个列的详细含义,可以参考Oracle官方文档的Refrence部分。 现在我们是通过正向的方式模拟了阻塞的情况,在现实的例子中,情况通常是用户(或者也有开发人员)告诉我们,系统卡住了,不动了,那么我们就应该逆着这个过程来寻根溯源。

首先要下手的就是查看这张视图V$LOCK,通常来讲,系统如果平时运行正常,突然会停止不动,多半是被阻塞(blocked)住了,我通常第一个动作就是先看看V$LOCK这张视图,看看是不是有像上面一样的阻塞信息。

这张视图最有意思的两列就是右边数第一列和第二列,也就是request列和block。按照Oracle官方文档的说明,如果某个SID的request列是一个非0的值,那么它就是在等待一个锁,如果block列是1,这个SID就持有了一个锁,并且阻塞别人获得这个

相关文档
最新文档