Csdn Emag(Oracle)第一期

1,921 views
1,821 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,921
On SlideShare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
21
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Csdn Emag(Oracle)第一期

  1. 1. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 第 1 页 共 131 页
  2. 2. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 CSDN Oracle 电子杂志创刊号 本期内容导读 篇首寄语 几句需要说在前面的话. 基础篇 书写历史的甲骨文-ORACLE 公司传奇 -- By Fenng Oracle 公司作为全球第二大软件公司无疑已经成为一个 IT 界的传奇,Fenng 这篇文章 为我们介绍了这个值得尊敬的公司的历史。 开发篇 判断某个字符串是否为数字的方法 -- By bzszp 开发中的一些常用技巧,这样的问题,几乎每个开发人员在走过的路上都曾经遇到... 使用 sql 语句直接生成带有'小计','合计'的数据集 -- By bzszp SQL 的常用小技巧 Oracle 中的进制转换 By eygle 在开发过程中,我们经常会遇到不同进制之间转换的问题,本文收集了集中常见的用 法供大家参考。 C#+Oracle 开发中执行存储过程问题 -- By dinya 当前开发过程中,微软的.NET+Oralce 是常见的架构,在开发过程中很多时候需要通 过前台程序调用数据库中的一些对象,本文以一个实例的形式,对 C#+Oracle 数据库的开 发中 C#执行 Oracle 存储过程问题做一简要阐述。 性能调整篇 Oracle 诊断案例-如何捕获问题 SQL 解决过度 CPU 消耗问题 -- By eygle 第 2 页 共 131 页
  3. 3. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 在数据库管理中,经常会遇到 CPU 过度消耗的问题,这一类问题通常是因为不良 SQL 代码引起的,本文对于这一类问题的解决给出了通用的处理办法,通过实际案例的介绍, 希望能给大家提供一些解决类似问题的参考。 关于 Oracle 数据库中行迁移/行链接的问题性能影响及解决 -- By Coolyl 行迁移/行链接是经常会遇到,因此而带来的性能影响很多时候是不容忽略的,Coolyl 的文章详细分析了行迁移/行链接的产生原因,以及如何消除。 关于索引使用情况的研究 -- By bzszp 关于索引使用的一些探索和研究,在开发和系统设计中索引无疑都是非常重要的一个 环节,希望大家能从本文中对于索引的作用及常见问题有所了解. Oracle SQL 优化手册 -- By snowywolf 这是雪狼翻译的作品,原书 Oracle SQL Tuning Pocket Reference 无疑是一部广为人知 的作品。 我们期待雪狼完成全部作品的翻译,提供给大家更精彩的内容。 Oracle 高可用性篇 Oracle9i 数据库 DataGuard 实施及维护手册 -- By kamus 从 standby 到 DataGuard,Oracle 在高可用性方面又作了一个巨大的提高,DataGuard 在可管理性、可靠性、性能等方面都得到了提高,Kamus 在这篇文章中对于 DataGuard 的 实施和维护作了详尽的描述。 Oracle 深入研究篇 32bit Oracle SGA 扩展原理 和 SGA 与 PGA 的制约关系 -- By biti_rainy 通常我们知道,32 位的 Oracle 在默认情况下 Oracle SGA 不能超过 1.7g。那么为什么 存在这样的限制?可以怎样突破这些限制? Biti_rainy 从内部原理上探索了这些限制的原 因。 关于 shared pool 的深入探讨 -- By eygle Shared pool 是 SGA 设置中最为复杂和重要的,而 SGA 设置过大很多时候会给数据库 带来很大的负面影响。Eygle 在本文及系列文章中深入探讨了 Oracle Shared pool 的内部管 理机制,揭示了 Shared Pool 的分配、作用等内部原理。 第 3 页 共 131 页
  4. 4. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 目 录 CSDN ORACLE电子杂志创刊号 .........................................................................................................2 本期内容导读 ..................................................................................................................................2 篇首寄语 ..........................................................................................................................................6 编者的话 ..........................................................................................................................................7 书写历史的甲骨文 ..........................................................................................................................8 ORACLE公司之起源.......................................................................................................8 发展与壮大.......................................................................................................................9 经受挫折.........................................................................................................................12 跨上巅峰.........................................................................................................................13 历史还在继续.................................................................................................................14 判断某个字符串是否为数字的方法.............................................................................................15 使用sql语句直接生成带有’小计’,’合计’的数据集.........................................................17 Oracle中的进制转换 ....................................................................................................................19 一 16 进制转换为 10 进制............................................................................................19 二 10 进制转换为 16 进制............................................................................................19 三 2 进制转换为 10 进制..............................................................................................20 四 通过自定义函数实现进制转换...............................................................................20 C#+Oracle开发中执行存储过程问题 ..........................................................................................23 1、在数据库中建一用户表及用户ID的序列:...........................................................23 2、在Oracle中建执行插入操作的存储过程: ............................................................24 3、在.NET项目建一个到数据库的联结: ..................................................................25 4、在类文件中添加如下内容,用来执行Oracle中的过程: ....................................25 5、在窗体界面中调用执行存储过程...........................................................................27 后记:.............................................................................................................................27 Oracle诊断案例--如何捕获问题SQL解决过度CPU消耗问题.....................................................29 1.登陆数据库主机..........................................................................................................29 2.使用Top命令 ...............................................................................................................30 3.检查进程数量..............................................................................................................30 4.检查数据库..................................................................................................................31 5.捕获相关SQL ..............................................................................................................35 6.决定创建新的索引以消除全表扫描..........................................................................38 7.观察系统状况..............................................................................................................39 8.性能何以提高? ............................................................................................................40 结语: ...............................................................................................................................42 关于Oracle数据库中行迁移/行链接的问题...............................................................................44 一、行迁移/行链接的介绍............................................................................................44 二、行迁移/行链接的检测............................................................................................50 三、行迁移和行链接的清除.........................................................................................53 方法一:传统的清除行迁移的方法.....................................................................54 方法二:改进了的传统清除行迁移的方法 .........................................................56 第 4 页 共 131 页
  5. 5. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 方法三:使用TOAD工具清除行迁移的方法 ......................................................58 方法四:使用EXP/IMP工具清除行迁移的方法 .................................................59 方法五:使用MOVE命令来清除行迁移的方法 .................................................61 方法六: 对于一些行迁移数量巨大而且表记录数巨大的表的行迁移的清除方法 .................................................................................................................................62 关于索引使用情况的简单测试.....................................................................................................67 Oracle SQL优化手册 ....................................................................................................................76 前言.................................................................................................................................76 一.Oracle 9i的新特性 ..................................................................................................76 二.SQL优化器 .............................................................................................................78 2.1 理解RBO .........................................................................................................78 2.2 理解CBO .........................................................................................................83 2.3 对优化器的一些常见的误解..........................................................................89 2.4 选择合适的优化器..........................................................................................90 Oracle9i数据库Data Guard实施及维护手册 ............................................................................91 一.Data Guard介绍 ......................................................................................................91 RAC (Oracle Real Application Cluster)..................................................................91 高级复制(Advanced Replication )..........................................................................92 Data Guard ..............................................................................................................93 二.Data Guard类型的比较 ..........................................................................................93 物理备用库(Physical Standby) .......................................................................94 : 逻辑备用库(Logical Standby) :.........................................................................94 最大数据保护模式(MAXIMIZE PROTECTION)...........................................95 最大可用性模式(MAXIMIZE AVAILABILITY) ............................................95 最大性能模式(MAXIMIZE PERFORMANCE) ..............................................96 ARCH方式..............................................................................................................96 LGWR方式.............................................................................................................96 三.硬件配置.................................................................................................................98 四.软件配置.................................................................................................................98 五.实施Data Guard前提条件和注意事项 ..................................................................98 六.实施步骤.................................................................................................................99 Physical Standby配置 .............................................................................................99 使用Data Guard Broker ........................................................................................105 七.在Cluster环境中的主备切换步骤 .......................................................................108 八.参考文档...............................................................................................................109 32bit oracle SGA 扩展原理 和 SGA与PGA的制约关系 ........................................................ 110 关于shared pool的深入探讨(之一) ....................................................................................121 (一)基础知识...........................................................................................................121 (二)Oracle8i中的管理方式 .....................................................................................122 (三)Oracle9i中的shared pool管理方式...................................................................123 (四)总结...................................................................................................................129 第 5 页 共 131 页
  6. 6. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 篇首寄语 CSDN 网络总监 韩磊 3 年前,当我开始做一个 Delphi 技术资料网站时,曾经把“出一本杂志”作为奋斗目标 之一;来到 CSDN 的运营公司后,在参与杂志编辑的过程中,常常听到读者要求出版专业技 术期刊的呼声。读者需求不可谓不强烈,我们也曾尝试在《程序员》杂志之外,在更专业的 领域尝试出版期刊(例如《MSDN 开发精选》就是专注微软技术) ,现在看来并不是完全成功。 杂志要生存和获利,不外乎靠广告或发行量。以国内 IT 界目前环境来说,专注于某个 特定技术领域的纸质杂志,发行量基本不可能达到盈亏平衡点,且广告主对太专业杂志的投 入也相当有限。一方面是读者的强烈需求,另一方面却必须面对亏损的尴尬——中国专业技 术期刊何去何从? 我们曾对比网络媒体和纸质媒体的特性,并得出一些有趣的结论。例如,网站每天浏览 量可能过百万,但摊到每篇文章,也许就只有数千;而一本杂志发行量可能只有数万,但单 篇文章被阅读的机会却大了很多。 网络媒体的特点是:知识可以被方便地创造、传播和复制。我们考虑:能否把网络媒体 和传统纸质杂志相结合,走一条独特的知识传播路径呢?于是,CSDN 社区电子期刊计划应 运而生。在这面旗帜下,将出现多本电子杂志,涵盖 Oracle、 Server、 SQL VC++、 开发、 Web .NET、 Java 等多个专业技术领域。 CSDN 社区电子杂志来自社区(编辑都是 CSDN 网友,许多内容资源也来自 CSDN 社区) , 服务社区(免费下载阅读),体现了“知识共创共享”的理念。未来社区电子杂志也存在一 些商业模式,但这两条是必须坚持的。 Oracle 杂志作为这个项目的第一项成果,凝聚了网友编辑们的心血和汗水。在没有得到 应有回报的情况下,全力投入做出这样一本精品电子杂志,真令人钦佩和赞赏!我们承诺, 根据需要,投入更多人力物力,让社区电子期刊计划得以维持和发展。 在此,我代表 CSDN.NET 运营方,对 CSDN 社区电子期刊 Oracle 杂志的顺利创刊致以热 烈的祝贺,并对所有参与编辑这本杂志的网友致以谢意。愿 Oracle 杂志这只领头羊再接再 厉,愿其他电子杂志早日面世,愿更多的网友参与到社区电子期刊的编辑工作中来。社区是 网友的社区,电子期刊是网友的期刊,让我们都来为社区的繁荣做出贡献吧! 2004 年 11 月 9 日 第 6 页 共 131 页
  7. 7. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 编者的话 本刊主编 Eygle 从 2004.10.11 开始筹划 CSDN 的 Oracle 电子杂志,到现在第一期杂志编辑完毕。将近 一个月的时间过去了。 一本杂志从策划、定位、筹稿、编辑到发布,我们花费了大量的时间和精力,那么当这 样一期杂志呈现在大家面前的时候,到底能获得怎样的评价和认同,我们的心底是满怀激动 却又惴惴不安的。在期待赞许的同时我们也同样期待大家的批评,而我们更希望的是越来越 多的朋友参与到 Oracle 杂志的中来,最终把杂志做成我们大家的朋友。 这一期杂志,是 CSDN Oracle 电子杂志的创刊号,准备时间及编辑都显仓促,不足在所 难免,我们期待大家的反馈。 任何批评、建议及投稿你都可以发送到: emag_oracle@csdn.net 在你读完这期杂志以后,如果能够觉得有所收获,我们将感到无比欣慰。 闲言少叙,最后让我们感谢为此杂志付出努力的朋友们,也就是 Oracle 杂志所有的编辑 们,没有他们这期杂志不可能如此快的同大家见面,他们是: biti_rainy, bzszp, chanet, coolyl, dinya eygle, Fenng, j2eexin, kamus, simore, snowywolf 关于编辑的具体情况你可以在杂志首页找到详细的介绍。 http://emag.csdn.net/Default.aspx?tabid=49 2004-11-07 第 7 页 共 131 页
  8. 8. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 书写历史的甲骨文 ―ORACLE 公司传奇 By Fenng ORACLE 公司之起源 很难想象,ORACLE 公司的这一段传奇居然要从 IBM 开始。 1970 年的 6 月, 公司的研究员埃德加·考特 (Edgar Frank Codd) 在 Communications IBM of ACM 上发表了那篇著名的《大型共享数据库数据的关系模型》(A Relational Model of Data for Large Shared Data Banks)的论文。这是数据库发展史上的一个转折。要知道, 当时还是层次模型和网状模型的数据库产品在市场上占主要位置。从这篇论文开始,拉开了 关系型数据库软件革命的序幕。 虽然早在 1970 年就诞生了关系模型理论,但是市场上迟迟不见关系型数据库管理软件 的推出。主要原因是很多反对者认为关系型数据库速度太慢,比不上当时的层次式数据库。 值得好笑的是,IBM 虽然 1973 年就启动了 System R 的项目来研究关系型数据库的实际可行 性,也没有及时推出这样的产品,因为当时 IBM 的的 IMS(著名的层次型数据库)市场不错, 如果推出关系型数据库,牵涉到 IBM 很多人的自身利益。再者,IBM 庞大复杂的官僚机构处 在决策上远不那么灵活。 1977 年 6 月,Larry Ellison 与 Bob Miner 和 Ed Oates 在硅谷共同创办了一家名为软 件开发实验室(Software Development Laboratories,SDL)的计算机公司(ORACLE 公司 的前身)。那个时候,32 岁的 Larry Ellison,这个读了三家大学都没能毕业的辍学生,还 只是一个普通的软件工程师。公司创立之初,Miner 是总裁,Oates 为副总裁,而 Ellison, 因为一个合同的事情,还在另一家公司上班。没多久,第一位员工 Bruce Scott (用过 ORACLE 数据库软件的人都知道有个 Scott 用户的吧?没错,就是这个 Scott,至于 Scott 用户的密 码 Tiger,那是 Scott 养的猫的名字)加盟进来,在 Miner 和 Oates 有些厌倦了那种合同式 的开发工作后,他们决定开发通用软件,不过们还不知道自己能开发出来什么样的产品。 Oates 最先看到了埃德加·考特的那篇著名的论文连同其他几篇相关的文章并推荐 Ellison 和 Miner 也阅读一下。Ellison 和 Miner 预见到数据库软件的巨大潜力(跟着 IBM 走,没错), 于是,SDL 开始策划构建可商用的关系型数据库管理系统(RDBMS)。 很快他们就弄出来一个不太像样的产品,或者具体的说,更像一个 Demo。根据 Ellison 和 Miner 他们在前一家公司从事的一个由中央情报局投资的项目代码,他们把这个产品命名 为 ORACLE。因为他们相信,ORACLE(字典里的解释有“神谕, 预言”之意)是一切智慧的 源泉。1979 年,SDL 更名为关系软件有限公司(Relational Software,Inc.,RSI) ,毕竟 “软件开发实验室”不太像一个大公司的名字。1983 年,为了突出公司的核心产品,RSI 再次更名为 ORACLE。 第 8 页 共 131 页
  9. 9. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 图1 美国 ORACLE 公司总部一瞥 发展与壮大 RSI 在 1979 年的夏季发布了可用于 DEC 公司的 PDP-11 计算机上的商用 ORACLE 产品,这 个数据库产品整合了比较完整的 SQL 实现,其中包括子查询、连接及其他特性。但不得不说, 软件不是很稳定,并缺少事务处理这样的重要功能。出于市场策略,公司宣称这是该产品的 第二版,但却是实际上的第一版。之所以被命名为第 2 版而不是第 1 版,是因为 Ellison 认为潜在的客户更愿意购买第 2 个版本,而不是初始版本。 (虽然这样做有些不太诚实,还 是要承认这是个十分高明的技巧。到现在还有一些公司把自己卖给客户的版本叫做 1.0 , 学学 1979 年的 ORACLE 吧! 多年以后的今天,ORACLE 公司声称是他们第一个提供了第一 ) 个 SQL 关系型数据库管理系统。 虽然软件不是很好,但是客户还是有的。美国中央情报局迫不及待的想买一套这样的软 件来满足他们的需求。但在咨询了 IBM 公司之后发现 IBM 没有可以商用的产品,他们联系了 RSI。于是 RSI 有了第一个客户。在当时,政府和军方的机构往往同时有几种计算机,而那 时还没有什么“软件可移植”这样的说法,当然,也几乎没有具有这样的能力的应用软件。 也就是说, PDP-11 开发的 ORACLE 数据库不能用在 IBM 主机和 DEC 的 VAX 上。 给 很快用户就 表现出来这样的需求:ORACLE 能否同时在不同的操作系统上运行?这给 RSI 带来了新的挑 战(主要是 Miner 和 Scott) 70 年代末期和 80 年代早期的软件一般都设计成在单一操作系 。 统上运行,具有可移植能力的软件很少。 第 9 页 共 131 页
  10. 10. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 1983 年 3 月,RSI 发布了 ORACLE 第三版。Miner 和 Scott 历尽艰辛用 C 语言重新写就这 一版本。要知道,C 语言当时推出不久,用它来写 ORACLE 软件也是具有一定的风险的,但 除此之外,别无他法。很快就证明了这样做是多么的正确,C 编译器便宜而又有效。从现在 起,ORACLE 产品有了一个关键的特性:可移植性。ORACLE 第 3 版还推出了 SQL 语句和事务 处理的“原子性”――SQL 语句要么全部成功,要么全部失败,事务处理要么全部提交,要 么全部回滚。ORACLE 第 3 版还引入了非阻塞查询,使用存储在"before image file"中的数 据来查询和回滚事务,从而避免了读锁定(read lock)的使用(虽然通过使用表级锁定限 制了它的吞吐量)。同样是 1983 年,IBM 发布了姗姗来迟的 Database 2(DB2),但只可在 MVS 上使用。不管怎么说,ORACLE 已经占取了先机。 在开发第三版还没有结束的时候,Scott 离开了 ORACLE。当时用 C 改写 ORACLE 的压力 很大,无休止的软件调试终于让 Scott 不堪重负,选择了一走了之。把剩下的重担交给了 Miner 一个人。在出售了自己的%4 的股票之后,Scott 后来创建了 Gupta 公司(现更名为 Centura Software)和 PointBase 公司(提供百分之百纯 Java 嵌入式数据库),都是开发和 数据库相关的产品。多年后有人问到他的%4 的 ORACLE 股票的时候,Scott,这个曾经给 ORACLE 写出第一行代码的技术高手,也只能报以一笑了。如果能坚持下来,那是一笔几亿 美金的财富。不过当时的 Scott 没有那么多的想法,他只是太累了。 图二 Bruce Scott 现在是 PointBase 公司的发起人之一 ORACLE 最先将其软件移植到 DEC VAX 计算机上的 VMS 操作系统上。早在 1979 年公司就 已经雇了一位 DEC 公司的技术高手 Robot Brandt 进行 VAX 上 ORACLE 的开发。开始的时候资 金有限,只能到加州大学伯克利分校去蹭机器进行开发,后来好一些,但机器也是借来的。 尽管困难重重,Brandt 还是比较成功的完成了移植工作。随着 VAX 小型机的大量销售乃至 供不应求,ORACLE 软件也成为 VAX 上最受欢迎的程序。这一点要归功于 Larry 对市场的先 知先觉。如果说,是 IBM 引领着 ORACLE 公司走上数据库的大船,那么 DEC 公司的 VAX 就是 带着他们扬帆出海了。短短的几年之后,ORACLE 数据库被移植到各种主要平台之上。 ORACLE 产品也一直因为有可移植性这个关键特性而被那些潜在的客户关注。 Oates 这个时候因为婚姻趋于破裂而情绪沮丧,已经不能把精力全部放到公司上,不得 不离开公司。几年后,他又重返公司,重新为 ORACLE 带来巨大的贡献,他许下诺言,在公 司员工超过 1 万人的时候会再度离开。1999 年,他完成了心愿。现在他正在纵情于音乐, 自得其乐。 很长一段时间里,公司研发由 Miner 独力承担。Miner 视金钱如无物,为人低调,和 Ellison 的锋芒必露形成鲜明的对比。在公司里,大家一致认为他是老好人,他也深受员工 爱戴。Ellison 是公司的大脑,Miner 则当之无愧的成为公司的心脏。他是个沉默的英雄, 正如 Steve Jobs 背后的 Steve Wozniak 一样。 1984 年 10 月,ORACLE 发布了第 4 版产品。产品的稳定性总算得到了得到了一定的增强, 第 10 页 共 131 页
  11. 11. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 用 Miner 的话说,达到了“工业强度”。但是还不够令人满意,用户对产品的抱怨似乎永无 休止。这一版增加了读一致性(read consistency),这是数据库的一个关键特性,可以确 保用户在查询期间看到一致的数据。也就是说,当一个会话正在修改数据时,其他的会话将 看不到该会话未提交的修改。可以看到,在 ORACLE 第四版之前,产品始终是不稳定的,但 是 ORACLE 的这群销售人员,主要是 Ellison,他在宣传 ORACLE 的时候总是要夸大其词,但 他就是有能力把软件卖出去,而且,还卖得很好,不得不承认,这的确有些神奇。让我们看 看 1984 年软件市场的情形,在数据库市场上的霸主是 Asnton-Tale 公司,他们的拳头产品 是刚推出不久的 dBase III(确切的说 dBase 是 PC 上的数据库软件霸主),刚刚成为全球第 三大的独立软件公司(第一和第二分别是微软、Lotus,ORACLE 在当时还排不上号),这一 年,也是苹果公司 Macintosh 诞生的年度,Steven Jobs 用这个拳头产品挑战老大哥 IBM。 同样在这一年中,ORACLE 公司的开发人员刚刚把产品移植到 PC 上。这是最好的年代,也是 最坏的年代。数以千计的小公司在软件领域里争斗不休,新公司如雨后春笋般成立,ORACLE 如何才能于不败之地? 在 1985 年,ORACLE 发布了 5.0 版。有用户说,这个版本算得上是 ORACLE 数据库的稳定 版本。这也是首批可以在 Client/Server 模式下运行的的 RDBMS 产品,在技术趋势上,ORACLE 数据库始终没有落后。这意味着运行在桌面 PC 机(客户机)上的商务应用程序能够通过网 络访问数据库服务器。1986 年发布的 5.1 版还支持分布式查询,允许通过一次性查询访问 存储在多个位置的数据。 那是在 1985 年,当时曾经的最大的独立软件公司 Cullinet(主要销售网状数据库)已经 如流星般陨落。ORACLE 的主要竞争对手是 Ingres 数据库。Ingres 在加州大学伯克利分校诞 生,主要的设计者是当时鼎鼎大名的 Michael Stonebraker 教授。 可以说 Ingres 数据库软 件是上个世纪 80 年代技术上最好的数据库,Ingres 市场分额的快速增长已经给 ORACLE 早 成了很大的压力。巧的是,这个时候,IBM 公司再一次伸出“上帝之手”。 Ingres 使用的是 Stonebraker 发明的 QUEL(Query Language))的查询技术,这和 IBM 的 SQL 大不相同。在某些地方 QUEL 甚至要优于 SQL。IBM 当时担心 Ingres 把 QUEL 变成标准 会对自己不利。经过一番衡量,决定把自己的 SQL 提交给数据库标准委员会。 Stonebraker 而 教授可不打算把 QUEL 提交给数据库标准委员会,学院派的他认为这麽做实际上是扼杀了创 新精神。鹬蚌相争,渔翁得利。ORACLE 看到并抓住了这个绝佳的机会,大肆宣布 ORACLE 全 面与 SQL 兼容,加上 ORACLE 当时对 Ingres PC 上的版本的攻击(弱化对手优势,化解自己 弱势是他们最拿手的本领),再加上 ORACLE 公司销售上的强势,Ingres 不断丢城失地,等 到后来推出支持 SQL 的数据库的时候为时已晚。紧跟 IBM 让 ORACLE 得以成长、壮大,拥抱 标准,拥抱开放,拥抱变化,让 ORACLE 立于不败之地。 1986 年 3 月 12 日,ORACLE 公司以每股 15 美元公开上市,当日以 20.75 美元收盘,公 司市值 2.7 亿美元。3 月 13 日,微软以每股 21 美元的发行价上市,以 28 美元收市,公司 市值达到 7 亿美元。远远超过了 ORACLE。成功的光环下的微软和盖茨遮盖住了 ORACLE 和 Ellison 的光芒,可能这也是 Ellison 敌视微软的开始。 第 11 页 共 131 页
  12. 12. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 图三 桀骜不驯的 Larry Ellison 经受挫折 ORACLE 第 6 版于 1988 年发布。由于过去的版本在性能上屡受诟病,Miner 带领着工程 师对数据库核心进行了重新的改写。引入了行级锁(row-level locking)这个重要的特性, 也就是说,执行写入的事务处理只锁定受影响的行,而不是整个表。这个版本引入了还算不 上完善的 PL/SQL(Procedural Language extension to SQL)语言。第 6 版还引入了联机 热备份功能,使数据库能够在使用过程中创建联机的备份,这极大地增强了可用性。同时在 这一年,ORACLE 开始研发 ERP 软件。 公司发展看上去比较顺利,不过,噩梦才刚刚开始。 由于过去对软件测试重视的程度不够――那个时候公司规模小,基本上都是客户帮助免 费测试的。在第六版刚发布之后,很多迫不及待开始使用的用户就怨声载道。这是个根本就 没有测试好就进行发布的产品(也怪 Ellison,大话总要说在前头,只好自尝苦果)。用户 开始对 ORACLE 大肆抨击,ORACLE 的一些对手,也开始落井下石,针对 ORACLE 产品的一些 弱点进行攻击。开发人员一面应付愤怒的用户,一面加班加点地对程序进行接连不断的修正, 最后,总算得到了一个比较稳定的版本,暂时平息了用户的愤怒。 但是,实际的问题并不在这里,几年来高速增长的同时也给公司带来了巨大的隐患,1990 财年第三季度报表的公布引爆了一切。财务人员发现了 1500 万美元的坏帐,并且公司利润 第 12 页 共 131 页
  13. 13. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 距离预期相差甚远。接下来的时间里,大公司病的诸般症状接踵而来,面对股东的指控,股 票一落千丈,公司前景暗淡,甚至面临破产。一度靠贷款来维持自己的奢华生活也不变卖股 票的 Ellison 也快撑不住了。公司下大力气整顿财务(财务主管杰夫·沃克从某种程度上解 救了公司)。公司宣布削减开支,裁退大量销售人员,同时聘用了专门的管理人才。 噩梦延续到 ORACLE 第七版的推出而结束。这个公司已经空谈了好几年的新版本(一度 被讥讽为不过是 Ellison 的故计重施而已) 直到 1992 年 6 月才终于闪亮登场, , 这一次公司 吸取了第六版匆忙上市的教训,听取了用户的多方面的建议,并集中力量对新版本进行了大 量而细致的测试。该版本增加了许多新的性能特性:分布式事务处理功能、增强的管理功能、 用于应用程序开发的新工具以及安全性方法。ORACLE7 还包含了一些新功能,如存储过程、 触发过程和说明性引用完整性等,并使得数据库真正的具有可编程能力。 ORACLE 第七版是 ORACLE 真正出色的产品,取得了巨大的成功。这个版本的出现真是好 时机,当时 Sybase 公司的数据库已经占据了不少份额,ORACLE 借助这一版本的成功,一具 击退了咄咄逼人的 Sybase。公司的销售人员这次算到了给用户兑现空头许诺的时候。公司 经过两三年的治理,终于摆脱了种种麻烦,重新开始健康发展,销售额也从 92 年的 15 亿美 元变为四年后的 42 亿美元。 跨上巅峰 “搅浑水”是 Ellison 的一项绝技。在 1995 年巴黎举行的欧洲信息技术论坛会议上, Ellison 在即兴演讲中介绍了网络计算机(Network Computer,NC)的概念,所谓 NC 指的是 配置简单却能充分利用网络资源的低价电脑,最为重要的是,它不需要操作系统,或者更准 确的说,不需要微软的操作系统。Ellison 希望借此来抵制微软的强势。很快,ORACLE 联合 IBM、Sun、Apple 和 Netscape 在 1996 年制定了网络计算机的标准,但事实上人们从头到尾 没有看到一台真正的 NC 生产出来。这次的演讲在业界引起了轩然大波,通过这个事件, ORACLE 公司吸引了足够多的注意力,同时也让人们看到 ORACLE 公司对于网络的巨大信心。 1997 年 6 月,ORACLE 第八版发布。ORACLE8 支持面向对象的开发及新的多媒体应用,这 个版本也为支持 Internet、网络计算等奠定了基础。同时这一版本开始具有同时处理大量 用户和海量数据的特性。这个版本也算是可圈可点了。 1998 年 9 月,ORACLE 公司正式发布 ORACLE 8i。“i”代表 Internet,这一版本中添加 了大量为支持 Internet 而设计的特性。这一版本为数据库用户提供了全方位的 Java 支持。 ORACLE 8i 成为第一个完全整合了本地 Java 运行时环境的数据库, Java 就可以编写 ORACLE 用 的存储过程。对,Java,只要是能够打击微软的武器,ORACLE 都要派上用场。ORACLE8i 添 加了 SQLJ(一种开放式标准,用于将 SQL 数据库语句嵌入客户机或服务器 Java 代码)和 ORACLE interMedia(用于管理多媒体内容)以及 XML 等特性。同时,ORACLE 8i 极大程度 上提高了伸缩性、扩展性和可用性以满足网络应用需要。接下来的几年中,ORACLE 陆续发 布了 8i 的几个版本,并逐渐添加了一些面向网络应用的新特性。面对开源运动的蓬勃发展, ORACLE 自然不甘落后,1998 年十月 ORACLE 发布了可用于 Linux 平台的 ORACLE 8 以及 ORACLE Application Server 4.0,随后不久,ORACLE 又发布了 ORACLE 8i for Linux。 .com 在 第 13 页 共 131 页
  14. 14. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 大潮中,ORACLE 是站在风口浪尖的弄潮儿。 在 2001 年 6 月的 ORACLE OpenWorld 大会中,ORACLE 发布了 ORACLE 9i。在 ORACLE 9i 的诸多新特性中,最重要的就是 Real Application Clusters(RAC)了。说起 ORACLE 集群 服务器,早在第五版的时候,ORACLE 就开始开发 ORACLE 并行服务器(ORACLE Parallel Server ,OPS),并在以后的版本中逐渐的完善了其功能,不过,严格来说,尽管 OPS 算得 上是个集群环境,但是并没有体现出集群技术应有的优点。在完全吸收了 Rdb(ORACLE 在 1994 年收购了 Compaq 的 Rdb 数据库,此前 Rdb 属于 DEC 公司,DEC 公司在 VAX 上实现了第 一个可以商用的 Rdb 集群数据库)的一些技术优势之后,ORACLE 终于推出了真正的应用集 群软件。RAC 使得多个集群计算机能够共享对某个单一数据库的访问,以获得更高的可伸缩 性、可用性和经济性。ORACLE 9i 的 RAC 在 TPC-C 的基准测试中打破了数项记录,一时间业 内瞩目。这个新的数据库还包含集成的商务智能(BI)功能。ORACLE 9i 第 2 版还做出了很 多重要的改进,使 ORACLE 数据库成为一个本地的 XML 数据库;此外还包括自动管理、Data Guard 等高可用方面的特性。 历史还在继续 2003 年 9 月 8 日,旧金山举办的 ORACLE World 大会上,Ellison 宣布下一代数据库产 品为“ORACLE 10g”。 ORACLE 应用服务器 10g(ORACLE Application Server 10g)也将作 为甲骨文公司下一代应用基础架构软件集成套件。“g”代表“grid ,网格”。这一版的最大 的特性就是加入了网格计算的功能。何谓网格计算?网格计算可以把分布在世界各地的计算 机连接在一起,并且将各地的计算机资源通过高速的互联网组成充分共享的资源集成。通过 合理调度,不同的计算环境被综合利用并共享。ORACLE 宣称 10g 可以作为网格计算的基础, 矛头直指最大的敌人 IBM 的“随需应变”!看来,ORACLE 公司已经把这一次的“赌注”押 在了网格计算的大市场上。但前景如何?让我们拭目以待。 如果说,IBM 是 IT 产业中的一头巨鲸,那么 ORACLE 一定就是一条大鲨鱼:咄咄逼人, 善于进攻。就在 2003 年 6 月初,ORACLE 突然宣布 51 亿美金收购仁科(PeopleSoft),业内 再次震动。次举又一次露出 ORACLE 一贯善于进攻的本性。要知道,ORACLE 在发展过程中很 少对企业进行收购的,那么收购仁科目的何在?首先,ORACLE 觊觎企业应用软件市场已久, 但苦于不能进一步扩大市场分额,尤为重要的是,一旦成功,可以直接对最大的敌人 IBM 进行打击,还可以阻击 SAP 等巨头的强势,这一点尤为重要。时至今日,ORACLE 依然以不 达目的不罢休的态势和仁科缠斗,结果如何,让我们拭目以待。 “人生最大的快乐是击败敌人” Ellison 一定很喜欢这句活。 , [作者简介] Fenng,现任某美资公司 DBA。 目前关注如何利用 ORACLE 数据库有效的构建企业应用。 对 ORACLE database tuning, trouble shooting 有一点研究。 个人技术站点:http://www.dbanotes.net, 可以通过电子邮件 Fenng@itpub.net 联系到他。 End 第 14 页 共 131 页
  15. 15. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 判断某个字符串是否为数字的方法 By:bzszp 测试数据库版本:8.1.6 测试操作系统:windows2000 server --第一种方法 通过 to_number 转换是否发生异常来判断 SQL> create or replace function f_str_or_num(str varchar2) return varchar2 is 2 v_num number; 3 v_return varchar2(60); 4 begin 5 v_num:=to_number(str); 6 v_return:=str||' is a number string!'; 7 return v_return; 8 exception when others then 9 v_return:=str||' is not a number string!'; 10 return v_return; 11 end f_str_or_num; 12 / Function created. SQL> select f_str_or_num('123.56') from dual; F_STR_OR_NUM('123.56') -------------------------------------------------------------------------------- 123.56 is a number string! SQL> select f_str_or_num('12aa.56') from dual; F_STR_OR_NUM('12AA.56') -------------------------------------------------------------------------------- 12aa.56 is not a number string! SQL> --第二种通过 translate 函数来以及其他相关函数来实现 SQL> select decode(replace(translate('12a3.456','0123456789.',' '),' ',''),null, 2 'is number','is not a number') from dual; DECODE(REPLACE( --------------- is not a number SQL> select decode(replace(translate('123.456','0123456789.',' '),' ',''),null, 2 'is number','is not a number') from dual; DECODE(RE 第 15 页 共 131 页
  16. 16. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 --------- is number SQL> [作者简介] 宋志平,常用网名 bzszp,现任 CSDN ORACLE 版大版主。 目前就职于山东青岛某软件公司,一直从事 ORACLE 开发以及相关工作。 在 oracle sql 语句以及 pl/sql 开发方面经验丰富,对 oracl 优化方面有所了解。 联系方式:bzszp@163.com End 第 16 页 共 131 页
  17. 17. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 使用 sql 语句直接生成带有’小计’,’合计’的数 据集 By:bzszp 测试数据库版本:8.1.6 测试造作系统:windows2000 server 测试用户:scott 测试用表:dept,emp 在软件开发过程中经常要做一些报表,而且大部分报表都需要用到根据某一列进行统 计,计算出’小计’以及’合计’项目。一般来说大家都是在前台程序中进行处理,其实, 用 sql 语句就可以很轻松的完成这个功能。 下面的语句检索出需要进行统计的数据集(包含部门名称 dname、职位 job、工资 sal): SQL> select dept.dname,emp.job,sal from emp,dept 2 where emp.deptno=dept.deptno; DNAME JOB SAL -------------- --------- ---------- RESEARCH CLERK 800 SALES SALESMAN 1600 SALES SALESMAN 1250 RESEARCH MANAGER 2975 SALES SALESMAN 1250 SALES MANAGER 2850 ACCOUNTING MANAGER 2450 ACCOUNTING PRESIDENT 5000 SALES SALESMAN 1500 SALES CLERK 950 RESEARCH ANALYST 3000 ACCOUNTING CLERK 1300 已选择 12 行。 下面,我们就根据部门名称以及职位进行汇总,并为每个部门生成’小计’,最后生成’ 合计’。 第 17 页 共 131 页
  18. 18. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 SQL> select decode(grouping(dept.dname),1,'合计:',dept.dname) dname, 2 decode(grouping(emp.job)+grouping(dept.dname),1,'小计:',emp.job) job,sum(sal) sum_sal from emp,dept 3 where emp.deptno=dept.deptno group by rollup(dept.dname,emp.job); DNAME JOB SUM_SAL -------------- --------- ---------- ACCOUNTING CLERK 1300 ACCOUNTING MANAGER 2450 ACCOUNTING PRESIDENT 5000 ACCOUNTING 小计: 8750 RESEARCH ANALYST 3000 RESEARCH CLERK 800 RESEARCH MANAGER 2975 RESEARCH 小计: 6775 SALES CLERK 950 SALES MANAGER 2850 SALES SALESMAN 5600 SALES 小计: 9400 合计: 24925 已选择 13 行。 SQL> [作者简介] 宋志平,常用网名 bzszp,现任 CSDN ORACLE 版大版主。 目前就职于山东青岛某软件公司,一直从事 ORACLE 开发以及相关工作。 在 oracle sql 语句以及 pl/sql 开发方面经验丰富,对 oracl 优化方面有所了解。 联系方式:bzszp@163.com End 第 18 页 共 131 页
  19. 19. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 Oracle 中的进制转换 By Eygle 进制转换是开发中经常需要用到的,本文简单介绍几种常用的进制转化方法. 一 16 进制转换为 10 进制 可以通过 to_number 函数实现 SQL> select to_number('19f','xxx') from dual; TO_NUMBER('19F','XXX') ---------------------- 415 SQL> select to_number('f','xx') from dual; TO_NUMBER('F','XX') ------------------- 15 二 10 进制转换为 16 进制 可以通过 to_char 函数转换 SQL> select to_char(123,'xxx') from dual; TO_C ---- 7b SQL> select to_char(4567,'xxxx') from dual; TO_CH ----- 11d7 第 19 页 共 131 页
  20. 20. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 三 2 进制转换为 10 进制 从 Oracle9i 开始,提供函数 bin_to_num 进行 2 进制到 10 进制的转换 SQL> select bin_to_num(1,1,0,1) a,bin_to_num(1,0) b from dual; AB ----- ---------- 13 2 SQL> select bin_to_num(1,1,1,0,1) from dual; BIN_TO_NUM(1,1,1,0,1) --------------------- 29 四 通过自定义函数实现进制转换 以下函数来自 AskTom 网站,是 Tom 给出的例子,供参考: create or replace function to_base( p_dec in number, p_base in number ) return varchar2 is l_str varchar2(255) default NULL; l_num number default p_dec; l_hex varchar2(16) default '0123456789ABCDEF'; begin if ( trunc(p_dec) <> p_dec OR p_dec < 0 ) then raise PROGRAM_ERROR; end if; loop l_str := substr( l_hex, mod(l_num,p_base)+1, 1 ) || l_str; l_num := trunc( l_num/p_base ); exit when ( l_num = 0 ); end loop; return l_str; end to_base; / create or replace function to_dec 第 20 页 共 131 页
  21. 21. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 ( p_str in varchar2, p_from_base in number default 16 ) return number is l_num number default 0; l_hex varchar2(16) default '0123456789ABCDEF'; begin for i in 1 .. length(p_str) loop l_num := l_num * p_from_base + instr(l_hex,upper(substr(p_str,i,1)))-1; end loop; return l_num; end to_dec; / show errors create or replace function to_hex( p_dec in number ) return varchar2 is begin return to_base( p_dec, 16 ); end to_hex; / create or replace function to_bin( p_dec in number ) return varchar2 is begin return to_base( p_dec, 2 ); end to_bin; / create or replace function to_oct( p_dec in number ) return varchar2 is begin return to_base( p_dec, 8 ); end to_oct; / [作者简介] 盖国强,网名 eygle 曾任 ITPUB MS 版版主,现任 itpub Oracle 管理版版主. 曾任职于某国家大型企业,服务于烟草行业,开发过基于 Oracle 数据库的大型 ERP 系统,属国家信息产业 部重点工程.同时负责 Oracle 数据库管理及优化,并为多家烟草企业提供 Oracle 数据库管理、优化及技术支 持. 目前任职于北京某电信增值业务系统提供商企业,首席 DBA,负责数据库业务.管理全国 30 多个数据库 系统。项目经验丰富,曾设计规划及支持中国联通增值业务等大型数据库系统. 实践经验丰富,长于数据库诊断、性能调整与 SQL 优化等. 第 21 页 共 131 页
  22. 22. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 高级培训讲师,培训经验丰富,曾主讲 itpub dba 培训及 itpub 高级性能调整等主要课程. 《Oracle 数据库 DBA 专题技术精粹》一书的主编及主要作者. 你可以在http://www.eygle.com上找到关于作者的更多信息. End 第 22 页 共 131 页
  23. 23. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 C#+Oracle 开发中执行存储过程问题 By dinya [关键字] C#, Oracle, C/S [内容摘要] 当前开发过程中,微软的.NET 以其易用和对网络的支持性好等而倍受开发人员的青睐, 不少项目使用 Oralce 数据库作为后台数据库,但是在开发过程中需要通过前台程序调用数 据库中的一些对象,本文将以一个实例的形式, C#+Oracle 数据库的开发中 C#执行 Oracle 对 存储过程问题做一简要阐述。 [本文适宜读者范围] .NET+Oracel 开发人员,Oracle 初级 [系统环境] OS:windows 2000 Professional (英文版) Oracle:8.1.7.1.0 .NET:.Net 2003 [正文] 我们在使用 C#+Oracle 数据库开发 C/S 结构的程序时。有相当大一部分的事务会考虑放 在 Oracle 数据库中来处理,以减少网络数据流量、提高程序的性能。这样就要求我们将业 务逻辑化,抽象化,使用 Oracle 的存储过程是一个不错的选择。下面我将使用一个实例来 说明一下 C#使用 Oracle 存储过程来执行业务操作的过程: 需求描述: 在前端界面上输入用户名、密码、用户姓名、用户电话号码及用户类型等基础资料后。 调用 Oracle 数据库中的增加用户信息的存储过程来执行增加新用户信息的功能。要求用户 名、密码及用户类型不能为空,用户名不能有重复,本例中使用 OldDbConnection 来连接 Oracle 数据库。 1、在数据库中建一用户表及用户 ID 的序列: create sequence seq_user_information increment by 1 start with 1 nomaxvalue nocycle 第 23 页 共 131 页
  24. 24. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 cache 10 create table user_information ( user_id number primary key, --用户序号 user_login_name varchar2(30) not null, --登陆名 user_password varchar2(50) not null, --用户密码 user_name varchar2(20), --用户姓名 user_telephone varchar2(20), --用户电话 user_type number(5) , --用户类型 creation_date date not null, --创建日期 last_update_date date not null --最后修改日期 ) 2、在 Oracle 中建执行插入操作的存储过程: create or replace procedure insert_user_information ( p_user_login_name in varchar2, p_user_password in varchar2, p_user_name in varchar2, p_user_telephone in varchar2, p_user_type in number, p_out out number ) as v_count number; begin if p_user_login_name is null or p_user_password is null then p_out:=-1; --用户名和密码不能为空, return ; end if; if p_user_type is null then p_out:=-2; --用户类型不能为空 return ; end if; select count(*) into v_count from user_information a where .user_login_name=upper(p_user_login_name); if v_count>0 then p_out:=-3; --该用户名已经存在 return ; end if; insert into user_information values(seq_user_information.nextval,upper(p_user_login_name), p_user_password,p_user_name,p_user_telephone, 第 24 页 共 131 页
  25. 25. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 p_user_type, sysdate,sysdate); commit; p_out:=0; --操作成功 return ; exception when others then p_out:=-4; --插入过程中出现异常 return ; end ; 3、在.NET 项目建一个到数据库的联结: 在项目中新增加一个类文件。名称:clsPublic, //添加引用: using System; using System.Data; using System.Data.OleDb; //连接字符串 private string connectora="Provider=MSDAORA.1;Password=fran;User ID=fran;Data Source=demo;Persist Security Info=True"; //连接 Oracle 数据库 public OleDbConnection ConnectDB() { try { OleDbConnection conn=new OleDbConnection(); conn.ConnectionString=connectora; conn.Open(); return conn; } catch { return null; } } 4、在类文件中添加如下内容,用来执行 Oracle 中的过程: public int Insert_User_Information(string v_user_login_name,string v_user_password,string v_user_name,string v_user_telephone,int v_user_type,string proc_name) { 第 25 页 共 131 页
  26. 26. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 int i; cmdOra.Parameters.Clear(); cmdOra.CommandText=proc_name; cmdOra.CommandType=CommandType.StoredProcedure; cmdOra.Connection=new clsPublic().ConnectDB(); cmdOra.Parameters.Add("p_user_login_name",OleDbType.VarChar); cmdOra.Parameters.Add("p_user_password",OleDbType.VarChar); cmdOra.Parameters.Add("p_user_name",OleDbType.VarChar); cmdOra.Parameters.Add("p_user_telephone",OleDbType.VarChar); cmdOra.Parameters.Add("p_user_type",OleDbType.Integer); cmdOra.Parameters.Add("p_out",OleDbType.Integer); cmdOra.Parameters["p_user_login_name"].Value=v_user_login_name; cmdOra.Parameters["p_user_password"].Value=v_user_password; cmdOra.Parameters["p_user_name"].Value=v_user_name; cmdOra.Parameters["p_user_telephone"].Value=v_user_telephone; cmdOra.Parameters["p_user_type"].Value=v_user_type; cmdOra.Parameters["p_user_login_name"].Direction=ParameterDirection .Input; cmdOra.Parameters["p_user_password"].Direction=ParameterDirection.I nput; cmdOra.Parameters["p_user_name"].Direction=ParameterDirection.Input ; cmdOra.Parameters["p_user_telephone"].Direction=ParameterDirection.I nput; cmdOra.Parameters["p_user_type"].Direction=ParameterDirection.Input; cmdOra.Parameters["p_out"].Direction=ParameterDirection.ReturnValue; try { cmdOra.ExecuteNonQuery(); i=(int)cmdOra.Parameters["p_out"].Value; } catch { i=-88; } finally { if(cmdOra.Connection.State==ConnectionState.Open) { cmdOra.Connection.Close(); 第 26 页 共 131 页
  27. 27. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 cmdOra.Connection.Dispose(); cmdOra.Parameters.Clear(); cmdOra.Dispose(); } } return i; } 5、在窗体界面中调用执行存储过程 private void button3_Click_1(object sender, System.EventArgs e) { int i=new clsPublic().Insert_User_Information ("dinya","111","DINYA","13877778888",0, "cux_franchiser.insert_user_information"); MessageBox.Show(i.ToString()); } 在本例第二步中,定义一个输出参数用来存储执行的结果,Oracle 存储过程允许给输出 参数直接赋值,在。NET 中设置该参数类型: cmdOra.Parameters["p_out"].Direction=ParameterDirection.ReturnValue; 将其设置为返回值,这样在调用 Insert_User_Information 执行存储过程后,该参数将 执行结果返回给用户。 在 第 五 步 窗 体 界 面 中 调 用 存 储 过 程 的 时 候 , 最 后 一 个 参 数 为 "cux_franchiser.insert_user_information",该值中 cux_franchiser 为自己定义的一个 包,insert_user_information 为包中的过程。(具体对包的使用请参考 Oracle 相关书籍中 有关包的使用一节)。 其中需要指出的是,用来连接 Oracle 数据库的联结串会因为 OleDB 的厂家不同而不同, 本例中使用微软的,您在开发过程也可以使用 Oracle 公司的,可以到 Oralce 网站下载,地 址: http://www.oracle.com/technology/software/tech/windows/ole_db/index.html。 后记: 在.NET + Oracle的开发过程,当然还有很多其他的操作技巧,希望本文能够起到抛砖 引玉的作用,刚接触开发的读者或Oracle初学者,可以参考本文,举一反三。此文您也可以 在作者的Blog中找到:http://blog.csdn.net/dinya2003/ 第 27 页 共 131 页
  28. 28. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 [作者简介] 曾就职于机械相关行业,后做 Windows 程序开发。现就职于一家制造企业,做 Oracle ERP 开发工作, 现任 CSDN 论坛 Oracle 开发版版主。 作者Mail: dinya20@tom.com End 第 28 页 共 131 页
  29. 29. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 Oracle 诊断案例--如何捕获问题 SQL 解决过度 CPU 消 耗问题 By Eygle 本文通过实际业务系统中调整的一个案例,试图给出一个常见 CPU 消耗问题的一个诊断 方法.大多数情况下,系统的性能问题都是由不良 SQL 代码引起的,那么作为 DBA,怎样发 现和解决这些 SQL 问题就显得尤为重要. 本案例平台为 UNIX,所以不可避免的应用了一些 Unix 下常用的工具.如 vmstat,top 等. 本文适宜读者范围:中高级. 系统环境: OS: Solaris8 Oracle: 8.1.7.4 问题描述: 开发人员报告系统运行缓慢,已经影响业务系统正常使用.请求协助诊断. 1.登陆数据库主机 使用 vmstat 检查,发现 CPU 资源已经耗尽,大量任务位于运行队列: bash-2.03$ vmstat 3 procs memory page disk faults cpu rbw swap free re mf pi po fr de sr s6 s9 s1 sd in sy cs us sy id 0 0 0 5504232 1464112 0 0 0 0 0 0 0 0 1 1 0 4294967196 0 0 -84 -5 -145 131 0 0 5368072 1518360 56 691 0 2 2 0 0 0 1 0 0 3011 7918 2795 97 3 0 131 0 0 5377328 1522464 81 719 0 2 2 0 0 0 1 0 0 2766 8019 2577 96 4 0 130 0 0 5382400 1524776 67 682 0 0 0 0 0 0 0 0 0 3570 8534 3316 97 3 0 134 0 0 5373616 1520512 127 1078 0 2 2 0 0 0 1 0 0 3838 9584 3623 96 4 0 136 0 0 5369392 1518496 107 924 0 5 5 0 0 0 0 0 0 2920 8573 2639 97 3 0 132 0 0 5364912 1516224 63 578 0 0 0 0 0 0 0 0 0 3358 7944 3119 97 3 0 129 0 0 5358648 1511712 189 1236 0 0 0 0 0 0 0 0 0 3366 10365 3135 95 5 0 129 0 0 5354528 1511304 120 1194 0 0 0 0 0 0 0 4 0 3235 8864 2911 96 4 0 128 0 0 5346848 1507704 99 823 0 0 0 0 0 0 0 3 0 3189 9048 3074 96 4 0 125 0 0 5341248 1504704 80 843 0 2 2 0 0 0 6 1 0 3563 9514 3314 95 5 0 133 0 0 5332744 1501112 79 798 0 0 0 0 0 0 0 1 0 3218 8805 2902 97 3 0 129 0 0 5325384 1497368 107 643 0 2 2 0 0 0 1 4 0 3184 8297 2879 96 4 0 126 0 0 5363144 1514320 81 753 0 0 0 0 0 0 0 0 0 2533 7409 2164 97 3 0 136 0 0 5355624 1510512 169 566 786 0 0 0 0 0 0 1 0 3002 8600 2810 96 4 0 第 29 页 共 131 页
  30. 30. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 130 1 0 5351448 1502936 267 580 1821 0 0 0 0 0 0 0 0 3126 7812 2900 96 4 0 129 0 0 5347256 1499568 155 913 2 2 2 0 0 0 0 1 0 2225 8076 1941 98 2 0 116 0 0 5338192 1495400 177 1162 0 0 0 0 0 0 0 1 0 1947 7781 1639 97 3 0 2.使用 Top 命令 观察进程 CPU 耗用,发现没有明显过高 CPU 使用的进程 $ top last pid: 28313; load averages: 99.90, 117.54, 125.71 23:28:38 296 processes: 186 sleeping, 99 running, 2 zombie, 9 on cpu CPU states: 0.0% idle, 96.5% user, 3.5% kernel, 0.0% iowait, 0.0% swap Memory: 4096M real, 1404M free, 2185M swap in use, 5114M swap free PID USERNAME THR PRI NICE SIZE RES STATE TIME CPU COMMAND 27082 oracle8i 1 33 0 1328M 1309M run 0:17 1.29% oracle 26719 oracle8i 1 55 0 1327M 1306M sleep 0:29 1.11% oracle 28103 oracle8i 1 35 0 1327M 1304M run 0:06 1.10% oracle 28161 oracle8i 1 25 0 1327M 1305M run 0:04 1.10% oracle 26199 oracle8i 1 45 0 1328M 1309M run 0:42 1.10% oracle 26892 oracle8i 1 33 0 1328M 1310M run 0:24 1.09% oracle 27805 oracle8i 1 45 0 1327M 1306M cpu/1 0:10 1.04% oracle 23800 oracle8i 1 23 0 1327M 1306M run 1:28 1.03% oracle 25197 oracle8i 1 34 0 1328M 1309M run 0:57 1.03% oracle 21593 oracle8i 1 33 0 1327M 1306M run 2:12 1.01% oracle 27616 oracle8i 1 45 0 1329M 1311M run 0:14 1.01% oracle 27821 oracle8i 1 43 0 1327M 1306M run 0:10 1.00% oracle 26517 oracle8i 1 33 0 1328M 1309M run 0:33 0.97% oracle 25785 oracle8i 1 44 0 1328M 1309M run 0:46 0.96% oracle 26241 oracle8i 1 45 0 1327M 1306M run 0:42 0.96% oracle 3.检查进程数量 bash-2.03$ ps -ef|grep ora|wc -l 258 bash-2.03$ ps -ef|grep ora|wc -l 275 bash-2.03$ ps -ef|grep ora|wc -l 274 bash-2.03$ ps -ef|grep ora|wc -l 278 第 30 页 共 131 页
  31. 31. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 bash-2.03$ ps -ef|grep ora|wc -l 277 bash-2.03$ ps -ef|grep ora|wc -l 366 发现系统存在大量 Oracle 进程,大约在 300 左右,大量进程消耗了几乎所有 CPU 资源, 而正常情况下 Oracle 连接数应该在 100 左右. 4.检查数据库 查询 v$session_wait 获取各进程等待事件 SQL> select sid,event,p1,p1text from v$session_wait; SID EVENT P1 P1TEXT ---------- ------------------------------ ---------- ---------------------------------------------------------------- 124 latch free 1.6144E+10 address 1 pmon timer 300 duration 2 rdbms ipc message 300 timeout 3 rdbms ipc message 300 timeout 11 rdbms ipc message 30000 timeout 6 rdbms ipc message 180000 timeout 4 rdbms ipc message 300 timeout 134 rdbms ipc message 6000 timeout 147 rdbms ipc message 6000 timeout 275 rdbms ipc message 17995 timeout 274 rdbms ipc message 6000 timeout SID EVENT P1 P1TEXT ---------- ------------------------------ ---------- ---------------------------------------------------------------- 118 rdbms ipc message 6000 timeout 7 buffer busy waits 17 file# 56 buffer busy waits 17 file# 161 buffer busy waits 17 file# 195 buffer busy waits 17 file# 311 buffer busy waits 17 file# 314 buffer busy waits 17 file# 205 buffer busy waits 17 file# 269 buffer busy waits 17 file# 200 buffer busy waits 17 file# 164 buffer busy waits 17 file# SID EVENT P1 P1TEXT ---------- ------------------------------ ---------- ---------------------------------------------------------------- 第 31 页 共 131 页
  32. 32. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 140 buffer busy waits 17 file# 66 buffer busy waits 17 file# 10 db file sequential read 17 file# 18 db file sequential read 17 file# 54 db file sequential read 17 file# 49 db file sequential read 17 file# 48 db file sequential read 17 file# 46 db file sequential read 17 file# 45 db file sequential read 17 file# 35 db file sequential read 17 file# 30 db file sequential read 17 file# SID EVENT P1 P1TEXT ---------- ------------------------------ ---------- ---------------------------------------------------------------- 29 db file sequential read 17 file# 22 db file sequential read 17 file# 178 db file sequential read 17 file# 175 db file sequential read 17 file# 171 db file sequential read 17 file# 123 db file sequential read 17 file# 121 db file sequential read 17 file# 120 db file sequential read 17 file# 117 db file sequential read 17 file# 114 db file sequential read 17 file# 113 db file sequential read 17 file# SID EVENT P1 P1TEXT ---------- ------------------------------ ---------- ---------------------------------------------------------------- 111 db file sequential read 17 file# 107 db file sequential read 17 file# 80 db file sequential read 17 file# 222 db file sequential read 17 file# 218 db file sequential read 17 file# 216 db file sequential read 17 file# 213 db file sequential read 17 file# 199 db file sequential read 17 file# 198 db file sequential read 17 file# 194 db file sequential read 17 file# 192 db file sequential read 17 file# SID EVENT P1 P1TEXT ---------- ------------------------------ ---------- ---------------------------------------------------------------- 188 db file sequential read 17 file# 249 db file sequential read 17 file# 第 32 页 共 131 页
  33. 33. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 242 db file sequential read 17 file# 239 db file sequential read 17 file# 236 db file sequential read 17 file# 235 db file sequential read 17 file# 234 db file sequential read 17 file# 233 db file sequential read 17 file# 230 db file sequential read 17 file# 227 db file sequential read 17 file# 336 db file sequential read 17 file# SID EVENT P1 P1TEXT ---------- ------------------------------ ---------- ---------------------------------------------------------------- 333 db file sequential read 17 file# 331 db file sequential read 17 file# 329 db file sequential read 17 file# 327 db file sequential read 17 file# 325 db file sequential read 17 file# 324 db file sequential read 17 file# 320 db file sequential read 17 file# 318 db file sequential read 17 file# 317 db file sequential read 17 file# 316 db file sequential read 17 file# 313 db file sequential read 17 file# SID EVENT P1 P1TEXT ---------- ------------------------------ ---------- ---------------------------------------------------------------- 305 db file sequential read 17 file# 303 db file sequential read 17 file# 301 db file sequential read 17 file# 293 db file sequential read 17 file# 290 db file sequential read 17 file# 288 db file sequential read 17 file# 287 db file sequential read 17 file# 273 db file sequential read 17 file# 271 db file sequential read 17 file# 257 db file sequential read 17 file# 256 db file sequential read 17 file# SID EVENT P1 P1TEXT ---------- ------------------------------ ---------- ---------------------------------------------------------------- 254 db file sequential read 17 file# 252 db file sequential read 17 file# 159 db file sequential read 17 file# 153 db file sequential read 17 file# 第 33 页 共 131 页
  34. 34. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 146 db file sequential read 17 file# 142 db file sequential read 17 file# 135 db file sequential read 17 file# 133 db file sequential read 17 file# 132 db file sequential read 17 file# 126 db file sequential read 17 file# 79 db file sequential read 17 file# SID EVENT P1 P1TEXT ---------- ------------------------------ ---------- ---------------------------------------------------------------- 77 db file sequential read 17 file# 72 db file sequential read 17 file# 70 db file sequential read 17 file# 69 db file sequential read 17 file# 67 db file sequential read 17 file# 63 db file sequential read 17 file# 55 db file sequential read 17 file# 102 db file sequential read 17 file# 96 db file sequential read 17 file# 95 db file sequential read 17 file# 91 db file sequential read 17 file# SID EVENT P1 P1TEXT ---------- ------------------------------ ---------- ---------------------------------------------------------------- 81 db file sequential read 17 file# 15 db file sequential read 17 file# 19 db file scattered read 17 file# 50 db file scattered read 17 file# 285 db file scattered read 17 file# 279 db file scattered read 17 file# 255 db file scattered read 17 file# 243 db file scattered read 17 file# 196 db file scattered read 17 file# 187 db file scattered read 17 file# 170 db file scattered read 17 file# SID EVENT P1 P1TEXT ---------- ------------------------------ ---------- ---------------------------------------------------------------- 162 db file scattered read 17 file# 138 db file scattered read 17 file# 110 db file scattered read 17 file# 108 db file scattered read 17 file# 92 db file scattered read 17 file# 330 db file scattered read 17 file# 第 34 页 共 131 页
  35. 35. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 310 db file scattered read 17 file# 302 db file scattered read 17 file# 299 db file scattered read 17 file# 89 db file scattered read 17 file# 5 smon timer 300 sleep time SID EVENT P1 P1TEXT ---------- ------------------------------ ---------- ---------------------------------------------------------------- 20 SQL*Net message to client 1952673792 driver id 103 SQL*Net message to client 1650815232 driver id .... 148 SQL*Net more data from client 1952673792 driver id 291 SQL*Net more data from client 1952673792 driver id 244 rows selected. 发现存在大量 db file scattered read 及 db file sequential read 等待.显然全表扫描 等操作成为系统最严重的性能影响因素. 关于常见的等待事件,你可以在以下网址找到更为详细的说明. http://www.eygle.com/statspack/statspack12.htm 5.捕获相关 SQL 这里用到了我的以下脚本 getsqlbysid: SELECT sql_text FROM v$sqltext a WHERE a.hash_value = (SELECT sql_hash_value FROM v$session b WHERE b.SID = '&sid') ORDER BY piece ASC / 该脚本根据用户 sid,结合 v$session 和 v$sqltext 视图,获得用户 sql 语句的完整文 本. 使用该脚本,通过从 v$session_wait 中获得的等待全表或索引扫描的进程 SID,捕获 问题 sql: SQL> @getsql Enter value for sid: 18 old 5: where b.sid='&sid' new 5: where b.sid='18' 第 35 页 共 131 页
  36. 36. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 SQL_TEXT ---------------------------------------------------------------- select i.vc2title,i.numinfoguid from hs_info i where i.intenab ledflag = 1 and i.intpublishstate = 1 and i.datpublishdate <= sysdate and i.numcatalogguid = 2047 order by i.datpublishdate d esc, i.numorder desc SQL> / Enter value for sid: 54 old 5: where b.sid='&sid' new 5: where b.sid='54' SQL_TEXT ---------------------------------------------------------------- select i.vc2title,i.numinfoguid from hs_info i where i.intenab ledflag = 1 and i.intpublishstate = 1 and i.datpublishdate <= sysdate and i.numcatalogguid = 33 order by i.datpublishdate des c, i.numorder desc SQL> / Enter value for sid: 49 old 5: where b.sid='&sid' new 5: where b.sid='49' SQL_TEXT ---------------------------------------------------------------- select i.vc2title,i.numinfoguid from hs_info i where i.intenab ledflag = 1 and i.intpublishstate = 1 and i.datpublishdate <= sysdate and i.numcatalogguid = 26 order by i.datpublishdate des c, i.numorder desc 对几个进程进行跟踪,分别得到以上 SQL 语句,这些 SQL 可能就是问题产生的根源. 以上语句如果良好编码应该使用绑定变量.但是现在这个不是我们关心的. 使用该应用用户连接,检查以上 SQL 的执行计划: SQL> set autotrace trace explain SQL> select i.vc2title,i.numinfoguid 2 from hs_info i where i.intenabledflag = 1 3 and i.intpublishstate = 1 and i.datpublishdate <=sysdate 4 and i.numcatalogguid = 3475 5 order by i.datpublishdate desc, i.numorder desc ; Execution Plan 第 36 页 共 131 页
  37. 37. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=228 Card=1 Bytes=106) 1 0 SORT (ORDER BY) (Cost=228 Card=1 Bytes=106) 2 1 TABLE ACCESS (FULL) OF 'HS_INFO' (Cost=218 Card=1 Bytes=106) SQL> select count(*) from hs_info; COUNT(*) ---------- 227404 以上查询使用了全表扫描,该表这里有 22 万记录,全表扫描已经不再适合. 检查该表,存在以下索引: SQL> select index_name,index_type from user_indexes where table_name='HS_INFO'; INDEX_NAME INDEX_TYPE ------------------------------ --------------------------- HSIDX_INFO1 FUNCTION-BASED NORMAL HSIDX_INFO_SEARCHKEY DOMAIN PK_HS_INFO NORMAL 检查索引键值: SQL> select index_name,column_name 2 from user_ind_columns where table_name ='HS_INFO'; INDEX_NAME COLUMN_NAME ------------------------------ -------------------- HSIDX_INFO1 NUMORDER HSIDX_INFO1 SYS_NC00024$ HSIDX_INFO_SEARCHKEY VC2INDEXWORDS PK_HS_INFO NUMINFOGUID SQL> desc hs_info Name Null? Type --------------------------------- -------- -------------------------------------------- NUMINFOGUID NOT NULL NUMBER(15) NUMCATALOGGUID NOT NULL NUMBER(15) INTTEXTTYPE NOT NULL NUMBER(38) VC2TITLE NOT NULL VARCHAR2(60) VC2AUTHOR VARCHAR2(100) 第 37 页 共 131 页
  38. 38. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 NUMPREVINFOGUID NUMBER(15) NUMNEXTINFOGUID NUMBER(15) NUMORDER NOT NULL NUMBER(15) DATPUBLISHDATE NOT NULL DATE INTPUBLISHSTATE NOT NULL NUMBER(38) VC2PUBLISHERID VARCHAR2(30) VC2INDEXWORDS VARCHAR2(200) VC2WAPPREVPATH VARCHAR2(200) VC2WEBPREVPATH VARCHAR2(200) VC2WAP2PREVPATH VARCHAR2(200) NUMVISITED NOT NULL NUMBER(15) INTENABLEDFLAG NOT NULL NUMBER(38) DATCREATETIME NOT NULL DATE DATMODIFYTIME NOT NULL DATE VC2NOTES VARCHAR2(1000) INTINFOTYPE NOT NULL NUMBER(38) VC2PRIZEFLAG VARCHAR2(1) VC2DESC VARCHAR2(1000) 6.决定创建新的索引以消除全表扫描 检查发现在 numcatalogguid 字段上并没有索引,该字段具有很好的区分度,考虑在该 字段创建索引以消除全表扫描. SQL> create index hs_info_NUMCATALOGGUID on hs_info(NUMCATALOGGUID); Index created. SQL> set autotrace trace explain SQL> select i.vc2title,i.numinfoguid 2 from hs_info i where i.intenabledflag = 1 3 and i.intpublishstate = 1 and i.datpublishdate <=sysdate 4 and i.numcatalogguid = 3475 5 order by i.datpublishdate desc, i.numorder desc ; Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=12 Card=1 Bytes=106) 1 0 SORT (ORDER BY) (Cost=12 Card=1 Bytes=106) 2 1 TABLE ACCESS (BY INDEX ROWID) OF 'HS_INFO' (Cost=2 Card=1 Bytes=106) 3 2 INDEX (RANGE SCAN) OF 'HS_INFO_NUMCATALOGGUID' (NON-UNIQUE) (Cost=1 Card=1) 第 38 页 共 131 页
  39. 39. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 7.观察系统状况 原大量等待消失 SQL> select sid,event,p1,p1text from v$session_wait where event not like 'SQL%'; SID EVENT P1 P1TEXT ---------- ------------------------------ ---------- ---------------------------------------------------------------- 1 pmon timer 300 duration 2 rdbms ipc message 300 timeout 3 rdbms ipc message 300 timeout 6 rdbms ipc message 180000 timeout 59 rdbms ipc message 6000 timeout 118 rdbms ipc message 6000 timeout 275 rdbms ipc message 30000 timeout 147 rdbms ipc message 6000 timeout 62 rdbms ipc message 6000 timeout 11 rdbms ipc message 30000 timeout 4 rdbms ipc message 300 timeout SID EVENT P1 P1TEXT ---------- ------------------------------ ---------- ---------------------------------------------------------------- 305 db file sequential read 17 file# 356 db file sequential read 17 file# 19 db file scattered read 17 file# 5 smon timer 300 sleep time 15 rows selected. 持续观察的 CPU 使用情况 bash-2.03$ vmstat 3 procs memory page disk faults cpu rbw swap free re mf pi po fr de sr s6 s9 s1 sd in sy cs us sy id 20 0 0 5421792 1503488 38 434 136 0 0 0 0 0 0 2 0 2931 7795 2622 91 9 0 23 1 0 5416080 1500632 95 734 56 0 0 0 0 0 0 0 0 2949 8057 2598 89 11 0 26 0 0 5412016 1498480 210 1170 21 5 5 0 0 0 2 1 0 3301 9647 3116 90 10 0 25 0 0 5394912 1490160 242 1606 56 0 0 0 0 0 0 1 0 3133 9318 2850 89 11 0 40 0 0 5390200 1488112 162 1393 66 0 0 0 0 0 0 0 0 2848 9080 2502 90 10 0 40 0 0 5377120 1481792 136 1180 120 2 2 0 0 0 1 1 0 2846 9099 2593 92 8 0 36 0 0 5363216 1475168 134 1169 53 0 0 0 0 0 3 2 0 2871 7989 2621 88 12 0 39 0 0 5348936 1469160 157 1448 210 0 0 0 0 0 0 0 0 3660 10062 3480 88 12 0 35 0 0 5344552 1466472 7 15 56 0 0 0 0 0 0 0 0 2885 7663 2635 92 8 0 第 39 页 共 131 页
  40. 40. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 34 0 0 5343016 1465416 44 386 77 0 0 0 0 0 0 0 0 3197 8486 2902 92 8 0 31 0 0 5331568 1459696 178 1491 122 0 0 0 0 0 0 3 0 3237 9461 3005 89 11 0 31 0 0 5317792 1453008 76 719 80 0 0 0 0 0 0 0 0 3292 8736 3025 93 7 0 31 2 0 5311144 1449552 235 1263 69 2 2 0 0 0 1 0 0 3473 9535 3357 88 12 0 25 0 0 5300240 1443920 108 757 18 2 2 0 0 0 1 1 0 2377 7876 2274 95 5 0 19 0 0 5295904 1441840 50 377 0 0 0 0 0 0 0 1 0 1915 6598 1599 98 1 0 ----以上为创建索引之前部分 ----以下为创建索引之后部分,CPU 使用率恢复正常 procs memory page disk faults cpu rbw swap free re mf pi po fr de sr s6 s9 s1 sd in sy cs us sy id 40 1 0 5290040 1439208 315 3894 8 2 2 0 0 0 1 6 0 3631 13414 5206 61 9 30 0 1 0 5237192 1414744 731 6749 45 0 0 0 0 0 2 7 0 3264 13558 4941 52 14 34 0 0 0 5163632 1380608 747 6585 10 0 0 0 0 0 0 1 0 2617 12291 3901 46 12 41 1 0 0 5090224 1348152 712 6079 29 0 0 0 0 0 0 6 0 2825 12416 4178 50 12 39 1 0 0 5023672 1317296 714 6183 24 0 0 0 0 0 0 5 0 3166 12424 4745 47 13 40 0 0 0 4955872 1287136 737 6258 16 0 0 0 0 0 0 3 0 2890 11777 4432 44 12 44 1 0 0 4887888 1256464 809 6234 8 2 2 0 0 0 0 2 0 2809 12066 4247 45 12 43 0 0 0 4828912 1228200 312 2364 13 5 5 0 0 0 2 1 0 2410 6816 3492 38 6 57 0 0 0 4856816 1240168 8 138 0 0 0 0 0 0 1 0 0 2314 4026 3232 34 4 62 0 0 0 4874176 1247712 0 86 0 0 0 0 0 0 0 0 0 2298 3930 3324 35 2 63 2 0 0 4926088 1270824 34 560 0 0 0 0 0 0 0 0 0 2192 4694 2612 29 16 55 0 0 0 5427320 1512952 53 694 0 0 0 0 0 0 3 2 0 2443 5085 3340 33 12 55 0 0 0 5509120 1553136 0 37 0 0 0 0 0 0 0 0 0 2309 3908 3321 35 1 64 0 0 0 5562048 1577000 16 234 0 0 0 0 0 0 0 0 0 2507 5187 3433 35 8 57 0 0 0 5665672 1623848 252 1896 8 2 2 0 0 0 1 0 0 2091 6548 2939 34 5 61 0 0 0 5654752 1618208 5 173 16 0 0 0 0 0 0 0 0 2226 4218 3051 35 4 60 0 0 0 5727024 1651120 28 254 0 0 0 0 0 0 0 0 0 2126 4224 2982 38 2 60 0 0 0 5723184 1648880 93 562 8 2 2 0 0 0 1 1 0 2371 5140 3432 38 3 59 0 0 0 5730744 1652512 7 177 26 2 2 0 0 0 1 0 0 2465 4442 3575 36 3 61 至此,此问题得以解决. 8.性能何以提高? 回答这个问题似乎是多余的,我只想重申一点: 有效的降低 SQL 的逻辑读是 SQL 优化的基本原则之一. 我们来比较一下前后两种执行方式的读取及性能差异. 全表扫描的性能 SQL> select i.vc2title,i.numinfoguid 2 from hs_info i where i.intenabledflag = 1 第 40 页 共 131 页
  41. 41. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 3 and i.intpublishstate = 1 and i.datpublishdate <=sysdate 4 and i.numcatalogguid = 3475 5 order by i.datpublishdate desc, i.numorder desc ; 352 rows selected. Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=541 Card=1 Bytes=106) 1 0 SORT (ORDER BY) (Cost=541 Card=1 Bytes=106) 2 1 TABLE ACCESS (FULL) OF 'HS_INFO' (Cost=531 Card=1 Bytes=106) Statistics ---------------------------------------------------------- 0 recursive calls 25 db block gets 3499 consistent gets 258 physical reads 0 redo size 14279 bytes sent via SQL*Net to client 2222 bytes received via SQL*Net from client 25 SQL*Net roundtrips to/from client 2 sorts (memory) 0 sorts (disk) 352 rows processed 使用索引的性能 SQL> select i.vc2title,i.numinfoguid 2 from hs_info i where i.intenabledflag = 1 3 and i.intpublishstate = 1 and i.datpublishdate <=sysdate 4 and i.numcatalogguid = 3475 5 order by i.datpublishdate desc, i.numorder desc; 352 rows selected. Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=12 Card=1 Bytes=106) 1 0 SORT (ORDER BY) (Cost=12 Card=1 Bytes=106) 2 1 TABLE ACCESS (BY INDEX ROWID) OF 'HS_INFO' (Cost=2 Card=1 Bytes=106) 3 2 INDEX (RANGE SCAN) OF 'HS_INFO_NUMCATALOGGUID' (NON-UNIQUE) (Cost=1 Card=1) 第 41 页 共 131 页
  42. 42. http:/emag.csdn.net CSDN 电子杂志 ------------------------- 创刊号总第一期 Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 89 consistent gets 0 physical reads 0 redo size 14279 bytes sent via SQL*Net to client 2222 bytes received via SQL*Net from client 25 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 352 rows processed consistent gets 从 3499 到 89,我们看到性能得到了巨大的提高. 结语: 通常,开发人员很少注意 SQL 代码的效率,他们更着眼于功能的实现. 至于性能问题通常被认为是次要的,而且在应用系统开发初期,由于数据库数据量较少, 对于查询 SQL 语句等,不容易体会出各种 SQL 句法的性能差异. 但是一旦这些应用作为生产系统上线运行,随着数据库中数据量的增加,大量并发访问, 系统的响应速度可能就会成为系统需要解决的最主要的问题之一. 在少量用户下性能可以接受的 SQL,可能在大量用户并发的条件下就会成为性能瓶颈. 在我这个案例中,开发人员很难相信仅只一条 SQL 语句就导致了整个数据库的性能下 降. 然而事实就是如此,一条低效的 SQL 语句就可能毁掉你的数据库,所以在系统设计及开 发过程中,你必须考虑到诸多细节,严格的测试也是提早发现问题的有效方法. 如果不幸以上环节都被忽略,那么,DBA(也许就是你)就是最后的一环,你必须能够快速 的诊断并解决各种复杂问题. 那么,朋友们,祝你好运! [作者简介] 盖国强,网名 eygle 曾任 ITPUB MS 版版主,现任 itpub Oracle 管理版版主. 曾任职于某国家大型企业,服务于烟草行业,开发过基于 Oracle 数据库的大型 ERP 系统,属国家信息产业 部重点工程.同时负责 Oracle 数据库管理及优化,并为多家烟草企业提供 Oracle 数据库管理、优化及技术支 第 42 页 共 131 页

×