电信行业oracle高性能应用开发.ppt_第1页
电信行业oracle高性能应用开发.ppt_第2页
电信行业oracle高性能应用开发.ppt_第3页
电信行业oracle高性能应用开发.ppt_第4页
电信行业oracle高性能应用开发.ppt_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、高性能应用,部门 :系统服务产品线 作者:2011年11月,培训目标,通过本次培训,您将学习到以下内容: 1.合理设计数据库结构 2.合理设计数据库表 3.正确设置数据库参数 学习此次课程的目标: 通过优化数据库,操作系统,应用程序,优化系统,目录,2,5,Oracle数据库体系结构,事务,绑定变量,索引,高效编码原则,Oracle数据库体系结构,实 例,SGA,重做日志 缓存区,共享池,字典缓存,库缓存,DBWR,SMON,PMON,CKPT,LGWR,Others,用户 进程,服务器 进程,PGA,控制 文件,数据 文件,归档日志 文件,参数文件,密码文件,重做日志文件,数据库文件,数据缓

2、存区,数据库管理系统,后台进程,内存结构,大型池,Java池,系统参数,sga_max_size 指定例程存活期间所占用的系统全局区的最大内存大小。 sga_target 当前已分配的最大sga。sga_target是自动管理内存时使用的,这样你就不用设置db_cache_size,shared_pool_size等参数,他们会根据需要自动的进行调整的。 pga_aggregate_target 指定连接到例程的所有服务器进程的目标 PGA 总内存。缓存session的变量以及sql排序或者hash连接等。 processes 指定可同时连接到一个 Oracle Server 上的操作系统用户

3、进程的最大数量。 session_cached_cursors 指定要高速缓存的会话游标的数量。,系统参数,open_cursors 指定一个会话一次可以打开的游标 (上下文区域) 的最大数量, 并且限制 PL/SQL 使用的 PL/SQL 游标高速缓存的大小, 以避免用户再次执行语句时重新进行语法分析。请将该值设置得足够高, 这样才能防止应用程序耗尽打开的游标。 db_writer_processes 一个例程的数据库写进程的初始数量。 optimizer_mode 指定优化程序的行为。如果设置为 RULE, 就会使用基于规则的优化程序, 除非查询含有提示。如果设置为 CHOOSE, 就会使

4、用基于成本的优化程序, 除非语句中的表不包含统计信息。ALL_ROWS 或 FIRST_ROWS 始终使用基于成本的优化程序。,内存结构和进程,Oracle的机制执行使用内存结构和进程。所有的内存结构中存在的数据库系统的计算机构成的主内存。进程是工作或任务,在这些计算机的内存工作。 内存结构 Oracle会创建和使用内存结构来完成几项工作。例如,内存是用来存放正在执行的程序代码和用户之间共享的数据。与Oracle相关的一些基本的内存结构:系统全局区(包括数据库和重做日志缓冲区和共享池)和程序全局区。 系统全局区(SGA)是一个由Oracle分配的共享内存区域,其中包含一个Oracle实例的数据

5、和控制信息。 一个Oracle实例包含SGA和后台进程。 SGA的一个实例启动时分配和释放的实例关闭时。启动的每个实例都有其自己的SGA。,内存结构和进程,程序全局区(PGA),是一个包含一个服务器进程的数据和控制信息的内存缓冲区。由Oracle服务器进程启动时创建一个PGA。在PGA中的信息依赖于Oracle配置。 流程 一个过程的控制线程“或在一个操作系统,可以执行一系列步骤的机制。一些操作系统使用方面的工作或任务。Oracle数据库系统的进程有两个基本类型:用户进程和ORACLE进程。 创建和维护用户进程执行一个应用程序的软件代码(如一个Pro * C程序)或一个ORACLE工具(如SQ

6、L * PLUS)。用户进程也管理与服务器进程通信。用户进程与服务器进程通信,通过程序界面。 Oracle进程被称为其他进程代表调用进程执行的功能。Oracle会创建一个服务器进程来处理连接的用户进程的请求。甲骨文公司还建立了一套为每个实例的后台进程,Oracle实例,Oracle实例由Oracle进程和共享内存需要访问数据库中的信息。该实例是由用户进程,Oracle后台进程和共享内存用于这些进程 Oracle内存结构 Oracle使用共享内存用于多种用途,包括缓存数据和索引以及存储共享的程序代码 。这种共享内存被分解成各个部分,或内存结构。与Oracle相关的基本内存结构系统全局区(SGA)

7、和程序全局区(PGA)。,Oracle实例,数据结构,关系模型主要有三个方面: 结构 结构是定义良好的对象存储数据库中的数据。其中包含的结构和数据业务可以操纵。 操作 操作有明确的规定,允许用户操纵数据库的数据和结构的行动。对数据库的操作,必须坚持以预先定义的完整性规则。 完整性规则 完整性规则是允许哪些操作上的数据和数据库结构的法律管辖。完整性规则保护数据库中的数据和结构。Oracle数据库的物理和逻辑结构。通过分离的物理和逻辑数据库结构,数据的物理存储进行管理,而不影响逻辑存储结构的访问。,逻辑数据结构,Oracle数据库的逻辑结构是由:一个或多个表空间 数据库的模式对象(例如表,视图,索

8、引,簇,序列,存储过程) 逻辑存储结构,包括表空间,段和范围,决定了数据库的物理空间是如何使用的。模式中的对象和它们之间的关系的关系数据库设计 表空间和数据文件 表空间是主要的任何Oracle数据库的逻辑存储结构。Oracle数据库的可用的数据在逻辑上是存储在表空间和物理存储在相应的表空间关联的数据文件。下图说明了这种关系。虽然是密切相关的数据库,表空间,数据文件和段,他们有重要的区别: 数据库和表 Oracle数据库是由一个或多个逻辑存储单位称为表空间。 集体数据库的数据存储在数据库的表空间。,逻辑数据结构,表空间和数据文件 在Oracle数据库中的每个表空间由一个或多个操作系统文件称为数据

9、文件。一个表空间的数据文件存储在磁盘上的相关数据库中的数据。 数据库和数据文件 集体构成数据库的每个表空间的数据文件存储在数据库的数据。例如,最简单的ORACLE数据库有一个表,一个数据文件。一个更复杂的数据库可能有三个表空间,每两个数据文件(共6个数据文件)组成。 模式对象,段和表 如表或索引的架构对象被创建时,其细分市场中创建指定的数据库中的表空间内。例如,假设是在一个特定的表空间使用与该表选项的CREATE TABLE命令创建一个表。此表的数据段的空间被分配在一个或多个指定的表空间的数据文件构成。一个对象的段只有一个数据库的表空间分配的空间。,逻辑数据结构,数据文件和表空间,分配资源原则

10、,一个数据库被分成称为表空间的一个或多个逻辑存储单位,优化资源需要做到: 控制数据库中的数据的磁盘空间分配 为数据库用户分配特定的空间配额 通过联机或脱机的各个表空间的数据控制可用性 执行部分数据库备份或恢复操作 之间分配数据存储设备,以提高性能,数据块 扩展 段,数据块 在粒度的最好水平,一个Oracle数据库的数据存储在数据块(也称为逻辑块,Oracle块,或网页)。Oracle数据库的使用和分配Oracle数据块的免费数据库空间。图4显示了一个典型的Oracle数据块。 扩展 被称为逻辑数据库空间的一个新的水平在一定程度上。在一定程度上是一个连续的数据块,用于存储一个特定类型的信息分配的

11、具体数量。 段 以上程度的逻辑数据库存储的水平,被称为段。段是一组已分配给一个特定类型的数据结构,并都在相同的表空间中存储的范围,数据块 扩展 段逻辑结构,数据块格式,数据块结构,头(通用和可变) 头包含一般块信息,如块地址,段类型,如数据,索引,或回滚。虽然有些块的开销是固定大小(约107字节)的总块的开销大小是可变的。 表目录 块表的目录部分包含有这个块中的行的表的信息。 行目录 这部分块包含行有关信息块中的实际行(包括每行中的数据区的排片的地址)。一旦空间已分配块的标题行目录,这个空间是该行被删除时不回收。 行数据 这部分块包含表或索引的数据。行可以跨越块。,数据库结构,剩余空间 自由空

12、间是用来插入新行,需要额外的空间(例如,当更新一个结尾的空是一个非空值)的行的更新。发出的插入是否实际上发生在一个给定的数据块的空间管理参数PCTFREE和当前数据块中的自由空间量值的函数。 用于处理事务的空间 表,群集或索引的索引段数据段分配的数据块,也可以使用交易条目的自由空间。,Pctfree和pctused 1,两个空间管理参数,pctfree和pctused,允许开发人员控制的自由空间插入和更新数据块行使用。这两个参数只能在创建或更改表和簇(数据段)时指定。此外,也可以指定存储参数PCTFREE的创建或更改indicies(索引段)。 PCTFREE参数是用来设置一个块的百分比预留可

13、能的更新,现在已经在该块中的行(保持免费)。例如,假设您在CREATE TABLE语句指定以下参数:,Pctfree和pctused 2,PCTFREE 20这20 用于此表中的数据段的每个数据块将保持自由和可能的更新现有的行,已经在每个块。 后一个数据块已满,由PCTFREE的决定,该块不考虑新行插入到正在使用的块的百分比低于参数PCTUSED的。价值的实现,在此之前的自由空间的数据块只能用于在数据块中已经包含的行的更新。例如,假设您在CREATE TABLE语句指定以下参数: PCTUSED 40在这种情况下,一个数据块用于本表的数据段不考虑任何新行插入,直到使用的空间量块下降到39 或更

14、少(假设,块的使用空间已先前达成的PCTFREE )。,数据库物理结构,不管是什么类型,在数据库中的每个段至少有一个程度持有其数据。这个意义上被称为段的初始范围。 如果段的初始范围的数据块成为完全的,需要更多的空间容纳新的数据,Oracle会自动分配一个该段的增量范围。增量程度上是随后在该段范围相同或递增的大小程度。 在Oracle数据库中的每一个非聚集表有一个单独的数据段,它的所有数据。间接通过在CREATE TABLE / SNAPSHOT命令创建一个表的数据段。,数据库物理结构,存储参数表,快照,或集群控制的分配方式,一个数据段的范围。通过在CREATE TABLE /快照/群集或ALT

15、ER TABLE /快照/ Cluster命令设置这些存储参数,直接影响到数据检索和数据段的存储效率。 Oracle数据库的物理结构,是由构成数据库的操作系统文件。每个Oracle数据库是由这些类型的文件:一个或多个数据文件,重做日志文件的两个或两个以上的,以及一个或多个控制文件。数据库中的文件提供了实际的物理存储数据库中的信息,数据库物理结构 图,目录,1,5,Oracle数据库体系结构,事务,绑定变量,索引,高效编码原则,事务,事务是使数据库和文件系统分离的一个特性。当在文件系统中写文件的时候遇到操作系统崩溃,文件就可能被破坏。有“日志”的文件系统能把文件恢复到前一个时间段的状态,但要想保

16、持两个同步文件就不行了。如果更新了一个文件,在完成第二个文件更新之前系统出现故障,这两个文件将不同步。 这就是事务存在的主要目的。事务的作用是能把数据库从一个一致的状态转移到另一个状态。当在数据库中提交工作时,能确定要么储存了所有的修改,要么什么都没有储存。也就是说,事务能保证各种实施数据完整性的规则和检查得以实现。 事务应具备以下几个基本属性: 原子性:一个事务要么完全发生,要么完全不发生。 一致性:事务把数据库从一个一致的状态转变到另一个状态。 隔离性:在事务提交之前,其他事务察觉不到事务的影响。 持久性:一旦事务提交,它是永久的。,事务控制语句,在Oracle中没有专门的“开始事务”语句

17、。事务开始于第一条修改数据的语句。利用COMMIT和ROLLBACK语句结束事务。如果没有提交或回滚而正常推出SQL*PLUS会话,SQL*PLUS将假定用户想要提交工作。 在Oracle中,要么全部提交包含在事务中的所有语句(永久的),要么所有语句回滚。对于单条语句也是如此,一条语句的失败不能使它前面执行的语句自动回滚。它们的工作是保存的,要么提交,要么回滚。以下是几种常见的事务控制语句: COMMIT:提交事务,使改变成为永久的。 ROLLBACK:回滚,结束事务,撤消任何没有提交的操作。这是通过读取存储在回滚段里的信息来实现的,并把数据库恢复到开始执行事务之前的状态。 SAVEPOINT

18、:允许在事务中创建一个“标记点”。 SET TRANSECTION:允许设置不同的事务属性,也可以使用此语句来指示事务使用某个特定的回滚段。,分布式事务,Oracle的一个特性就是能够透明地处理。对于单个事务,可以在不同的数据库里更新数据。提交时,要么提交全部实例的更新,要么都不能提交(全部回滚)。不需要额外代码来完成,只是简单地“提交”即可 。 在Oracle中分布式事务的关键是数据库链接。数据库链接是一个数据库对象,用来描述如何从一个实例进入另一个实例。一旦设置了数据库链接,访问远程对象是很简单的。分布式事务中也存在一些限制: 不能通过数据库链接使用COMMIT。只能从发起事务的站点提交。

19、 通过数据库链接不能执行DDL(数据库动态链接)。 不能通过数据库链接使用SAVEPOINT。简单讲,不能通过数据块链接使用任何事务控制语句。 以上是对Oracle体系结构和事务的介绍,在理解这两方面基本内容的基础上,下一节将进入Oracle其他相关领域的讨论,目录,1,5,Oracle数据库体系结构,事务,绑定变量,索引,高效编码原则,绑定变量,绑定变量是Oracle用来提高查询速度,节省系统开销的一个重要手段。在复杂的SQL语句中,绑定变量对于系统性能的影响是非常大的。本节将通过实例说明如何绑定变量,并讨论与绑定变量有密切联系的数据库解析问题 使用绑定变量 绑定变量基本上就是将函数绑定到内

20、部触发器上以读写该变量。它会告诉Oracle我会随后为这个变量提供一个值,现在需要生成一个方案,但我实际执行语句的时候,我会为您提供应该使用的实际值。不合理使用绑定变量甚至不使用绑定变量是数据库应用程序问题的主要原因和伸缩性的主要障碍。Oracle共享池(非常重要的共享内存数据结构)操作方法决定了开发人员使用绑定变量。拒绝使用绑定变量会使Oracle数据库运行速度减慢,甚至完全中止。,绑定变量,在查询中,绑定变量是一个占位符。例如,要检索员工123的记录,可以执行查询:select * from emp where empno = 123;还可以 select * from emp where

21、 empno = :empno; 在典型查询中,查询员工123一次,可能再也不会查询。然后,再查询员工456,然后是员工789等等。如果再查询中使用常量,那每次的查询都是一个新查询。每次查询都要经过解析、限定(名称解析)、安全查询、优化等等,简单说来,每条语句在每次执行时都要经过编译。 第二种查询使用了一个绑定变量:empno,它的值由查询执行时提供。这样的查询被编辑一次然后储存在一个共享池内(高速缓冲存储器),通过它查询可被再次找到或使用。这两种查询在运行和升级方面表现上的差异是巨大的,有时惊人。,绑定变量,从上面的例子可以看出,分析一个带有硬编码变量的语句(称作硬解析)将比重复用一条已经分

22、析过的查询方案(称作软解析)花费更长时间并消耗更多资源。还不太清楚前者会在多大程度上减少系统所能支持的用户的数量。部分原因是由于对资源的消耗量增加了,但主要的因素是由于对数据库高速缓存的锁存机制,绑定变量与解析,上面的例子中提到Oracle的硬解析和软解析,这两者都与绑定变量密切相关。当用户发出一条SQL语句交付Oracle,在执行和获取结果前,Oracle对此SQL将进行几个步骤的处理过程: 1、语法检查(syntax check),检查SQL的拼写是否语法; 2、语义检查(semantic check),诸如检查SQL语句中的访问对象是否存在及该用户是否具备相应的权限; 3、对SQL语句进

23、行解析(parse),利用内部算法对SQL进行解析,生成解析树(parse tree)及执行计划(execution plan)。 4、执行SQL,返回结果(execute and return)。软硬解析就发生于第三的过程。Oracle利用内部的hash算法来取得该SQL的hash值,然后在library cache里查找是否存在该hash值;假设存在,则将此SQL与cache中的进行比较;假设“相同”,就将利用已有的解析树与执行计划,而省略了优化器的相关工作。这也就是软解析的过程。,绑定变量与解析,如果上面的2个假设中有任有一个不成立,那么优化器都将进行创建解析树、生成执行计划的动作。这个

24、过程就叫硬解析。 使用绑定变量是很重要的,因为当你向Oracle数据库提交任何SQL或PL/SQL时,Oracle首先搜索共享池,查看它是否已经存在。比如SQL查询,Oracle会将查看那个查询是否已经解析并优化。如果发现了查询,就可以准备运行了。如果Oracle没有在共享池中发现查询,就会对此查询进行解析、优化、安全检查等等,不仅耗费大量的CPU功率(CPU的处理时间比查询本身多了很多倍),而且在相当长的时间内锁住了一部分库缓存。这种现象在单用户查询时并不明显,但是解析查询的人越多,等待关闭库缓存的时间越长,系统就会渐渐地趋向停止。 下面通过一个例子对绑定变量及解析做进一步说明。开始时,创建

25、一个全局地临时列表SESS_EVENT,用于测量会话等待事件,等待了多少次,按0.01秒计算等待了多长时间。,目录,2,5,Oracle数据库体系结构,事务,绑定变量,索引,高效编码原则,索引分类,B*树索引:有四种子类型分区索引、反转关键字索引、索引组织表和簇索引。 位图索引 基于函数的索引:实际上是B*树索引和位图索引的特例 在Oracle中还引入了下列与索引相关的术语: 本地索引与全局索引 前缀索引与非前缀索引 抽象数据块类型索引 应用程序域索引,B-Tree索引,B*树索引在 Oracle 中是一个通用索引。 在创建索引时它就是默认的索引类型。B*树索引可以是一个列的索引也可以是组合/

26、复合(多个列)的索引。B*树索引的结构以一个根结点(root)开始,这个根结点是索引的起始点。根结点包含索引行(索引数据行),索引行含有索引关键值的范围和指向下一个索引块(称为树枝块)的ID号,树枝块依次含有索引行。它们包含了其他分枝块更细化的索引关键值的范围和树枝链中下一个块的ID号。每级分枝块被称为一个索引级别(index level)。在索引 树 的 最 底 层 的 块 称 为 叶节点 。叶节点块 包 含 了 索 引 值、ROWID,以及前一个和后一个叶节点的数据块的数据块地址(DBA)。到达一个叶节点必须经过的索引级数决定了找到需要的数据行所必需的I/O数量。 在任何B*树索引实现中,

27、一个重要目标就是增加分支数、减少高度,从而保证对叶节点的访问被加速。主要应该注意的问题是INSERT操作、DELETE操作与UPDATE操作。在每个INSERT操作中,关键字必须被插入在正确的叶节点位置上。如果叶节点已满,就必须将叶节点拆分。拆分过程需要花费一定的开销,特别是进行物理I/O动作。此外,在拆分之前,Oracle必须找到一个空闲块,用来保存这个拆分 对于B*树索引的应用,应注意以下几点准则: 避免对那些可能会产生很高的更新动作的列进行索引。 避免对那些经常会被删除的表的多个列进行索引。 避免对那些唯一度不高的列创建B*树索引。这样的低选择性会导致叶节点稠密,从而导致因索引平铺而出现

28、的大规模索引扫描。 空值不应该存储在单列索引中。对于复合索引的方式,只有当某个列不空时,才需要进行值的存储,BitMap索引,在位图索引中,Oracle 为每个唯一键创建一个位图, 然后把与关键值所关联的ROWID保存为位图。B*树索引与位图索引之间的最大区别是,前者能够支持 具有高选择性地在列上创建索引,而后者能够提供的选择性就比较低。位索引所创建的是包含有每个特定关键字0、1值的二进制位映射流。由于这里需要进行的是位级二进制运算,因此大量的行可以被高速处理。当一个表内包含了多个位图索引时,Oracle 可以合并从每个位图索引得到的结果集,快速删除不必要的数据。同时,由于位图索引是以压缩形式

29、储存的,因此可以节省大量空间。 对于那些有较低基数的列要使用位图索引。这是因为它们相对于B树索引在叶子结点在占用空间上少得多,他们是同一个 ROWID,事实上经过EXPLAN PLAN输出显示多个位图索引合并,性能得到了显著的提高。 但是位图索引有很多缺点: 位图索引被存储为压缩的索引值,其中包含了一个范围的ROWID,因此 Oracle必须针对一个给定值锁定所有范围的ROWID。这种锁定可能在某些DML语句中造成死锁。 位图索引不能被声明为唯一索引。 基于规则的优化器不会考虑位图索引。 在创建位图索引之前,必须考虑以下问题: 表是否经常被这个列查询?若不是,是否真正需要在这个列上建立一个索引

30、? 表中有多少行?对于小表(几千行)就没有必要建立索引,因为在这种情况下,进行表的完全扫描通常都足够快。 列的基数是多少?在低基数数据库中,位图索引是最合适的。 总之,经过分析表明,最好不要在繁重的OLTP环境中使用位图索引,函数索引,基于函数的索引是在Oracle8.1.5版本中加入的。基于函数的索引有索引计算的能力,并且能在查询中使用这些索引。简言之,允许大小写不敏感搜索和排序,复杂等式上的搜索,和通过执行自己的函数和操作符来有效地扩展SQL语言,然后进行。 使用基于函数的索引的好处是: 易于实现并提供直接结果。 在不改变任何逻辑或查询的情况下,用来加速现有的应用程序,建立合理的索引,以上

31、是对于几种主要索引性能优劣的简要分析,并且介绍了几种索引的适用情况。从索引的结构和原理可以看出:虽然Oracle可以通过索引访问来避免对表的扫描,以此减少大量的I/O操作从而提高系统的性能,但同时也会增加系统的负担。主要有以下三方面: 创建和维护索引要耗费系统时间; 存储索引需要额外的物理空间; 对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这就降低了数据的维护速度。 那么何时需要创建索引、创建多少索引、创建索引后如何不限制索引才能获得最大的性能是关键问题。索引并不是越多越好,针对不同情况要选择相适应的索引才能最大限度提升数据库的性能。Oracle极大地增加了可使用的索引种类。但

32、是,常规的B*树索引在大多数情况下仍是最好的索引方案,只要对B*树索引进行合理维护。但有时使用其他索引方案(例如位图索引),或使用B*树索引的变种方案(如反向索引、分区索引、索引组织表),效果会更好,目录,2,4,Oracle数据库体系结构,事务,绑定变量,索引,高效编码原则,命名规则,标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解 说明: 标识符最好采用英文单词或其组合,不允许使用拼音。程序中的英文单词一般不要太复杂,用词应当准确。 标识符名分为两部分:规范标识符前缀(后缀) + 含义标识 当标识符由多个词组成时,每个词的第一个字母大写,其

33、余全部小写. 含义标识命名规则,变量命名使用名词性词组,函数命名使用动词性词组。 程序中严禁出现仅靠大小写区分的相似的标识符 用正确的反义词组命名具有互斥意义的变量或相反动作的函数等 考虑到习惯性问题,局部变量中可采用通用的命名方式,仅限于n、i、j 等作为循环变量使用 自己特有的命名风格,要自始至终保持一致,不可来回变化,Proc服务编码规则,检查数据库长连接,除基础域服务其余都用长连接。 示例: int tpsvrinit(int argc, char *argv) spublicDBLogin(NULL,NULL,“s1100Cfm,LABELDBCHANGE); return(0);

34、在服务启动时调用tpsvrinit函数中连接数据库,在服务推出函数中断开数据连接void tpsvrdone() spublicDBClose(LABELDBCHANGE); ,Proc服务编码规则,SQL语句使用缩进和关键字对齐原则,SQL 语句中出现的系统保留字、内置函数名、SQL保留字、字段名等都应大写,使其更易读且易于维护。 不规范写法: EXEC SQL select id_no,sm_code,contract_no,cust_id, run_code,belong_code into :idNo,:smCode,:contractNo,:custId,:runCode, :bel

35、ongCode from dCustMsg where phone_no=:iphoneNo; 提倡写法: EXEC SQL SELECT ID_NO, SM_CODE, CONTRACT_NO, CUST_ID, RUN_CODE, BELONG_CODE INTO :idNo, :smCode :contractNo, :custId, :runCode, :belongCode FROM DCUSTMSG WHERE PHONE_NO=:iphoneNo;,Proc服务编码规则,SQL语句出错判断,使用NOTFOUND、SQLOK等宏判断SQL语句是否正确执行 E-SQL使用自己的出错控

36、制,不使用E-SQL提供的统一出错控制,E-SQL的出错一般设置为无效。 EXEC SQL WHENEVER SQLERROR CONTINUE; EXEC SQL WHENEVER SQLWARNING CONTINUE; EXEC SQL WHENEVER NOT FOUND CONTINUE; 属主变量都要放在SQL定义区统一定义。 EXEC SQL BEGIN DECLARE SECTION; char sSql1024+1; EXEC SQL END DECLARE SECTION;,Proc服务编码规则,定义字符数组时,必须在内使用+1形式 说明: 字符数组长度与数据库字段长度相对

37、应,对于今后扩展性比较强的字段,该字符数据长度可以适当增加, 并使用”+1”形式标识字符型字段数据提取出来后会自动补充0结束符; 不允许使用SELECT * 说明: 使用SELECT语句时,不允许使用SELECT *,要使用明确的列名。目的是防止数据字段增加后的影响。 INSERT必须指定插入的字段名。 说明: 使用INSERT时,必须指定插入的字段名,主要是考虑以后表结构的变动。 函数及表达式放在等号左边。 说明:为提高SQL执行效率,避免全表扫描,应将SQL语句中的数据库函数、计算表达式等放置在等号右边。不要在等号的左边。,Proc服务编码规则,游标使用结束后必须关闭。尽量避免循环open

38、_cursor。 PROC程序中禁止出现用户名和明文密码。 在获取输入参数时必须使用strncpy,不得使用strcpy 说明 不使用strcpy(custName,input_param0) 使用strncpy(custName,input_param0,sizeof(custName)-1); 注意: 对于目的变量custName使用前进行初始化 编写TEXUDO服务时输入输出参数的长度不能超过1000个字节 编写TUXEDO服务时编写的返回值的数量不能超过50个;如果超过50个参数,参数按行放在第一列GPARM32_0中 输出参数缓冲的内存分配,必须调用函数MemoryAllocate3

39、2 说明 MemoryAllocate32已经封装输出缓冲区的分配,并以做了容错处理,规定直接调用MemoryAllocate32,Proc服务编码规则,一个TUXEDO SERVER中的SERVICE不能超过10个 TUXEDO的错误代码和错误信息必须放在SVC_ERR_NO32和SVC_ERR_MSG32中,不能占用GPARM32_X的位置 服务调试信息采用统一控制规则,对日志进行非类,分监控类、调试类等,原则上服务中不能出现printf等语句,Utype规范,避免将多个智能指针指向同一块内存区域。 错误示例: uAutoPtr uPtrA(uInit(0); /uPtrA为多层utype

40、结构 uAutoPtr uPtrB(uInit(0); utSetStruct(uPtrB,0,utGetStruct(uPtrA,0); / uPtrB第0元素指向uPtrA第0元素内存区域 说明: 智能指针uPtrA 与智能指针uPtrB的第0元素均指向同一内存区域,当作用域退出时,智能指针uPtrA和uPtrB均会对该内存区域进行内存释放,首先释放后内存交还操作系统,再次对该区域释放将造成应用程序COREDUMP。 正确方法: uAutoPtr uPtrA(uInit(0); /uPtrA为多层utype结构 uAutoPtr uPtrB(uInit(0); utSetStruct(uP

41、trB,0, utClone (utGetStruct(uPtrA,0); / 拷贝uPtrA第0个元素内存区域至一块新内存区域,并将新地址赋值给uPtrB 说明: 智能指针uPtrA 与智能指针uPtrB的第0元素均指向不同内存区域,不会造成内存两次释放。,Utype规范,不可手动释放与某智能指针指向同一内存区域的uType指针,但是指向新内存区域的uType指针必须手动释放。 示例说明: utype *puPtrA=NULL; /非uType智能指针puPtrA /为puPtrA赋值多层utype结构 uAutoPtr uPtrB (uInit(0); utSetStruct(uPtrB,

42、0, puPtrA); /未用utClone(), puPtrA与uPtrB第0元素指向同一内存区域 说明: 因未使用utClone()进行内存拷贝,所以puPtrA与智能指针uPtrB第0元素指向同一内存区域,不可使用uFree(puPtrA)对puPtrA指向的内存区域进行释放,否则智能指针uPtrB对该内存区域进行自动释放时将产生两次内存释放,造成应用程序COREDUMP。 utype *puPtrA=NULL; /非uType智能指针puPtrA /为puPtrA赋值多层utype结构 uAutoPtr uPtrB (uInit(0); utSetStruct(uPtrB,0, utC

43、lone(puPtrA); /使用utClone(),uPtrB第0元素指向一块新内存区域 说明: 因使用了utClone()进行内存拷贝,智能指针uPtrB第0元素指向的是新的内存区域, 智能指针uPtrB退出作用域时自动释放该新的内存区域, puPtrA指向的内存区域如不使用uFree(puPtrA)将不会得到释放,造成内存泄露,Utype规范,被调函数返回utype指针时使用release()方法,此时主调函数必须使用utype指针或uType智能指针进行接收。使用普通指针要注意内存释放 在对uType智能指针赋值使用前必须进行初始化。在对uType普通指针赋值使用前必须保证上一次指向的

44、内存区域得到释放 UTYPE指针参数,不要直接使用utClone UTYPE数据结构作为函数参数时不要使用release()方法。除非该被调函数对该内存区域进行释放 DBUG_ENTER和DBUT_RETURN在一个函数中必须成对出现 使用原子函数要求复用原则,严禁在已有相同功能原子函数的情况下新建原子函数 新建原子函数要求考虑复用原则,必须充分考虑SQL语句执行正确性及执行效率,数据库操作编码规范,减少子查询的使用 子查询除了可读性差之外,还在一定程度上影响了SQL运行效率. 应尽量减少子查询的使用,采用其他效率更高、可读性更好的方式替代 使用DECODE函数来减少处理时间 使用DECODE

45、函数可以避免重复扫描相同记录或重复连接相同的表. 示例: SELECT COUNT(*),SUM(SAL) FROM EMP WHERE DEPT_NO = 0020 AND ENAME LIKE SMITH%; SELECT COUNT(*),SUM(SAL) FROM EMP WHERE DEPT_NO = 0030 AND ENAME LIKE SMITH%; 可以用DECODE函数高效地得到相同结果 SELECT COUNT(DECODE(DEPT_NO,0020,X,NULL) D0020_COUNT, COUNT(DECODE(DEPT_NO,0030,X,NULL) D0030_

46、COUNT, SUM(DECODE(DEPT_NO,0020,SAL,NULL) D0020_SAL, SUM(DECODE(DEPT_NO,0030,SAL,NULL) D0030_SAL FROM EMP WHERE ENAME LIKE SMITH%;,数据库操作编码规范,用UNION替换OR (适用于索引列) 通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低. 在下面的例子中, LOC_ID 和REGION上都建有索引

47、. 高效: SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10 UNION SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE REGION = “MELBOURNE” 低效: SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10 OR REGION = “MELBOURNE” 注意: WHERE KEY1 = 10 (返回最少记录) OR KEY2 = 20 (返回最多记录) ORACLE 内部将以上转换为 W

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论