﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-ASONG-文章分类-database</title><link>http://www2.blogjava.net/ASONG/category/12538.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 19:27:14 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 19:27:14 GMT</pubDate><ttl>60</ttl><item><title>oracle数据库的还原和备份</title><link>http://www.blogjava.net/ASONG/articles/92408.html</link><dc:creator>汪松明</dc:creator><author>汪松明</author><pubDate>Mon, 08 Jan 2007 08:27:00 GMT</pubDate><guid>http://www.blogjava.net/ASONG/articles/92408.html</guid><wfw:comment>http://www.blogjava.net/ASONG/comments/92408.html</wfw:comment><comments>http://www.blogjava.net/ASONG/articles/92408.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ASONG/comments/commentRss/92408.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ASONG/services/trackbacks/92408.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 理解什么是数据库恢复										   								当我们使用一个数据库时，总希望数据库的内容是可靠的、正确的，但由于计算机系统的故障（硬件故障、软件故障、网络故障、进程故障和系统故障）影响数据库系统的操作，影响数据库中数据的正确性，甚至破坏数据库，使数据库中全部或部分数据丢失。因此当发生上述故障后，希望能重构这个完整的数据库，该处理称为数据库恢复。恢复过程大致可...&nbsp;&nbsp;<a href='http://www.blogjava.net/ASONG/articles/92408.html'>阅读全文</a><img src ="http://www.blogjava.net/ASONG/aggbug/92408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ASONG/" target="_blank">汪松明</a> 2007-01-08 16:27 <a href="http://www.blogjava.net/ASONG/articles/92408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle性能调整的误区</title><link>http://www.blogjava.net/ASONG/articles/92406.html</link><dc:creator>汪松明</dc:creator><author>汪松明</author><pubDate>Mon, 08 Jan 2007 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/ASONG/articles/92406.html</guid><wfw:comment>http://www.blogjava.net/ASONG/comments/92406.html</wfw:comment><comments>http://www.blogjava.net/ASONG/articles/92406.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ASONG/comments/commentRss/92406.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ASONG/services/trackbacks/92406.html</trackback:ping><description><![CDATA[为了提高性能,我们针对Oracle数据库本身提供了的方法或方案进行过不少的尝试，主要包括:
<p>    <strong>共享服务器模式(MTS)<br />    集群技术(Clustering)RAC <br />    分区<br />    并行处理(主要是并行查询)</strong></p><p>    Oracle提供的这些特性确实是用来进行性能改善的,但我们往往忽略了对自身应用特性的分析,它们是否适合于我们.最近,通过对这方面知识的深入了解,发现我们以前存在一些错误的认识.我觉得有必要,大家一起来改变这种误解.</p><p>    分析之前,先明确一下我们的应用特性.数据库应用大体可以分为OLAP和OLTP两大类,即:联机事务分析(数据仓库)和联机事务处理(事务应用)我们的应用系统,其应用特性主要是联机事务处理,又包含了少量的数据仓库特性.</p><p>    <strong>1.共享服务器(MTS)</strong></p><p>    Oracle缺省用的是专用服务器模式,也就是说一个用户连接进程对应一个服务器的进程.记得某大医院刚启用的时候,我们曾经试过MTS.因为听说MTS在不增加内存和CPU的情况下连接更多的客户端,结果并不是我们预期的那样.MTS有问题吗?不是,是因为我们对MTS不了解,并不是它有问题,而是它不是用来在这种情况下做这件事的.</p><p>    一般情况,只有当并发连接数超过了操作系统的支持时,才建议使用MTS,否则应该使用缺省的专用服务器模式.也就是说,在专用服务器模式下,因为多一个连接就要多消耗一个操作系统的进程,只有当并发应用需求超过操作系统的允许连接数时,才有必要考虑MTS.<br />    如果现有系统,物理上支持100个连接的专用服务器数据库,改为使用共享服务器模式,也许支持1000个连接,但同时活动的连接可能只有100个.一般2到4个CPU的服务器,应对200到400个并发连接是足够的,如果连接增加了,可以增加CPU和内存.</p><p>    MTS具有以下一些缺点:</p><p>    1.共享服务器的代码路径比专用服务器长,所以它天生就比专用服务器慢.<br />    2.存在人为死锁的可能,因为它是串行的,所有共享服务器绑定在一起(一个进程),只要一个连接阻塞,则所有用户阻塞,并且极可能死锁.<br />    3.存在独占事务的可能,因为如果一个会话的事务运行时间过长,它独占共享资源,其它用户只能等待.(而专用服务器,每个客户端是一个会话)<br />    4.共享服务器模式限制了某些数据库特性,例如:不能单独启动和关闭实例,不能进行介质恢复,不能使用Log Miner,不能使用,并且SQL_TRACE没有意义(因为是共享而不是当前会话的).</p><p>    MTS减少的内存实际上是专用服务器模式下每个用户连接到操作系统进程所需的内存,但它却使用SGA的Large_Pool来分配UGA,拆东墙补西墙,所减少的内存是很少的.如果用户会话的连接和断开很频繁,数据库进程的创建和删除的开销会非常大,这种情况最好采用共享服务器模式(否则,应该使用连接池技术).所幸的是,我们产品的设计可能就考虑了这个因素,使用的是一次连接终身使用(会话生命周期内),避免了这种情况.</p><p>    所以,综上所述,针对我们产品,建议采用缺省的专用服务器模式,连接不够时,通过增加硬件解决,而不是改用MTS.另外,实际上,Oracle可以同时支持共享服务器和专用服务器模式,可以指定一个会话使用专用服务器,另一个会话使用共享服务器.</p><p>    <strong>2.集群技术(RAC)</strong></p><p>    Oracle RAC(Real Application Clusters),我们说的双机容错就是RAC的一种. 集群技术的优势在在于横向扩展性能,并提供高可用性.32位的操作系统有4G内存的限制,有些Unix系统(以及非高级版本的Windows)有CPU个数的限制.而集群技术通过集合多台机器协同工作,横向打破了这种限制.通过RAC,一台服务器一个实例,多台机器构成一个实例服务集,客户端连接到它上面.这项技术,我们有时对客户说是负载均衡,实际上这是片面的,RAC的主要针对的是CPU和内存的负载均衡,并没有实现磁盘IO的负载均衡.(当然,磁盘IO可以通过Raid或NAS来实现)</p><p>    RAC还有一个好处是,提高了可用性,也就是说一台服务器坏掉了(注意:不是数据存储介质),不影响正常使用.就像负载均衡一样,它提高了数据层以上的可用性,但不是全部,因为数据坏了,它也没有办法.(数据层,那是Oracle Data Guard的事了,或者干脆说那是存储硬件的事)</p><p>    但是,RAC带来好处的同时,也带来了性能的影响.因为它要全局协调数据高速缓存,保证每个实例上连接的用户看到的缓存数据是一致的,所以把以下三方面的矛盾放大:</p><p>    <br />    1.高速缓存争用<br />    2.过多的I/O<br />    3.锁定</p><p>    也就是说,如果这些方面有问题,用了RAC后问题就会更大,例如:由于SQL没有使用绑定变量导致高速缓存争用,用了RAC会更严重.<br />    总之,如果你的服务器的CPU插满了,内存也加到极限了,而并发用户还在不断增长,或者你对故障停机时间要求非常高,RAC无疑是你应该选择的.</p><p>    <strong>3.分区</strong></p><p>    Oracle的分区用途在于把大的表或索引分成小的片段,以便更容易管理.我们以前可能错误的认为分区就是fast=true,可以提高速度,也在肿瘤和儿科做过这方面的试验.实际上,在事务处理系统中,分区一般不能加快查询速度(某些情况下可能会减少对共享资源的争用).Oracle的分区特性,主要是针对数据仓库来设计的,也就是说你的某张表如果有100G的大小,最好使用分区,好处有以下三个方面:</p><p>    1.提高可用性</p><p>    分区的原理就是分而治之,如果一张表划分为多个分区,其中一个分区所在的介质出了问题,不影响整个表的其它分区数据的访问.</p><p>    2.易于管理</p><p>    在数据仓库下,表分成小的片断,更容易批量的删除,碎片整理,以及一些并行处理.</p><p>    3.提高性能</p><p>    这方面,通过分区来达到是最困难的,必须经过周密的计算来安排分区数据.</p><p>    分区的规划是复杂的,拿我们产品应用来说,一般查询涉及到多个表,多个索引,假设我们把病人费用记录,药品收发记录,病人医嘱记录这类大表建立分区.显然,范围分区对我们提升性能用处不大,散列分区才是我们查询需求的,但大多数数据的散列又不够集中.再加上,这些表上的索引这么多,常用的ID,时间类索引就不少,很少有人能做到把它们全部进行全局分区或准确的进行范围分区(实际上可能根本无法按需求进行多个索引的范围分区).如果查询经常涉及多个索引,如何保证用到的每个索引都在一个分区上,如果不是,必然扫描多个分区,增加逻辑I/O和CPU时间,从而增加查询时间.(数据分布在不同物理存储介质的情况,在下面的并行处理中再讨论)</p><p>    再来看一下,某些情况下可能会减少对共享资源的争用是指什么,是指并行修改和更新会更快.仔细分析,我们分区的原则是什么?一般最常用的可能是按时间段进行范围分区,这样,修改和更新绝大多数还是在同一个分区上进行,所以对减少共享资源的争用这方面,基本没有什么效果.(有按科室ID进行散列分区的对应的唯一应用需求吗?有基于列表分区(典型特征值)的对应的唯一应用需求吗?基本上没有.)分区主要从并行的角度来提高性能,但事务处理系统本身应用特性决定了它不适合这种技术.也就是说,针对我们产品的事务处理应用特点,根本没有必要采用分区技术.</p><p>    <strong>4.并行处理</strong></p><p>    根据我们的应用特点,主要分析并行查询.一般要求配合分区特性,多CPU硬件.自Oracle 8.1.6起,增加了一个自动调节并行查询的选项:PARALLEL_AUTOMATIC_TUNING=TRUE在相应的表上设置PARALLEL参数,Oracle就会在适当的时候自动并行化该表上的操作.并行查询对事务处理系统基本上没有用.因为并行查询的设计是针对数据仓库中的单用户完全消耗100的资源而做的.而事务处理中,往往有很多并发用户,他们争用共用资源,所以你想办法让一个用户占用所有的资源是适得其反</p><div id="ParagraphCount" style="DISPLAY: none">1</div><img src ="http://www.blogjava.net/ASONG/aggbug/92406.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ASONG/" target="_blank">汪松明</a> 2007-01-08 16:24 <a href="http://www.blogjava.net/ASONG/articles/92406.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL语句优化技术分析</title><link>http://www.blogjava.net/ASONG/articles/86900.html</link><dc:creator>汪松明</dc:creator><author>汪松明</author><pubDate>Mon, 11 Dec 2006 06:44:00 GMT</pubDate><guid>http://www.blogjava.net/ASONG/articles/86900.html</guid><wfw:comment>http://www.blogjava.net/ASONG/comments/86900.html</wfw:comment><comments>http://www.blogjava.net/ASONG/articles/86900.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ASONG/comments/commentRss/86900.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ASONG/services/trackbacks/86900.html</trackback:ping><description><![CDATA[
		<span id="ArticleContent1_ArticleContent1_lblContent"> 
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体">操作符优化</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span lang="EN-US">IN </span></b><b><span style="FONT-FAMILY: 宋体">操作符</span><span lang="EN-US"><?XML:NAMESPACE PREFIX = O /?><o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">用</span><span lang="EN-US">IN</span><span style="FONT-FAMILY: 宋体">写出来的</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">的优点是比较容易写及清晰易懂，这比较适合现代软件开发的风格。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体">但是用</span><span lang="EN-US">IN</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">性能总是比较低的，从</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">执行的步骤来分析用</span><span lang="EN-US">IN</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">与不用</span><span lang="EN-US">IN</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">有以下区别：</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span>       </span>ORACLE</span><span style="FONT-FAMILY: 宋体">试图将其转换成多个表的连接，如果转换不成功则先执行</span><span lang="EN-US">IN</span><span style="FONT-FAMILY: 宋体">里面的子查询，再查询外层的表记录，如果转换成功则直接采用多个表的连接方式查询。由此可见用</span><span lang="EN-US">IN</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">至少多了一个转换的过程。一般的</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">都可以转换成功，但对于含有分组统计等方面的</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">就不能转换了。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span>       </span></span><span style="FONT-FAMILY: 宋体">推荐方案：在业务密集的</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">当中尽量不采用</span><span lang="EN-US">IN</span><span style="FONT-FAMILY: 宋体">操作符。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span lang="EN-US">NOT IN</span></b><b><span style="FONT-FAMILY: 宋体">操作符</span><span lang="EN-US"><o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span>       </span></span><span style="FONT-FAMILY: 宋体">此操作是强列推荐不使用的，因为它不能应用表的索引。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span>       </span></span><span style="FONT-FAMILY: 宋体">推荐方案：用</span><span lang="EN-US">NOT EXISTS </span><span style="FONT-FAMILY: 宋体">或（外连接</span><span lang="EN-US">+</span><span style="FONT-FAMILY: 宋体">判断为空）方案代替</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span lang="EN-US">&lt;&gt; </span></b><b><span style="FONT-FAMILY: 宋体">操作符（不等于）</span><span lang="EN-US"><o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span>       </span></span><span style="FONT-FAMILY: 宋体">不等于操作符是永远不会用到索引的，因此对它的处理只会产生全表扫描。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"><span style="FONT-FAMILY: 宋体">推荐方案：用其它相同功能的操作运算代替，如</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"><span lang="EN-US"><span>       </span>a&lt;&gt;0 </span><span style="FONT-FAMILY: 宋体">改为</span><span lang="EN-US"> a&gt;0 or a&lt;0</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"><span lang="EN-US"><span>       </span>a&lt;&gt;’’ </span><span style="FONT-FAMILY: 宋体">改为</span><span lang="EN-US"> a&gt;’’</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span lang="EN-US">IS NULL </span></b><b><span style="FONT-FAMILY: 宋体">或</span><span lang="EN-US">IS NOT NULL</span></b><b><span style="FONT-FAMILY: 宋体">操作（判断字段是否为空）</span><span lang="EN-US"><o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span>       </span></span><span style="FONT-FAMILY: 宋体">判断字段是否为空一般是不会应用索引的，因为</span><span lang="EN-US">B</span><span style="FONT-FAMILY: 宋体">树索引是不索引空值的。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span>       </span></span><span style="FONT-FAMILY: 宋体">推荐方案：</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">用其它相同功能的操作运算代替，如</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span>       </span>a is not null </span><span style="FONT-FAMILY: 宋体">改为</span><span lang="EN-US"> a&gt;0 </span><span style="FONT-FAMILY: 宋体">或</span><span lang="EN-US">a&gt;’’</span><span style="FONT-FAMILY: 宋体">等。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span>       </span></span><span style="FONT-FAMILY: 宋体">不允许字段为空，而用一个缺省值代替空值，如业扩申请中状态字段不允许为空，缺省为申请。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span>       </span></span><span style="FONT-FAMILY: 宋体">建立位图索引（有分区的表不能建，位图索引比较难控制，如字段值太多索引会使性能下降，多人更新操作会增加数据块锁的现象）</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span lang="EN-US">&gt; </span></b><b><span style="FONT-FAMILY: 宋体">及</span><span lang="EN-US"> &lt; </span></b><b><span style="FONT-FAMILY: 宋体">操作符（大于或小于操作符）</span><span lang="EN-US"><o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span>       </span></span><span style="FONT-FAMILY: 宋体">大于或小于操作符一般情况下是不用调整的，因为它有索引就会采用索引查找，但有的情况下可以对它进行优化，如一个表有</span><span lang="EN-US">100</span><span style="FONT-FAMILY: 宋体">万记录，一个数值型字段</span><span lang="EN-US">A</span><span style="FONT-FAMILY: 宋体">，</span><span lang="EN-US">30</span><span style="FONT-FAMILY: 宋体">万记录的</span><span lang="EN-US">A=0</span><span style="FONT-FAMILY: 宋体">，</span><span lang="EN-US">30</span><span style="FONT-FAMILY: 宋体">万记录的</span><span lang="EN-US">A=1</span><span style="FONT-FAMILY: 宋体">，</span><span lang="EN-US">39</span><span style="FONT-FAMILY: 宋体">万记录的</span><span lang="EN-US">A=2</span><span style="FONT-FAMILY: 宋体">，</span><span lang="EN-US">1</span><span style="FONT-FAMILY: 宋体">万记录的</span><span lang="EN-US">A=3</span><span style="FONT-FAMILY: 宋体">。那么执行</span><span lang="EN-US">A&gt;2</span><span style="FONT-FAMILY: 宋体">与</span><span lang="EN-US">A&gt;=3</span><span style="FONT-FAMILY: 宋体">的效果就有很大的区别了，因为</span><span lang="EN-US">A&gt;2</span><span style="FONT-FAMILY: 宋体">时</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">会先找出为</span><span lang="EN-US">2</span><span style="FONT-FAMILY: 宋体">的记录索引再进行比较，而</span><span lang="EN-US">A&gt;=3</span><span style="FONT-FAMILY: 宋体">时</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">则直接找到</span><span lang="EN-US">=3</span><span style="FONT-FAMILY: 宋体">的记录索引。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span lang="EN-US">LIKE</span></b><b><span style="FONT-FAMILY: 宋体">操作符</span><span lang="EN-US"><o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang="EN-US">LIKE</span><span style="FONT-FAMILY: 宋体">操作符可以应用通配符查询，里面的通配符组合可能达到几乎是任意的查询，但是如果用得不好则会产生性能上的问题，如</span><span lang="EN-US">LIKE ‘%5400%’ </span><span style="FONT-FAMILY: 宋体">这种查询不会引用索引，而</span><span lang="EN-US">LIKE ‘X5400%’</span><span style="FONT-FAMILY: 宋体">则会引用范围索引。一个实际例子：用</span><span lang="EN-US">YW_YHJBQK</span><span style="FONT-FAMILY: 宋体">表中营业编号后面的户标识号可来查询营业编号</span><span lang="EN-US"> YY_BH LIKE ‘%5400%’ </span><span style="FONT-FAMILY: 宋体">这个条件会产生全表扫描，如果改成</span><span lang="EN-US">YY_BH LIKE ’X5400%’ OR YY_BH LIKE ’B5400%’ </span><span style="FONT-FAMILY: 宋体">则会利用</span><span lang="EN-US">YY_BH</span><span style="FONT-FAMILY: 宋体">的索引进行两个范围的查询，性能肯定大大提高。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span lang="EN-US">UNION</span></b><b><span style="FONT-FAMILY: 宋体">操作符</span><span lang="EN-US"><o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang="EN-US">UNION</span><span style="FONT-FAMILY: 宋体">在进行表链接后会筛选掉重复的记录，所以在表链接后会对所产生的结果集进行排序运算，删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录，最常见的是过程表与历史表</span><span lang="EN-US">UNION</span><span style="FONT-FAMILY: 宋体">。如：</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">select * from gc_dfys</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">union</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">select * from ls_jg_dfys</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">这个</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">在运行时先取出两个表的结果，再用排序空间进行排序删除重复的记录，最后返回结果集，如果表数据量大的话可能会导致用磁盘进行排序。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体">推荐方案：采用</span><span lang="EN-US">UNION ALL</span><span style="FONT-FAMILY: 宋体">操作符替代</span><span lang="EN-US">UNION</span><span style="FONT-FAMILY: 宋体">，因为</span><span lang="EN-US">UNION ALL</span><span style="FONT-FAMILY: 宋体">操作只是简单的将两个结果合并后就返回。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">select * from gc_dfys</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">union all</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">select * from ls_jg_dfys</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">书写的影响</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span style="FONT-FAMILY: 宋体">同一功能同一性能不同写法</span><span lang="EN-US">SQL</span></b><b><span style="FONT-FAMILY: 宋体">的影响</span><span lang="EN-US"><o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体">如一个</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">在</span><span lang="EN-US">A</span><span style="FONT-FAMILY: 宋体">程序员写的为</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span>       </span>Select * from zl_yhjbqk</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">B</span><span style="FONT-FAMILY: 宋体">程序员写的为</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span>       </span>Select * from dlyx.zl_yhjbqk</span><span style="FONT-FAMILY: 宋体">（带表所有者的前缀）</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">C</span><span style="FONT-FAMILY: 宋体">程序员写的为</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span>       </span>Select * from DLYX.ZLYHJBQK</span><span style="FONT-FAMILY: 宋体">（大写表名）</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">D</span><span style="FONT-FAMILY: 宋体">程序员写的为</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span>       </span>Select *<span>  </span>from DLYX.ZLYHJBQK</span><span style="FONT-FAMILY: 宋体">（中间多了空格）</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">以上四个</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">在</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">分析整理之后产生的结果及执行的时间是一样的，但是从</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">共享内存</span><span lang="EN-US">SGA</span><span style="FONT-FAMILY: 宋体">的原理，可以得出</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">对每个</span><span lang="EN-US">SQL </span><span style="FONT-FAMILY: 宋体">都会对其进行一次分析，并且占用共享内存，如果将</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">的字符串及格式写得完全相同则</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">只会分析一次，共享内存也只会留下一次的分析结果，这不仅可以减少分析</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">的时间，而且可以减少共享内存重复的信息，</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">也可以准确统计</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">的执行频率。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span lang="EN-US">WHERE</span></b><b><span style="FONT-FAMILY: 宋体">后面的条件顺序影响</span><span lang="EN-US"><o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span lang="EN-US"><o:p> </o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">WHERE</span><span style="FONT-FAMILY: 宋体">子句后面的条件顺序对大数据量表的查询会产生直接的影响，如</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'">Select * from zl_yhjbqk where dy_dj = '1KV</span></b><b><span style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 宋体">以下</span></b><b><span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'">' and xh_bz=1</span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'">Select * from zl_yhjbqk where xh_bz=1<span>  </span>and dy_dj = '1KV</span></b><b><span style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 宋体">以下</span></b><b><span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'">'</span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体">以上两个</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">中</span><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">dy_dj</span><span style="COLOR: black; FONT-FAMILY: 宋体">（电压等级）及<span lang="EN-US">xh_bz</span>（销户标志）两个字段都没进行索引，所以执行的时候都是全表扫描，第一条<span lang="EN-US">SQL</span>的</span><b><span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'">dy_dj = '1KV</span></b><b><span style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 宋体">以下</span></b><b><span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'">'</span></b><span style="COLOR: black; FONT-FAMILY: 宋体">条件在记录集内比率为<span lang="EN-US">99%</span>，而</span><b><span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'">xh_bz=1</span></b><span style="COLOR: black; FONT-FAMILY: 宋体">的比率只为<span lang="EN-US">0.5%</span>，在进行第一条<span lang="EN-US">SQL</span>的时候<span lang="EN-US">99%</span>条记录都进行</span><b><span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'">dy_dj</span></b><b><span style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 宋体">及</span></b><b><span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'">xh_bz</span></b><span style="COLOR: black; FONT-FAMILY: 宋体">的比较，而在进行第二条<span lang="EN-US">SQL</span>的时候<span lang="EN-US">0.5%</span>条记录都进行</span><b><span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'">dy_dj</span></b><b><span style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 宋体">及</span></b><b><span lang="EN-US" style="FONT-SIZE: 8pt; COLOR: black; FONT-FAMILY: 'Courier New'">xh_bz</span></b><span style="COLOR: black; FONT-FAMILY: 宋体">的比较，以此可以得出第二条<span lang="EN-US">SQL</span>的<span lang="EN-US">CPU</span>占用率明显比第一条低。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span style="FONT-FAMILY: 宋体">查询表顺序的影响</span><span lang="EN-US"><o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">在</span><span lang="EN-US">FROM</span><span style="FONT-FAMILY: 宋体">后面的表中的列表顺序会对</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">执行性能影响，在没有索引及</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">没有对表进行统计分析的情况下</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">会按表出现的顺序进行链接，由此因为表的顺序不对会产生十分耗服务器资源的数据交叉。（注：如果对表进行了统计分析，</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">会自动先进小表的链接，再进行大表的链接）</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span lang="EN-US">SQL</span></b><b><span style="FONT-FAMILY: 宋体">语句索引的利用</span><span lang="EN-US"><o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span style="FONT-FAMILY: 宋体">对操作符的优化（见上节）</span><span lang="EN-US"><o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体">对条件字段的一些优化</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span style="FONT-FAMILY: 宋体">采用函数处理的字段不能利用索引，如：</span><span lang="EN-US"><o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US">substr(hbs_bh,1,4)=’<?XML:NAMESPACE PREFIX = ST1 /?><st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="5400" unitname="’">5400’</st1:chmetcnv></span><span style="FONT-FAMILY: 宋体">，优化处理：</span><span lang="EN-US">hbs_bh like ‘5400%’</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US" style="FONT-FAMILY: 宋体">trunc(sk_rq)=trunc(sysdate)</span><span style="FONT-FAMILY: 宋体">， 优化处理：<span lang="EN-US"><o:p></o:p></span></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US" style="COLOR: black; FONT-FAMILY: 宋体">sk_rq&gt;=trunc(<b>sysdate</b>) <b>and</b> sk_rq&lt;trunc(<b>sysdate+1</b>)</span><span lang="EN-US" style="FONT-FAMILY: 宋体"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span style="FONT-FAMILY: 宋体">进行了显式或隐式的运算的字段不能进行索引，如：</span><span lang="EN-US"><o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US">ss_df+20&gt;50</span><span style="FONT-FAMILY: 宋体">，优化处理：</span><span lang="EN-US">ss_df&gt;30</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US">‘X’||hbs_bh&gt;’X<st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="5400021452" unitname="’">5400021452’</st1:chmetcnv></span><span style="FONT-FAMILY: 宋体">，优化处理：</span><span lang="EN-US">hbs_bh&gt;’<st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="5400021542" unitname="’">5400021542’</st1:chmetcnv></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US">sk_rq+5=sysdate</span><span style="FONT-FAMILY: 宋体">，优化处理：</span><span lang="EN-US">sk_rq=sysdate-5</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US">hbs_bh=5401002554</span><span style="FONT-FAMILY: 宋体">，优化处理：</span><span lang="EN-US">hbs_bh=’ <st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="5401002554" unitname="’">5401002554’</st1:chmetcnv></span><span style="FONT-FAMILY: 宋体">，<b>注：</b>此条件对</span><span lang="EN-US">hbs_bh </span><span style="FONT-FAMILY: 宋体">进行隐式的</span><span lang="EN-US">to_number</span><span style="FONT-FAMILY: 宋体">转换，因为</span><span lang="EN-US">hbs_bh</span><span style="FONT-FAMILY: 宋体">字段是字符型。</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span style="FONT-FAMILY: 宋体">条件内包括了多个本表的字段运算时不能进行索引，如：</span><span lang="EN-US"><o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US">ys_df&gt;cx_df</span><span style="FONT-FAMILY: 宋体">，无法进行优化</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US">qc_bh||kh_bh=’<st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="5400250000" unitname="’">5400250000’</st1:chmetcnv></span><span style="FONT-FAMILY: 宋体">，优化处理：</span><span lang="EN-US">qc_bh=’<st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="5400" unitname="’">5400’</st1:chmetcnv> and kh_bh=’<st1:chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="250000" unitname="’">250000’</st1:chmetcnv></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span style="FONT-FAMILY: 宋体">应用</span><span lang="EN-US">ORACLE</span></b><b><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">HINT</span></b><b><span style="FONT-FAMILY: 宋体">（提示）处理</span><span lang="EN-US"><o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体">提示处理是在</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">产生的</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">分析执行路径不满意的情况下要用到的。它可以对</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">进行以下方面的提示</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span style="FONT-FAMILY: 宋体">目标方面的提示：</span><span lang="EN-US"><o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US">COST</span><span style="FONT-FAMILY: 宋体">（按成本优化）</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US">RULE</span><span style="FONT-FAMILY: 宋体">（按规则优化）</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US">CHOOSE</span><span style="FONT-FAMILY: 宋体">（缺省）（</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">自动选择成本或规则进行优化）</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US">ALL_ROWS</span><span style="FONT-FAMILY: 宋体">（所有的行尽快返回）</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US">FIRST_ROWS</span><span style="FONT-FAMILY: 宋体">（第一行数据尽快返回）</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span style="FONT-FAMILY: 宋体">执行方法的提示：</span><span lang="EN-US"><o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US">USE_NL</span><span style="FONT-FAMILY: 宋体">（使用</span><span lang="EN-US">NESTED LOOPS</span><span style="FONT-FAMILY: 宋体">方式联合）</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US">USE_MERGE</span><span style="FONT-FAMILY: 宋体">（使用</span><span lang="EN-US">MERGE JOIN</span><span style="FONT-FAMILY: 宋体">方式联合）</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US">USE_HASH</span><span style="FONT-FAMILY: 宋体">（使用</span><span lang="EN-US">HASH JOIN</span><span style="FONT-FAMILY: 宋体">方式联合）</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span style="FONT-FAMILY: 宋体">索引提示：</span><span lang="EN-US"><o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang="EN-US">INDEX</span><span style="FONT-FAMILY: 宋体">（</span><span lang="EN-US">TABLE INDEX</span><span style="FONT-FAMILY: 宋体">）（使用提示的表索引进行查询）</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span style="FONT-FAMILY: 宋体">其它高级提示（如并行处理等等）</span><span lang="EN-US"><o:p></o:p></span></b></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p> </o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">的提示功能是比较强的功能，也是比较复杂的应用，并且提示只是给</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">执行的一个建议，有时如果出于成本方面的考虑</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">也可能不会按提示进行。根据实践应用，一般不建议开发人员应用</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">提示，因为各个数据库及服务器性能情况不一样，很可能一个地方性能提升了，但另一个地方却下降了，</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">在</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">执行分析方面已经比较成熟，如果分析执行的路径不对首先应在数据库结构（主要是索引）、服务器当前性能（共享内存、磁盘文件碎片）、数据库对象（表、索引）统计信息是否正确这几方面分析。</span></p></span>
<img src ="http://www.blogjava.net/ASONG/aggbug/86900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ASONG/" target="_blank">汪松明</a> 2006-12-11 14:44 <a href="http://www.blogjava.net/ASONG/articles/86900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用SQL语句书写技巧(转)</title><link>http://www.blogjava.net/ASONG/articles/86847.html</link><dc:creator>汪松明</dc:creator><author>汪松明</author><pubDate>Mon, 11 Dec 2006 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/ASONG/articles/86847.html</guid><wfw:comment>http://www.blogjava.net/ASONG/comments/86847.html</wfw:comment><comments>http://www.blogjava.net/ASONG/articles/86847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ASONG/comments/commentRss/86847.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ASONG/services/trackbacks/86847.html</trackback:ping><description><![CDATA[
		<p>SQL结构化查询字符串的改写，是实现数据库查询性能提升的最现实、最有效的手段，有时甚至是唯一的手段，比如在不允许大幅度修改现有数据库结构的情况下。<br />通过优化SQL语句提高查询性能的关键是：<br /> 根据实际需求情况，建立合适的索引；<br /> 使用一切可能的方式去利用好索引，避免全表扫描；<br /> 尽量减少内存及数据I/O方面的开销<br /><br />一、 建立索引<br />（一）建立“适当”的索引，是快速查询的基础。<br />索引（index）是除表之外另一重要的、用户定义的存储在物理介质上的数据结构。当根据索引码的值搜索数据时，索引提供了对数据的快速访问。事实上，没有索引，数据库也能根据Select语句成功地检索到结果，但随着表变得越来越大，使用“适当”的索引的效果就越来越明显。注意，在这句话中，我们用了“适当”这个词，这是因为，如果使用索引时不认真考虑其实现过程，索引既可以提高也会破坏数据库的工作性能。<br />索引实际上是一种特殊的目录，SQL SERVER提供了两种索引：<br /> 聚集索引（clustered index，也称聚类索引、簇集索引）<br />我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。<br />例如：<br />汉语字典中按拼音查某一个字，就是使用“聚集索引”，实际上，你根本用不着查目录，直接在字典正文里找，就能很快找到需要的汉字（假设你知道发音）。<br /> 非聚集索引（nonclustered index，也称非聚类索引、非簇集索引）<br />我们把目录纯粹是目录，正文纯粹是正文的排序方式称为“非聚集索引”。<br />例如：<br />汉语字典中按部首查某一个字，部首目录和正文一定要刻意的通过页码才能联系到一起，其顺序不是天然一致的。<br /><br /><font color="#ff0000">聚集索引与非聚集索引的最大区别就在于：聚集索引是对原数据表进行排序，因此只要符合索引条件，就能够直接连续的读取数据记录，几乎可以达到对数据表的零扫描；而非聚集索引仅仅只是另外建了一张索引表，取数据的时候，从索引表取得结果后，还需要到指针所指的数据行读取相应数据，因此，在性能上，聚集索引会大大优于非聚集索引。<br /></font>　　但是在一张表中，聚集索引只允许一个，是比较宝贵的，因此要尽可能的用于那些使用频率最高的索引上。 另外，查询时必需要用到索引的起始列，否则索引无效。另外，起始列也必需是使用频繁的列，那样的索引性能才会达到最优化。<br /><br />（二）表：何时应使用聚集索引或非聚集索引<br /><br />动作描述 使用聚集索引 使用非聚集索引<br />列经常被分组排序 ○ ○<br />返回某范围内的数据 ○ <br />一个或极少不同值 <br />小数目的不同值 ○ <br />大数目的不同值 ○<br />频繁更新的列 ○<br />外键列 ○ ○<br />主键列 ○ ○<br />频繁修改索引列 ○<br /><br />（三）索引建立的一些注意项<br />1、不要把聚集索引浪费在主键上，除非你只按主键查询<br />虽然SQL SERVER默认是在主键上建立聚集索引的，但实际应用中，这样做比较浪费。通常，我们会在每个表中都建立一个ID列，以区分每条数据，并且这个ID列是自动增大的，步长一般为1。此时，<font color="#000080">如果我们将这个列设为主键，SQL SERVER会将此列默认为聚集索引</font>。这样做有好处，就是可以让您的数据在数据库中按照ID进行物理排序，但这样做实用价值不大。<br />从我们前面谈到的聚集索引的定义我们可以看出，使用聚集索引的最大好处就是能够根据查询要求，迅速缩小查询范围，避免全表扫描。在实际应用中，因为ID号是自动生成的，我们并不知道每条记录的ID号，所以我们很难在实践中用ID号来进行查询。这就使让ID号这个主键作为聚集索引成为一种资源浪费。聚集索引相对与非聚集索引的优势是很明显的，而每个表中只能有一个聚集索引的规则，这使得聚集索引变得更加宝贵，应该用在其他查询频率高的字段上。其次，<font color="#ff0000">让每个ID号都不同的字段作为聚集索引也不符合“大数目的不同值情况下不应建立聚合索引”规则</font>；当然，这种情况只是针对用户经常修改记录内容，特别是索引项的时候会负作用，但对于查询速度并没有影响。<br /><br />2、索引的建立要根据实际应用需求来进行<br />并非是在任何字段上简单地建立索引就能提高查询速度。<font color="#000080">聚集索引建立的规则大致是“既不能绝大多数都相同，又不能只有极少数相同”</font>。举个例子，在公文表的收发日期字段上建立聚合索引是比较合适的。在政务系统中，我们每天都会收一些文件，这些文件的发文日期将会相同，在发文日期上建立聚合索引对性能的提升应该是相当大的。在群集索引下，数据物理上按顺序存于数据页上，重复值也排列在一起，因而在范围查找时，可以先找到这个范围的起末点，且只在这个范围内扫描数据页，避免了大范围扫描，提高了查询速度。<br />另一个相反的例子：比如在雇员表的“性别”列上只有“男”与“女”两个不同值，因此就完全没必要建立索引。<br /><br />3、在聚集索引中加入所有需要提高查询速度的字段，形成复合索引<br />根据一些实验的结果，我们可以得出一些可供参考的结论：<br /> 仅用复合聚集索引的起始列作为查询条件和同时用到复合聚集索引的全部列的查询，速度是几乎一样的，甚至比后者还要快（在查询结果集数目一样的情况下）；<br /> 仅用复合聚集索引的非起始列作为查询条件的话，<br />这个索引是不起任何作用的。<br /> 复合聚集索引的所有列都用上，而且因为查询条件严格，查询结果少的话，会形成“索引覆盖”，性能可以达到最优。<br /> 最重要的一点：无论是否经常使用复合聚合索引的其他列，其起始列一定要是使用最频繁的列。<br /><br />4.根据实践得出的一些其他经验，特定情况下有效 <br /> 用聚合索引比用不是聚合索引的主键速度快；<br /> 用聚合索引比用一般的主键作order by速度快，特别是在小数据量情况；<br /> 使用聚合索引内的时间段，搜索时间会按数据占整个数据表的百分比成比例减少，而无论聚合索引使用了多少个；<br /> 日期列不会因为有分秒的输入而减慢查询速度；<br /> 由于改变一个表的内容，将会引起索引的变化。频繁的insert,update,delete语句将导致系统花费较大的代价进行索引更新，引起整体性能的下降。一般来讲，在对查询性能的要求高于对数据维护性能要求时，应该尽量使用索引，否则，就要慎重考虑一下付出的代价。在某些极端情况下，可先删除索引，再对数据库表更新大量数据，最后再重建索引，新建立的索引总是比较好用。<br /><br />二、 编写优化的SQL语句，充分利用索引<br />下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍。在这些where子句中，即使某些列存在索引，但是由于编写了劣质的SQL，系统在运行该SQL语句时也不能使用该索引，而同样使用全表扫描，这就造成了响应速度的极大降低。<br />SQL语句在提交给数据库进行操作前，都会经过查询分析阶段，SQLSERVER内置的查询优化器会分析查询条件的的每个部分，并判断这些条件是否符合扫描参数（SARG）的标准。只有当一个查询条件符合SARG的标准，才可以通过预先设置的索引，提升查询性能。<br />SARG的定义：用于限制搜索操作的一种规范，通常是指一个特定的匹配，一个确定范围内的匹配或者两个以上条件的AND连接。一般形式如下：<br />列名 操作符 &lt;常数 或 变量&gt;<br />或<br />&lt;常数 或 变量&gt; 操作符 列名<br />列名可以出现在操作符的一边，而常数或变量出现在操作符的另一边。如：<br />Name=’张三’<br />价格&gt;5000<br />5000&lt;价格<br />Name=’张三’ and 价格&gt;5000<br />如果一个表达式不能满足SARG的形式，那它就无法限制搜索的范围了，也就是说SQL SERVER必须对每一行都判断它是否满足Where子句中的所有条件，既进行全表扫描。所以，一个索引对于不满足SARG形式的表达式来说是无用的, 如：当查询条件为“价格*2 &gt;5000”时，就无法利用建立在价格字段上的索引 。<br />SQLSERVER内置了查询优化器，能将一些条件自动转换为符合SARG标准，如：将“价格*2 &gt;5000” 转换为“价格 &gt;2500/2 ”，以达到可以使用索引的目的，但这种转化不是100%可靠的，有时会有语义上的损失，有时转化不了。如果对“查询优化器”的工作原理不是特别了解，写出的SQL语句可能不会按照您的本意进行查询。所以不能完全依赖查询优化器的优化，建议大家还是利用自己的优化知识，尽可能显式的书写出符合SARG标准的SQL语句，自行确定查询条件的构建方式，这样一方面有利于查询分析器分析最佳索引匹配顺序，另一方面也有利于今后重读代码。<br />介绍完SARG后，我们再结合一些实际运用中的例子来做进一步的讲解：<br />1、 <font color="#ff0000">Like语句是否属于SARG取决于使用%通配符的样式</font><br /><font color="#0000ff">如：name like ‘张%’ ，这就属于SARG<br />而：name like ‘%张’ ,就不属于SARG</font><br />通配符%在字符串首字符的使用会导致索引无法使用，虽然实际应用中很难避免这样用，但还是应该对这种现象有所了解，至少知道此种用法性能是很低下的。<br />2、 <font color="#ff0000">“非”操作符不满足SARG形式，使得索引无法使用 <br /></font><font color="#0000ff">不满足SARG形式的语句最典型的情况就是包括非操作符的语句，如：NOT、!=、&lt;&gt;、!&lt;、!&gt;、NOT EXISTS、NOT IN、NOT LIKE等。</font><br />下面是一个NOT子句的例子：<br />　　... where not (status ='valid') <br />　　not运算符也隐式的包含在另外一些逻辑运算符中，比如&lt;&gt;运算符。见下例：<br />　　... where status &lt;&gt;'invalid'; <br /><br />　　再看下面这个例子：<br />　　select * from employee where salary&lt;&gt;3000; <br />　　对这个查询，可以改写为不使用not：<br />　　select * from employee where salary&lt;3000 or salary&gt;3000; <br /><br />　　虽然这两种查询的结果一样，但是第二种查询方案会比第一种查询方案更快些。第二种查询允许对salary列使用索引，而第一种查询则不能使用索引。<br /><br />3、 <font color="#ff0000">函数运算不满足SARG形式，使得索引无法使用</font><br />例：下列SQL条件语句中的列都建有恰当的索引，但执行速度却非常慢：<br />select * from record where substring(card_no,1,4)=′5378′(13秒)<br />select * from record where amount/30&lt; 1000（11秒）<br />select * from record where convert(char(10),date,112)=′19991201′（10秒）<br />分析： <br />where子句中对列的任何操作结果都是在SQL运行时逐列计算得到的，因此它不得不进行全表扫描，而没有使用该列上面的索引；如果这些结果在查询编译时就能得到，那么就可以被SQL优化器优化，使用索引，避免表搜索，因此将SQL重写成下面这样：<br />select * from record where card_no like ′5378%′（&lt; 1秒） <br />select * from record where amount &lt; 1000*30（&lt; 1秒） <br />select * from record where date= ′1999/12/01′ （&lt; 1秒）<br /><br />你会发现SQL明显快很多<br /><br />4、 <font color="#ff0000">尽量不要对建立了索引的字段，作任何的直接处理</font><br />select * from employs where first_name + last_name ='beill cliton'; <br />无法使用索引<br /><br />改为：<br />select * from employee where <br />first_name = substr('beill cliton',1,instr('beill cliton',' ')-1) <br />and<br />last_name = substr('beill cliton',instr('beill cliton',' ')+1) <br />则可以使用索引<br />5、 <font color="#ff0000">不同类型的索引效能是不一样的，应尽可能先使用效能高的</font><br /><font color="#0000ff">比如：数字类型的索引查找效率高于字符串类型，定长字符串char，nchar的索引效率高于变长字符串varchar,nvarchar的索引。</font><br />应该将<br />where username='张三' and age&gt;20<br />改进为<br />where age&gt;20 and username='张三'<br />注意：<br /><br />此处，SQL的查询分析优化功能可以做到自动重排条件顺序，但还是建议预先手工排列好。<br /><br /><br />6、 <font color="#ff0000">尽量不要使用 is null 与 is not null作为查询条件</font><br />　　<font color="#0000ff">任何包含null值的列都将不会被包含在索引中</font>，如果某列数据中存在空值，那么对该列建立索引的性能提升是值得怀疑的，尤其是将null作为查询条件的一部分时。建议一方面避免使用is null和is not null, <font color="#0000ff">另一方面不要让数据库字段中存在null, 即使没有内容，也应利用缺省值，或者手动的填入一个值，如:’’ 空字符串。</font><br /><br />7、 <font color="#ff0000">某些情况下IN 的作用与OR 相当 ，且都不能充分利用索引<br /></font>例：表stuff有200000行，id_no上有非群集索引，请看下面这个SQL：<br />select count(*) from stuff where id_no in(′0′,′1′) （23秒）<br /><br />where条件中的′in′在逻辑上相当于′or′，所以语法分析器会将in (′0′,′1′)转化为id_no =′0′ or id_no=′1′来执行。我们期望它会根据每个or子句分别查找，再将结果相加，这样可以利用id_no上的索引；但实际上,它却采用了"OR策略"，即先取出满足每个or子句的行，存入临时数据库的工作表中，再建立唯一索引以去掉重复行，最后从这个临时表中计算结果。因此，实际过程没有利用id_no上索引，并且完成时间还要受tempdb数据库性能的影响。 <br />实践证明，表的行数越多，工作表的性能就越差，当stuff有620000行时，执行时间会非常长！如果确定不同的条件不会产生大量重复值，还不如将or子句分开：<br />select count(*) from stuff where id_no=′0′ <br />select count(*) from stuff where id_no=′1′<br />得到两个结果，再用union作一次加法合算。因为每句都使用了索引，执行时间会比较短， <br />select count(*) from stuff where id_no=′0′ <br />union<br />select count(*) from stuff where id_no=′1′<br />从实践效果来看，使用union在通常情况下比用or的效率要高的多，<font color="#0000ff">而exist关键字和in关键字在用法上类似</font>，性能上也类似，都会产生全表扫描，效率比较低下，根据未经验证的说法，exist可能比in要快些。<br /><br />8、 <font color="#ff0000">使用变通的方法提高查询效率</font><br />　　like关键字支持通配符匹配，但这种匹配特别耗时。例如：select * from customer where zipcode like “21_ _ _”，即使在zipcode字段上已建立了索引，在这种情况下也可能还是采用全表扫描方式。如果把语句改为：select * from customer where zipcode &gt;“21000”，在执行查询时就会利用索引，大大提高速度。但这种变通是有限制的，不应引起业务意义上的损失，对于邮政编码而言，zipcode like “21_ _ _” 和 zipcode &gt;“21000” 意义是完全一致的。<br />9、 <font color="#ff0000">组合索引的高效使用</font><br />假设已在date，place，amount三个字段上建立了组合索引<br />select count(*) from record <br />where date &gt; ′19991201′ and date &lt; ′19991214′ and amount &gt; 2000 <br />(&lt; 1秒) <br /><br />select date,sum(amount) from record group by date <br />（11秒） <br /><br />select count(*) from record <br />where date &gt; ′19990901′ and place in (′BJ′,′SH′)<br />（&lt; 1秒）<br />这是一个设置较合理的组合索引。它将date作为前导列，使每个SQL都可以利用索引，并且在第一和第三个SQL中形成了索引覆盖，因而性能达到了最优。如果索引不便于更改，修正SQL中的条件顺序以配合索引顺序也是可行的。<br />10、 <font color="#ff0000">order by按聚集索引列排序效率最高</font><br />排序是较耗时的操作，应尽量简化或避免对大型表进行排序，如缩小排序的列的范围，只在有索引的列上排序等等。<br />我们来看：（gid是主键，fariqi是聚合索引列）<br />select top 10000 gid,fariqi,reader,title from tgongwen<br />用时：196 毫秒。 扫描计数 1，逻辑读 289 次，物理读 1 次，预读 1527 次。<br />select top 10000 gid,fariqi,reader,title from tgongwen order by gid asc<br />用时：4720毫秒。 扫描计数 1，逻辑读 41956 次，物理读 0 次，预读 1287 次。<br />select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc<br />用时：4736毫秒。 扫描计数 1，逻辑读 55350 次，物理读 10 次，预读 775 次。<br />select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi asc<br />用时：173毫秒。 扫描计数 1，逻辑读 290 次，物理读 0 次，预读 0 次。<br />select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi desc<br />用时：156毫秒。 扫描计数 1，逻辑读 289 次，物理读 0 次，预读 0 次。<br />从以上我们可以看出，<font color="#ff0000">不排序的速度以及逻辑读次数都是和“order by 聚集索引列” 的速度是相当的，但这些都比“order by 非聚集索引列”的查询速度是快得多的。<br /></font>同时，按照某个字段进行排序的时候，无论是正序还是倒序，速度是基本相当的。<br />三、 关于节省数据查询系统开销方面的措施<br />1、 <font color="#ff0000">使用TOP尽量减少取出的数据量</font><br />TOP是SQL SERVER中用来提取前几条或前某个百分比数据的关键词。<br />select top 20 gid,fariqi,reader,title from tgongwen order by gid desc<br />select top 60 percent gid,fariqi,reader,title from tgongwen order by gid desc<br />在实际的应用中，应该经常利用top 剔除掉不必要的数据，只保留必须的数据集合。这样不仅可以减少数据库逻辑读的次数，还能避免不必要的内存浪费，对系统性能的提升都是有好处的。<br /><br />2、 字段提取要按照“需多少、提多少”的原则，避免“select *”<br />这个举个例子：<br />select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc<br />用时：4673毫秒<br />select top 10000 gid,fariqi,title from tgongwen order by gid desc<br />用时：1376毫秒<br />select top 10000 gid,fariqi from tgongwen order by gid desc<br />用时：80毫秒<br />由此看来，字段大小越大，数目越多，select所耗费的资源就越多，<font color="#0000ff">比如取int类型的字段就会比取char的快很多。我们每少提取一个字段，数据的提取速度就会有相应的提升。提升的幅度根据舍弃的字段的大小来判断。</font><br />3、 count(*) 与 count(字段) 方法比较<br />我们来看一些实验例子（gid为Tgongwen的主键）：<br />select count(*) from Tgongwen<br />用时：1500毫秒<br />select count(gid) from Tgongwen <br />用时：1483毫秒<br />select count(fariqi) from Tgongwen<br />用时：3140毫秒<br />select count(title) from Tgongwen<br />用时：52050毫秒<br />从以上可以看出，<font color="#0000ff">用count(*)和用count(主键)的速度是相当的，而count(*)却比其他任何除主键以外的字段汇总速度要快，而且字段越长，汇总速度就越慢。如果用count(*)， SQL SERVER会自动查找最小字段来汇总。当然，如果您直接写count(主键)将会来的更直接些。</font><br />4、 <font color="#ff0000">有嵌套查询时，尽可能在内层过滤掉数据<br /></font>如果一个列同时在主查询和where子句中出现，很可能当主查询中的列值改变之后，子查询必须重新查询一次。而且查询嵌套层次越多，效率越低，<font color="#0000ff">因此应当尽量避免子查询。如果子查询不可避免，那么要在子查询中过滤掉尽可能多的行。 <br /></font>5、 <font color="#ff0000">多表关联查询时，需注意表顺序，并尽可能早的过滤掉数据<br /></font>在使用Join进行多表关联查询时候，应该使用系统开销最小的方案。连接条件要充份考虑带有索引的表、行数多的表，并注意优化表顺序；说的简单一点，就是尽可能早的将之后要做关联的数据量降下来。<br />一般情况下，sqlserver 会对表的连接作出自动优化。例如： <br />select name,no from A <br />join B on A. id=B.id <br />join C on C.id=A.id <br />where name='wang' <br />尽管A表在From中先列出，然后才是B,最后才是C。但sql server可能会首先使用c表。它的选择原则是相对于该查询限制为单行或少数几行，就可以减少在其他表中查找的总数据量。绝大多数情况下，sql server 会作出最优的选择，但如果你发觉某个复杂的联结查询速度比预计的要慢，就可以使用SET FORCEPLAN语句强制sql server按照表出现顺序使用表。如上例加上：SET FORCEPLAN ON…….SET FORCEPLAN OFF 表的执行顺序将会按照你所写的顺序执行。在查询分析器中查看2种执行效率，从而选择表的连接顺序。SET FORCEPLAN的缺点是只能在存储过程中使用。<br /><br />小结：<br /> <font color="#ff0000">聚集索引比较宝贵，应该用在查询频率最高的地方；<br /> 在数据为“既不是绝大多数相同，也不是极少数相同”状态时，<br />最能发挥聚集索引的潜力；<br /> 复合索引的设置和使用要注意保持顺序一致；<br /> 条件子句的表达式最好符合SARG规范，是可利用索引的；<br /> 任何对列的操作都导致全表扫描，如数据库函数、计算表达式等，<br />查询时应尽可能将操作移至等号的某一边； <br /> 要注意含有null值时，是不能充分利用索引的；<br /> exist, in、or等子句常会使索引失效；<br />如果不产生大量重复值，可以考虑把子句拆开，再用union拼合；<br /> 排序时应充分利用带索引的字段；<br /> 尽可能早，快的过滤掉无用的数据，只将必须的数据带到后续的操作中去<br /></font>从前面讲叙的内容可以看出，SQL语句优化的实质就是在结果正确的前提下，用分析优化器可以识别的SARG规范语句，充份利用索引，减少数据的I/O次数，尽量避免全表扫描的发生。<br />以上内容有些是指导性的理论原则，有些是实际摸索的经验，大家在使用时应灵活处理，根据实际情况，选择合适的方法。本文中列举的实验数据仅作比对用，不具备普遍意义。大家在实际项目中，<font color="#0000ff">应充分利用性能监测和分析工具（如SQLSERVER带的相关工具）来检验自己的优化效果</font>。<br />此外，还有很重要的一点要提醒大家，同样复杂的数据操作，在SQLSERVER数据库级别完成的代价要远远小于在应用端用程序代码完成的代价，所以建议大家全面，深入的学习SQL语法中重要关键字的应用，如：Group By ，Having等，<font style="BACKGROUND-COLOR: #ff0000" color="#ffffff">尽量把数据操作任务放在数据库系统中完成</font> 。数据库应用系统的性能优化是一个复杂的过程，上述这些只是在SQL语句层次的一种体现，深入研究还会涉及数据库层的资源配置、网络层的流量控制以及操作系统层的总体设计等等，这些将在以后的文章中详细论述</p>
<img src ="http://www.blogjava.net/ASONG/aggbug/86847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ASONG/" target="_blank">汪松明</a> 2006-12-11 11:49 <a href="http://www.blogjava.net/ASONG/articles/86847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL语句性能优化--LECCO SQL Expert</title><link>http://www.blogjava.net/ASONG/articles/86833.html</link><dc:creator>汪松明</dc:creator><author>汪松明</author><pubDate>Mon, 11 Dec 2006 03:21:00 GMT</pubDate><guid>http://www.blogjava.net/ASONG/articles/86833.html</guid><wfw:comment>http://www.blogjava.net/ASONG/comments/86833.html</wfw:comment><comments>http://www.blogjava.net/ASONG/articles/86833.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ASONG/comments/commentRss/86833.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ASONG/services/trackbacks/86833.html</trackback:ping><description><![CDATA[SQL语句的优化是将性能低下的SQL语句转换成目的相同的性能优异的SQL语句。 
<p>　　人工智能自动SQL优化就是使用人工智能技术，自动对SQL语句进行重写，从而找到性能最好的等效SQL语句。</p><p>　　数据库性能的优化</p><p>　　一个数据库系统的生命周期可以分成：设计、开发和成品三个阶段。在设计阶段进行数据库性能优化的成本最低，收益最大。在成品阶段进行数据库性能优化的成本最高，收益最小。</p><p>　　数据库的优化通常可以通过对网络、硬件、<a class="Channel_KeyLink" href="http://www.54iter.com/xueyuan/os/Index.html">操作系统</a>、数据库参数和<a class="Channel_KeyLink" href="http://www.54iter.com/xueyuan/Index.html">应用</a>程序的优化来进行。最常见的优化手段就是对硬件的升级。根据统计，对网络、硬件、<a class="Channel_KeyLink" href="http://www.54iter.com/xueyuan/os/Index.html">操作系统</a>、数据库参数进行优化所获得的性能提升，全部加起来只占数据库系统性能提升的40%左右，其余的60%系统性能提升来自对<a class="Channel_KeyLink" href="http://www.54iter.com/xueyuan/Index.html">应用</a>程序的优化。许多优化专家认为，对<a class="Channel_KeyLink" href="http://www.54iter.com/xueyuan/Index.html">应用</a>程序的优化可以得到80%的系统性能的提升。</p><p>　　<a class="Channel_KeyLink" href="http://www.54iter.com/xueyuan/Index.html">应用</a>程序的优化</p><p>　　<a class="Channel_KeyLink" href="http://www.54iter.com/xueyuan/Index.html">应用</a>程序的优化通常可分为两个方面：源代码和SQL语句。由于涉及到对程序逻辑的改变，源代码的优化在时间成本和风险上代价很高，而对数据库系统性能的提升收效有限。</p><p>　　为什么要优化SQL语句</p><p>　　. SQL语句是对数据库进行操作的惟一途径，对数据库系统的性能起着决定性的作用。</p><p>　　. SQL语句消耗了70%至90%的数据库资源。</p><p>　　. SQL语句独立于程序设计逻辑，对SQL语句进行优化不会影响程序逻辑。</p><p>　　. SQL语句有不同的写法，在性能上的差异非常大。</p><p>　　. SQL语句易学，但难精通。</p><p>　　优化SQL语句的传统方法是通过手工重写来对SQL语句进行优化。DBA或资深程序员通过对SQL语句执行计划的分析，依靠经验，尝试重写SQL语句，然后对结果和性能进行比较，以试图找到性能较佳的SQL语句。这种传统上的作法无法找出SQL语句的所有可能写法，且依赖于人的经验，非常耗费时间。</p><p>　　SQL优化技术的发展历程</p><p>　　第一代SQL优化工具是执行计划分析工具。这类工具针对输入的SQL语句，从数据库提取执行计划，并解释执行计划中关键字的含义。 </p><p>　　第二代SQL优化工具只能提供增加索引的建议，它通过对输入的SQL语句的执行计划的分析，来产生是否要增加索引的建议。</p><p>　　第三代SQL优化工具不仅分析输入SQL语句的执行计划，还对输入的SQL语句本身进行语法分析，经过分析产生写法上的改进建议。</p><p>　　人工智能自动SQL优化</p><p align="center"><img src="http://www.51iter.com/program/UploadFiles_9347/200604/200641012522661.jpg" border="1" /><br />图1 人工智能自动SQL优化示意图</p><p>　　人工智能自动SQL优化出现在90年代末。目前在商用数据库领域，LECCO Technology Limited(灵高科研有限公司)拥有该技术，并提供使用该技术的自动优化产品LECCO SQL Expert，它支持Oracle、Sybase、MS SQL Server和IBM DB2数据库平台。该产品针对数据库<a class="Channel_KeyLink" href="http://www.54iter.com/xueyuan/Index.html">应用</a>的开发和维护阶段提供的模块有：SQL语法优化器、PL/SQL集成化开发调试环境(IDE)、扫描器、数据库监视器等。其核心模块SQL 语法优化器的工作原理为：①输入一条源SQL语句；②“人工智能反馈式搜索引擎”对输入的SQL语句，结合检测到的数据库结构和索引进行重写，产生N条等效的SQL语句输出；③产生的N条等效SQL语句再送入“人工智能反馈式搜索引擎”进行重写，直至无法产生新的输出或搜索限额满；④对输出的SQL语句进行过滤，选出具有不同执行计划的SQL语句；⑤对得到的SQL语句进行批量测试，找出性能最好的SQL语句。<br />LECCO SQL Expert自动优化实例</p><p>　　假设我们从源代码中抽取出这条SQL语句(也可以通过内带的扫描器或监视器获得SQL语句)：</p><p>　　SELECT COUNT(*)</p><p>　　 FROM EMPLOYEE</p><p>　　swheresEXISTS (SELECT 'X'</p><p>　　 FROM DEPARTMENT</p><p>　　swheresEMP_DEPT=DPT_ID</p><p>　　 AND DPT_NAME LIKE 'AC%')</p><p>　　AND EMP_ID IN (SELECT SAL_EMP_ID</p><p>　　 FROM EMP_SAL_HIST B</p><p>　　swheresSAL_SALARY ＞ 70000) </p><p>　　按下“优化”按钮后，经过10几秒，SQL Expert就完成了优化的过程，并在这10几秒的时间里重写产生了2267 条等价的SQL语句，其中136条SQL语句有不同的执行计划。</p><p>　　接下来，我们可以对自动重写产生的136条SQL语句进行批运行测试，以选出性能最佳的等效SQL语句。按下“批运行” 按钮，在“终止条件” 页选择“最佳运行时间SQL语句”，按“确定”。</p><p>　　经过几分钟的测试运行后，我们可以发现SQL124的运行时间和反应时间最短。运行速度约有22.75倍的提升(源SQL语句运行时间为2.73秒，SQL124运行时间为0.12秒)。现在我们就可以把SQL124放入源代码中，结束一条SQL语句的优化工作了。</p><p>　　“边做边学式训练”提升SQL开发水平</p><p>　　LECCO SQL Expert不仅能够找到最佳的SQL语句，它所提供的“边做边学式训练”还能够教开发人员和数据库管理员如何写出性能最好的SQL语句。LECCO SQL Expert的“SQL比较器”可以标明源SQL和待选SQL间的不同之处。</p><p>　　以上面优化的结果为例，为了查看源SQL语句和SQL124在写法上有什么不同，我们可以按下“比较器” 按钮，对SQL124和源SQL语句进行比较。“SQL 比较器”将SQL124相对于源SQL语句的不同之处以蓝颜色表示了出来。如果选择“双向比较”复选框，“SQL 比较器”可以将两条SQL语句的不同之处以蓝色表示。当然，我们也可以从源语句和重写后的SQL 语句中任选两条进行比较。</p><p>　　从比较的结果可以看到，重写后的SQL124把第一个Exists改写成了In；在字段DPT_ID上进行了合并空字符串的操作，以诱导数据库先执行子查询中的</p><p>　　(SELECT DPT_ID||''</p><p>　　FROM DEPARTMENT</p><p>　　WHERE DPT_NAME LIKE 'AC%')</p><p>　　在子查询完成后，再与EMPLOYEE表进行嵌套循环连接(Nested Loop Join)。</p><p>　　如果觉得对写法的改变难以理解，还可以点中“执行计划”复选框，通过比较两条SQL语句的执行计划的不同，来了解其中的差异。在查看执行计划过程中，如果有什么不明白的地方，可以点中“SQL信息按钮”，再点击执行计划看不明白的地方，LECCO SQL Expert的上下文敏感帮助系统将提供执行计划该处的解释。</p><p>　　在“SQL比较器”中，选中“统计信息”复选框后，可得到详细的两条SQL语句运行时的统计信息比较，这对于学习不同的SQL写法对数据库资源的消耗很有帮助。</p><p>　　LECCO SQL Expert优化模块的特点<br />LECCO SQL Expert优化模块的特点主要表现为：自动优化SQL语句；以独家的人工智能知识库“反馈式搜索引擎”来重写性能优异的SQL语句；找出所有等效的SQL语句及可能的执行计划；保证产生相同的结果；先进的SQL语法分析器能处理最复杂的SQL语句；可以重写SELECT、SELECT INTO、UPDATE、INSERT和DELETE语句；通过测试运行，为<a class="Channel_KeyLink" href="http://www.54iter.com/xueyuan/Index.html"><font color="#002c99">应用</font></a>程序和数据库自动找到性能最好的SQL语句；提供微秒级的计时，能够优化Web<a class="Channel_KeyLink" href="http://www.54iter.com/xueyuan/Index.html"><font color="#002c99">应用</font></a>程序和有大量用户的在线事务处理中运行时间很短的SQL语句；为开发人员提供“边做边学式训练”，迅速提高开发人员的SQL编程技能；提供上下文敏感的执行计划帮助系统和SQL运行状态帮助；不是猜测或建议，而是独一无二的SQL重写解决方案。 </p><p>　　写出专家级的SQL语句</p><p>　　LECCO SQL Expert的出现，使SQL的优化变得极其简单，只要能够写出SQL语句，它就能帮用户找到最好性能的写法。LECCO SQL Expert不仅能在很短的时间内找到所有可能的优化方案，而且能够通过实际测试，确定最有效的优化方案。同以往的数据库优化手段相比较，LECCO SQL Expert将数据库优化技术带到了一个崭新的技术高度，依赖人的经验、耗费大量时间、受人的思维束缚的数据库优化手段已经被高效、省时且准确的自动优化软件所取代了。通过内建的“LECCO小助手”的帮助，即使是SQL的开发新手，也能快速且简单地写出专家级的SQL语句。</p><img src ="http://www.blogjava.net/ASONG/aggbug/86833.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ASONG/" target="_blank">汪松明</a> 2006-12-11 11:21 <a href="http://www.blogjava.net/ASONG/articles/86833.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle10g EM乱码之快速解决</title><link>http://www.blogjava.net/ASONG/articles/85856.html</link><dc:creator>汪松明</dc:creator><author>汪松明</author><pubDate>Wed, 06 Dec 2006 07:20:00 GMT</pubDate><guid>http://www.blogjava.net/ASONG/articles/85856.html</guid><wfw:comment>http://www.blogjava.net/ASONG/comments/85856.html</wfw:comment><comments>http://www.blogjava.net/ASONG/articles/85856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ASONG/comments/commentRss/85856.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ASONG/services/trackbacks/85856.html</trackback:ping><description><![CDATA[
		<p>一直没怎么用10g的EM工具,今天打开来看看,发现也有相传已久的乱码问题.网上也流传着N种解决方案,仔细看一下,其实这个问题很好解决.</p>
		<p>如果安装时,我们系统环境变量设置的是中文环境,那么就不会有这个问题.这个问题根本原因在于安装时,JDK/JRE字符集的自动选择.</p>
		<p>在 $ORACLE_HOME/jdk/jre/lib 和 $ORACLE_HOME/jre/1.4.2/lib/ 目录下都有多种字符集字体配置文件:</p>
		<p> </p>
		<p> </p>
		<table>
				<tbody>
						<tr>
								<td bgcolor="#999999" width="500">
										<pre>[oracle@danaly ~]$ cd $ORACLE_HOME/jdk/jre/lib<br />[oracle@danaly lib]$ ls font*zh_CN*<br />font.properties.zh_CN.Redhat  font.properties.zh_CN.Redhat2.1  <br />font.properties.zh_CN.Sun  font.properties.zh_CN_UTF8.Sun</pre>
										<pre>[oracle@danaly lib]$ cd $ORACLE_HOME/jre/1.4.2/lib/<br />[oracle@danaly lib]$ ls font*zh_CN*<br />font.properties.zh_CN.Redhat  font.properties.zh_CN.Redhat2.1  <br />font.properties.zh_CN.Sun  font.properties.zh_CN_UTF8.Sun </pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>我们只要用合适的中文字符集文件替换缺省文件即可,我选择使用font.properties.zh_CN.Redhat来替换缺省字体定义文件:</p>
		<table>
				<tbody>
						<tr>
								<td bgcolor="#999999" width="500">
										<pre>[oracle@danaly lib]$ cp font.properties.zh_CN.Redhat font.properties </pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>替换之后需要清理一下Cache,重启EM即可.</p>
		<p>Cache路径通常位于:</p>
		<table>
				<tbody>
						<tr>
								<td bgcolor="#999999" width="500">
										<pre>$ORACLE_HOME/oc4j/j2ee/oc4j_applications/applications/em/em/cabo/images/cache/zhs </pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>清除所有gif文件即可.然后重新启动EM:</p>
		<table>
				<tbody>
						<tr>
								<td bgcolor="#999999" width="500">
										<pre>[oracle@danaly zhs]$ emctl stop dbconsole<br />TZ set to PRC<br />Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0  <br />Copyright (c) 1996, 2005 Oracle Corporation.  All rights reserved.<br />http://danaly.hurrray.com.cn:1158/em/console/aboutApplication<br />Stopping Oracle Enterprise Manager 10g Database Control ... <br /> ...  Stopped. <br />[oracle@danaly zhs]$ emctl start dbconsole<br />TZ set to PRC<br />Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0  <br />Copyright (c) 1996, 2005 Oracle Corporation.  All rights reserved.<br />http://danaly.hurrray.com.cn:1158/em/console/aboutApplication<br />Starting Oracle Enterprise Manager 10g Database Control .............. started. <br />------------------------------------------------------------------<br />Logs are generated in directory <br />/opt/oracle/product/10.2.0/danaly.hurrray.com.cn_danaly/sysman/log  </pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>现在登陆Web页面,EM显示就可以正常显示中文了.<br /><img alt="" src="http://www.stcore.com/images/oracle/h000/h19/img200606130707410909.jpg" height="187" width="440" /></p>
<img src ="http://www.blogjava.net/ASONG/aggbug/85856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ASONG/" target="_blank">汪松明</a> 2006-12-06 15:20 <a href="http://www.blogjava.net/ASONG/articles/85856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Linux x86上安装Oracle数据库 10g (3)</title><link>http://www.blogjava.net/ASONG/articles/85853.html</link><dc:creator>汪松明</dc:creator><author>汪松明</author><pubDate>Wed, 06 Dec 2006 07:19:00 GMT</pubDate><guid>http://www.blogjava.net/ASONG/articles/85853.html</guid><wfw:comment>http://www.blogjava.net/ASONG/comments/85853.html</wfw:comment><comments>http://www.blogjava.net/ASONG/articles/85853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ASONG/comments/commentRss/85853.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ASONG/services/trackbacks/85853.html</trackback:ping><description><![CDATA[
		<p style="text-indent: 2em;">指定备份和恢复选项 </p>
		<p style="text-indent: 2em;">选择 Do not enable Automated backups。 </p>
		<p style="text-indent: 2em;">指定数据库模式口令 </p>
		<p style="text-indent: 2em;">选择 Use the same password for all the accounts。 </p>
		<p style="text-indent: 2em;">选择一个口令，然后输入两次进行确认。 </p>
		<p style="text-indent: 2em;">摘要 </p>
		<p style="text-indent: 2em;">显示已安装产品的摘要。 </p>
		<p style="text-indent: 2em;">单击 Install。 </p>
		<p style="text-indent: 2em;">安装 </p>
		<p style="text-indent: 2em;">此屏幕历经安装和链接 Oracle 软件的几个阶段。 </p>
		<p style="text-indent: 2em;">安装过程结束时弹出一个窗口显示配置信息。记下 Enterprise Manager URL，然后单击 OK 关闭该窗口。 </p>
		<p style="text-indent: 2em;">弹出一个“Setup Privileges”窗口，提示需要以 root
用户身份运行配置脚本。以 root 用户身份登录，切换到该窗口中指示的目录，然后执行 root.sh 脚本。该脚本提示输入本地 bin
目录的位置。按 Enter 键接受默认值。当脚本完成时，返回到 Setup Privileges 窗口并单击 OK。（如下所示。） </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<img alt="" src="http://www.itzero.com/uploadfile/200610/20061011100543215.gif" />
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">安装结束 </p>
		<p style="text-indent: 2em;">记下摘要中显示的 URL，并在准备好时单击 Exit。 </p>
		<p style="text-indent: 2em;">恭喜！您的新 Oracle 10g 数据库已经启动并可以使用。 </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<img alt="" src="http://www.itzero.com/uploadfile/200610/20061011100543243.gif" />
		</center>
		<div align="left">
				<p style="text-indent: 2em;">-------------------------------------------------------------------------------- </p>
				<p style="text-indent: 2em;"> </p>
				<p style="text-indent: 2em;">第 4 部分：配置存储 </p>
				<p style="text-indent: 2em;"> </p>
				<p style="text-indent: 2em;">我们在第 3 部分中创建的数据库使用单一文件系统 (/u02/oradata) 进行磁盘存储。但为 Oracle 数据库配置存储的方式有多种。 </p>
				<p style="text-indent: 2em;"> </p>
				<p style="text-indent: 2em;">第 4
部分介绍了为此数据库配置磁盘存储的其他方法。尤其是，它描述了如何创建其他文件系统以及如何使用自动存储管理 (ASM)。如何使用原始设备和
Oracle 集群文件系统 (OCFS) 将在本系列的另一篇文章中介绍，该篇文章介绍了如何使用 Oracle 真正应用集群 (RAC)
创建集群数据库。 </p>
				<p style="text-indent: 2em;"> </p>
				<p style="text-indent: 2em;">文件系统 </p>
				<p style="text-indent: 2em;"> </p>
				<p style="text-indent: 2em;">文件系统是为 Oracle 数据库存储数据文件、重做日志和控制文件最常用的方法。文件系统易于实施，并且无需第三方软件来管理。 </p>
				<p style="text-indent: 2em;"> </p>
				<p style="text-indent: 2em;">大多数情况下，文件系统在 Linux 的初始安装过程中创建。但有时必须在初始安装后（如安装新磁盘驱动器后）创建新文件系统。 </p>
				<p style="text-indent: 2em;"> </p>
				<p style="text-indent: 2em;">本部分介绍了如何构建新文件系统以及如何在 Oracle 数据库中使用它。除非另有说明，否则必须以 root 用户身份运行所有命令。 </p>
				<p style="text-indent: 2em;"> </p>
				<p style="text-indent: 2em;">对磁盘进行分区 </p>
				<p style="text-indent: 2em;"> </p>
				<p style="text-indent: 2em;">必须使用空磁盘分区来创建文件系统。如果已经有一个空的可用磁盘分区，则跳到下一步。 </p>
				<p style="text-indent: 2em;"> </p>
				<p style="text-indent: 2em;">以下是一个为 Linux 文件系统创建新分区的示例。（警告：对磁盘进行错误分区是删除硬盘上所有内容的最可靠、最快捷的方法之一。如果不确定如何分区，请先停下来，找人帮帮您，否则您将冒丢失数据的危险。） </p>
				<p style="text-indent: 2em;"> </p>
				<p style="text-indent: 2em;">此示例使用 /dev/sdb（一个没有分区的空 SCSI 磁盘）为整个磁盘 (36 GB) 创建单个分区。 </p>
				<p style="text-indent: 2em;"> </p>
				<p style="text-indent: 2em;">例如： </p>
				<p style="text-indent: 2em;"> </p>
				<center>
						<ccid_nobr>
						</ccid_nobr>
						<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
								<tbody>
										<tr>
												<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
														<pre>
																<ccid_code>
																</ccid_code># fdisk /dev/sdb<br />Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel<br />Building a new DOS disklabel.Changes will remain in memory only,<br />until you decide to write them.After that, of course, the previous<br />content won't be recoverable.<br /><br /><br />The number of cylinders for this disk is set to 4427.<br />There is nothing wrong with that, but this is larger than 1024,<br />and could in certain setups cause problems with:<br />1) software that runs at boot time (e.g., old versions of LILO)<br />2) booting and partitioning software from other OSs<br />(e.g., DOS FDISK, OS/2 FDISK)<br /><br />Command (m for help):p<br /><br />Disk /dev/sdb:255 heads, 63 sectors, 4427 cylinders<br />Units = cylinders of 16065 * 512 bytes<br /><br />Device Boot    Start       End    Blocks   Id  System<br /><br />Command (m for help):n<br />Command action<br />e   extended<br />p   primary partition (1-4)<br />p<br />Partition number (1-4): 1<br />First cylinder (1-4427, default 1):<br />Using default value 1<br />Last cylinder or +size or +sizeM or +sizeK (1-4427, default 4427):<br />Using default value 4427<br /><br />Command (m for help):w<br />The partition table has been altered!<br /><br />Calling ioctl() to re-read partition table.<br /><br />WARNING:If you have created or modified any DOS 6.x<br />partitions, please see the fdisk manual page for additional<br />information.<br />Syncing disks.</pre>
												</td>
										</tr>
								</tbody>
						</table>
				</center>
		</div>
		<p style="text-indent: 2em;">现在验证新分区： </p>
		<p style="text-indent: 2em;">
				<br />
				<br />
				<br />
				<br />
				<br />
				<br />
				<br />
				<br />
		</p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">例如： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code># fdisk /dev/sdb<br /><br />The number of cylinders for this disk is set to 4427.<br />There is nothing wrong with that, but this is larger than 1024,<br />and could in certain setups cause problems with:<br />1) software that runs at boot time (e.g., old versions of LILO)<br />2) booting and partitioning software from other OSs<br />(e.g., DOS FDISK, OS/2 FDISK)<br /><br />Command (m for help):p<br /><br />Disk /dev/sdb:255 heads, 63 sectors, 4427 cylinders<br />Units = cylinders of 16065 * 512 bytes<br /><br />Device Boot    Start       End    Blocks   Id  System<br />/dev/sdb1             1      4427  35559846   83  Linux</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">Command (m for help):q </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">创建文件系统 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">使用 ext3 创建这个新的文件系统。也可以使用其他文件系统，但 ext3 在系统崩溃时可提供最快的恢复。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">例如： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code># mke2fs -j /dev/sdb1<br />mke2fs 1.26 (3-Feb-2002)<br />Filesystem label=<br />OS type:Linux<br />Block size=4096 (log=2)<br />Fragment size=4096 (log=2)<br />4447744 inodes, 8889961 blocks<br />444498 blocks (5.00%) reserved for the super user<br />First data block=0<br />272 block groups<br />32768 blocks per group, 32768 fragments per group<br />16352 inodes per group<br />Superblock backups stored on blocks:<br />        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632,<br />        2654208, 4096000, 7962624<br /><br />Writing inode tables:done<br />Creating journal (8192 blocks):done<br />Writing superblocks and filesystem accounting information:done<br /><br />This filesystem will be automatically checked every 23 mounts or<br />180 days, whichever comes first.Use tune2fs -c or -i to override.</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">创建挂载点 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">文件系统必须有一个挂载点，它只是一个空的目录，新文件系统在这里与系统目录树“相连”。挂载点的命名应遵循 Oracle 灵活结构 (OFA) 标准。有关 OFA 标准的更多信息，请参阅 Oracle 10g 数据库安装指南 的附录 D。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">由于您已经在第 1 部分中使用了 /u01 和 /u02 目录名称，因此在本示例中使用 /u03。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">例如： </p>
		<p style="text-indent: 2em;"># mkdir /u03 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">将新文件系统添加到 /etc/fstab </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">因此新文件系统将在系统启动时自动挂载，您需要向描述新文件系统及其安装位置的 /etc/fstab 文件中添加一行。使用文本编辑器向 /etc/fstab 中添加如下所示的一行。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">/dev/sdb1 /u03 ext3 defaults 1 1 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">挂载新文件系统 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">文件系统挂载后就可以使用了。只有挂载了文件系统，才能在其中存储文件。使用以下命令挂载文件系统并验证它是否可用。 </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>mount /u03<br />df -h /u03</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">例如： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code># mount /u03<br /># df -h /u03<br />Filesystem            Size  Used Avail Use% Mounted on<br />/dev/sdb1             33G   33M  31G   1%   /u03</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">创建 Oracle 目录并设置权限 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">现在，创建一个用于存放 Oracle 文件的目录。该示例中使用的目录名遵循数据库的 OFA 标准命名惯例，即 ORACLE_SID=demo1。 </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>mkdir -p /u03/oradata/demo1<br />chown -R oracle:oinstall /u03/oradata<br />chmod -R 775 /u03/oradata</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">在新文件系统中创建一个新表空间 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">新文件系统已可以使用。接下来，在文件系统中创建一个用于存储数据库对象的新表空间。以 SYSTEM 用户身份连接到数据库，然后执行 CREATE TABLESPACE 语句，并在新文件系统中指定数据文件。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">例如： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>$ sqlplus<br /><br />SQL*Plus:Release 10.1.0.2.0 - Production on Sun Jun 13 15:01:08 2004<br /><br />Copyright (c) 1982, 2004, Oracle.All rights reserved.<br /><br />Enter user-name:system<br />Enter password:<br /><br />Connected to:<br />Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production<br />With the Partitioning, OLAP and Data Mining options<br /><br />SQL&gt; create tablespace data1<br />2  datafile '/u03/oradata/demo1/data1_01.dbf' size 100M<br />3  extent management local<br />4  segment space management auto;<br /><br />Tablespace created.</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">现在，可以使用此新表空间存储数据库对象，如表和索引。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">例如： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>SQL&gt; create table demotab (id number(5) not null primary key,<br />2  name varchar2(50) not null,<br />3  amount number(9,2))<br />4  tablespace data1;<br /><br />Table created.</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">自动存储管理 (ASM) </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">我把最重要的内容留在了最后。ASM 是 Oracle 数据库 10g
中一个非常出色的新特性，它以平台无关的方式提供了文件系统、逻辑卷管理器以及软件 RAID 等服务。ASM
可以条带化和镜像磁盘，从而实现了在数据库被加载的情况下添加或移除磁盘以及自动平衡 I/O 以删除“热点”。它还支持直接和异步的 I/O 并使用
Oracle9i 中引入的 Oracle 数据管理器 API（简化的 I/O 系统调用接口）。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">ASM 不是一个通用的文件系统，并只能用于 Oracle
数据文件、重做日志以及控制文件。ASM 中的文件既可以由数据库自动创建和命名（通过使用 Oracle 管理文件特性），也可以由 DBA
手动创建和命名。由于操作系统无法访问 ASM 中存储的文件，因此对使用 ASM 文件的数据库执行备份和恢复操作的唯一途径就是通过恢复管理器
(RMAN)。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">ASM 作为单独的 Oracle 实例实施，只有它在运行时其他数据库才能访问它。在 Linux 上，只有运行 OCSSD 服务（由 Oracle 通用安装程序默认安装）才能使用 ASM。ASM 需要的内存不多：对大多数系统，只需 64 MB。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">安装 ASM </p>
		<p style="text-indent: 2em;">在 Linux 平台上，ASM 可以使用原始设备，或通过 ASMLib
接口管理的设备。出于易于使用和性能方面的原因，Oracle 建议在原始设备上使用 ASMLib。ASMLib 现在可以从 OTN
免费下载。本部分逐步讲解使用 ASMLib 配置一个简单 ASM 实例和构建一个使用 ASM 进行磁盘存储的数据库的全过程。 </p>
		<p style="text-indent: 2em;">确定所需的 ASMLib 版本 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">ASMLib 以三个 Linux 程序包组成的程序包集提供： </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">oracleasmlib - ASM 库 </p>
		<p style="text-indent: 2em;">oracleasm-support - 用于管理 ASMLib 的实用程序 </p>
		<p style="text-indent: 2em;">oracleasm - ASM 库的内核模块 </p>
		<p style="text-indent: 2em;">每个 Linux 发行套件都有其自己的 ASMLib 程序包集。在每个发行套件中，每个内核版本都有一个相应的 oracleasm 程序包。以下部分介绍如何确定所需的程序包集。 </p>
		<p style="text-indent: 2em;">首先，以 root 用户身份登录并运行以下命令来确定所使用的内核： </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">uname -rm </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">例如： </p>
		<p style="text-indent: 2em;"># uname -rm </p>
		<p style="text-indent: 2em;">2.4.9-e.27smp i686 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">该示例表明，这是一个使用 Intel i686 CPU 的 SMP（多处理器）系统的 2.4.9 内核。</p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">使用此信息在 OTN 上查找相应的 ASMLib 程序包： </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">将 Web 浏览器指向 http://www.oracle.com/global/cn/technology/tech/linux/asmlib </p>
		<p style="text-indent: 2em;">选择适用于您的 Linux 版本的链接。 </p>
		<p style="text-indent: 2em;">下载适用于您的 Linux 版本的 oracleasmlib 和 oracleasm-support 程序包 </p>
		<p style="text-indent: 2em;">下载与您的内核相对应的 oracleasm 程序包。对于以上示例，下载 oracleasm-2.4.9-e-smp-1.0.0-1.i686.rpm 程序包。 </p>
		<p style="text-indent: 2em;">接下来，通过以 root 用户身份执行以下命令来安装程序包： </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>rpm -Uvh oracleasm-kernel_version-asmlib_version.cpu_type.rpm \<br />oracleasmlib-asmlib_version.cpu_type.rpm \<br />oracleasm-support-asmlib_version.cpu_type.rpm</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">例如：  </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code># rpm -Uvh \<br />&gt; oracleasm-2.4.9-e-smp-1.0.0-1.i686.rpm \<br />&gt; oracleasmlib-1.0.0-1.i386.rpm \<br />&gt; oracleasm-support-1.0.0-1.i386.rpm<br />Preparing...                #################################### [100%]<br />1:oracleasm-support      #################################### [ 33%]<br />2:oracleasm-2.4.9-e-smp  #################################### [ 66%]<br />Linking module oracleasm.o into the module path [  OK  ]<br />3:oracleasmlib           #################################### [100%]</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> 配置 ASMLib </p>
		<p style="text-indent: 2em;">使用 ASMLib 之前，必须运行配置脚本以准备驱动程序。以 root 用户身份运行以下命令，并响应如下示例中所显示的提示。 </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code># /etc/init.d/oracleasm configure<br />Configuring the Oracle ASM library driver.<br /><br />This will configure the on-boot properties of the Oracle ASM library<br />driver.The following questions will determine whether the driver is<br />loaded on boot and what permissions it will have.The current values<br />will be shown in brackets ('[]').Hitting &lt;ENTER&gt; without typing an<br />answer will keep that current value.Ctrl-C will abort.<br /><br />Default user to own the driver interface []:oracle<br />Default group to own the driver interface []:dba<br />Start Oracle ASM library driver on boot (y/n) [n]:y<br />Fix permissions of Oracle ASM disks on boot (y/n) [y]:y<br />Writing Oracle ASM library driver configuration            [  OK  ]<br />Creating /dev/oracleasm mount point                        [  OK  ]<br />Loading module "oracleasm"                                 [  OK  ]<br />Mounting ASMlib driver filesystem                          [  OK  ]<br />Scanning system for ASM disks                              [  OK  ]</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">现在，如下所示启用 ASMLib 驱动程序。 </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code># /etc/init.d/oracleasm enable<br />Writing Oracle ASM library driver configuration            [  OK  ]<br />Scanning system for ASM disks                              [  OK  ]</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">为 ASM 配置磁盘 </p>
		<p style="text-indent: 2em;">接下来，告诉 ASM 驱动程序您要使用的磁盘。请注意，这些磁盘是不包含任何内容（甚至不包含分区）的空磁盘。可以将磁盘分区用于 ASM，但建议您不要这样做。 </p>
		<p style="text-indent: 2em;">通过以 root 用户身份运行以下命令来标记由 ASMLib 使用的磁盘： </p>
		<p style="text-indent: 2em;">/etc/init.d/oracleasm createdisk DISK_NAME device_name </p>
		<p style="text-indent: 2em;">（提示：DISK_NAME 应由大写字母组成。当前版本有一个错误，即如果使用小写字母，ASM 实例将无法识别磁盘。） </p>
		<p style="text-indent: 2em;">例如： </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code># /etc/init.d/oracleasm createdisk VOL1 /dev/sdb<br />Marking disk "/dev/sdb" as an ASM disk                     [  OK  ]<br /># /etc/init.d/oracleasm createdisk VOL2 /dev/sdc<br />Marking disk "/dev/sdc" as an ASM disk                     [  OK  ]<br /># /etc/init.d/oracleasm createdisk VOL3 /dev/sdd<br />Marking disk "/dev/sdd" as an ASM disk                     [  OK  ]<br /># /etc/init.d/oracleasm createdisk VOL4 /dev/sdf<br />Marking disk "/dev/sdf" as an ASM disk                     [  OK  ]<br /># /etc/init.d/oracleasm createdisk VOL5 /dev/sdg<br />Marking disk "/dev/sdg" as an ASM disk                     [  OK  ]<br /># /etc/init.d/oracleasm createdisk VOL6 /dev/sdh<br />Marking disk "/dev/sdh" as an ASM disk                     [  OK  ]</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">以下示例演示了如何列出标记为由 ASMLib 使用的所有磁盘。 </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code># /etc/init.d/oracleasm listdisks<br />VOL1<br />VOL2<br />VOL3<br />VOL4<br />VOL5<br />VOL6</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">既然已经安装了 ASMLib，且已将磁盘标记为可用，下面，您便可以创建一个 ASM 实例，并构建一个使用 ASM 进行磁盘存储的数据库。最容易的方法就是使用数据库配置助手 (DBCA) 来完成此操作。 </p>
		<p style="text-indent: 2em;">以 oracle 身份登录并启动 DBCA： </p>
		<p style="text-indent: 2em;">$ dbca </p>
		<p style="text-indent: 2em;">欢迎 </p>
		<p style="text-indent: 2em;">单击 Next。 </p>
		<p style="text-indent: 2em;">操作 </p>
		<p style="text-indent: 2em;">选择 Create a Database。 </p>
		<p style="text-indent: 2em;">数据库模板 </p>
		<p style="text-indent: 2em;">选择 General Purpose。 </p>
		<p style="text-indent: 2em;">数据库标识 </p>
		<p style="text-indent: 2em;">输入全局数据库名称。 </p>
		<p style="text-indent: 2em;">管理选项 </p>
		<p style="text-indent: 2em;">选择 Configure the Database with Enterprise Manager。 </p>
		<p style="text-indent: 2em;">选择 Use Database Control for Database Management。 </p>
		<p style="text-indent: 2em;">数据库证书 </p>
		<p style="text-indent: 2em;">选择 Use Same Password for All Accounts。 </p>
		<p style="text-indent: 2em;">输入口令并确认。 </p>
		<p style="text-indent: 2em;">存储选项 </p>
		<p style="text-indent: 2em;">选择 Automatic Storage Management (ASM)。 </p>
		<p style="text-indent: 2em;">创建 ASM 实例 </p>
		<p style="text-indent: 2em;">输入 ASM 实例的口令并确认。 </p>
		<p style="text-indent: 2em;">弹出一个窗口，提示 DBCA 将立即创建并启动 ASM 实例。 </p>
		<p style="text-indent: 2em;">单击 OK。 </p>
		<p style="text-indent: 2em;">创建 ASM 实例时弹出一个带齿轮箱窗口。 </p>
		<p style="text-indent: 2em;">ASM 磁盘组 </p>
		<p style="text-indent: 2em;">由于这是新 ASM 实例且您尚未创建任何 ASM 实例，因此该窗口未显示可用磁盘组。 </p>
		<p style="text-indent: 2em;">单击 Create New。 </p>
		<p style="text-indent: 2em;">创建磁盘组 </p>
		<p style="text-indent: 2em;">磁盘组名称 </p>
		<p style="text-indent: 2em;">- 输入磁盘组名称，如 DATA1。 </p>
		<p style="text-indent: 2em;">冗余 </p>
		<p style="text-indent: 2em;">- High 镜像数据两次。 </p>
		<p style="text-indent: 2em;">- Normal 镜像数据一次。 </p>
		<p style="text-indent: 2em;">- External 不镜像 ASM 中的数据。如果外部 RAID 阵列提供冗余，则通常使用此选项。 </p>
		<p style="text-indent: 2em;">选择成员磁盘 </p>
		<p style="text-indent: 2em;">- 您必须手动指示 ASM 到什么地方查找 ASMLib 磁盘，因此，单击 Change Disk Discovery Path </p>
		<p style="text-indent: 2em;">- 弹出一个窗口，提示输入磁盘发现路径。如下所示将磁盘发现路径更改为“ORCL:*”。 </p>
		<p style="text-indent: 2em;">- 单击 OK 继续。 </p>
		<center>
				<img alt="" src="http://www.itzero.com/uploadfile/200610/20061011100544745.gif" />
		</center>
		<p style="text-indent: 2em;">您将返回到 Select Member Disks 窗口。您的所有 ASMLib 磁盘现在应显示在此窗口中。 </p>
		<p style="text-indent: 2em;">单击该行开头的框，选择加入磁盘组的磁盘。完成后单击 OK。 </p>
		<center>
				<img alt="" src="http://www.itzero.com/uploadfile/200610/20061011100545950.gif" />
		</center>
		<p style="text-indent: 2em;">ASM 磁盘组 </p>
		<p style="text-indent: 2em;">您将返回到 ASM Disk Groups 窗口。此时，出现在上一步中创建的磁盘组。 </p>
		<p style="text-indent: 2em;">单击该行开头的框选择此磁盘组。（在此实例中使用单个磁盘组。） </p>
		<p style="text-indent: 2em;">单击 Next。 </p>
		<p style="text-indent: 2em;">数据库文件位置 </p>
		<p style="text-indent: 2em;">选择 Use Oracle-Managed Files。 </p>
		<p style="text-indent: 2em;">确保已将 Database Area 设置为您创建的磁盘组。它包含一个前导加号 — 例如，+DATA1。 </p>
		<p style="text-indent: 2em;">恢复配置 </p>
		<p style="text-indent: 2em;">选择 Specify Flash Recovery Area。 </p>
		<p style="text-indent: 2em;">- 快速恢复区 — 输入要用于快速恢复的 ASM 磁盘组。 </p>
		<p style="text-indent: 2em;">- 快速恢复区大小 — 接受默认值 2048。 </p>
		<p style="text-indent: 2em;">如果要使用归档日志模式，则选中 Enable Archiving。对于评估数据库，可以不选该项。 </p>
		<p style="text-indent: 2em;">数据库内容 </p>
		<p style="text-indent: 2em;">选择 Sample Schemas。 </p>
		<p style="text-indent: 2em;">我们不使用定制脚本，因此单击 Next。 </p>
		<p style="text-indent: 2em;">初始化参数 </p>
		<p style="text-indent: 2em;">接受默认值，然后单击 Next。 </p>
		<p style="text-indent: 2em;">数据库存储 </p>
		<p style="text-indent: 2em;">接受默认值，然后单击 Next。 </p>
		<p style="text-indent: 2em;">创建选项 </p>
		<p style="text-indent: 2em;">选择 Create Database（默认值）并单击 Finish。 </p>
		<p style="text-indent: 2em;">确认 </p>
		<p style="text-indent: 2em;">检查完数据库详细信息后单击 OK。 </p>
		<p style="text-indent: 2em;">DBCA 显示一个操作列表和一个进度条。根据硬件的不同，数据库创建可能需要几分钟到几小时的时间。 </p>
		<p style="text-indent: 2em;">当数据库创建完成时，将显示一个显示摘要窗口。记下 Enterprise Manager URL，然后单击 Exit。  </p>
		<center>
				<img alt="" src="http://www.itzero.com/uploadfile/200610/20061011100545732.gif" />
		</center>
		<p style="text-indent: 2em;">-------------------------------------------------------------------------------- </p>
<img src ="http://www.blogjava.net/ASONG/aggbug/85853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ASONG/" target="_blank">汪松明</a> 2006-12-06 15:19 <a href="http://www.blogjava.net/ASONG/articles/85853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Linux x86上安装Oracle数据库 10g (4)</title><link>http://www.blogjava.net/ASONG/articles/85855.html</link><dc:creator>汪松明</dc:creator><author>汪松明</author><pubDate>Wed, 06 Dec 2006 07:19:00 GMT</pubDate><guid>http://www.blogjava.net/ASONG/articles/85855.html</guid><wfw:comment>http://www.blogjava.net/ASONG/comments/85855.html</wfw:comment><comments>http://www.blogjava.net/ASONG/articles/85855.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ASONG/comments/commentRss/85855.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ASONG/services/trackbacks/85855.html</trackback:ping><description><![CDATA[
		<p style="text-indent: 2em;">结论 </p>
		<p style="text-indent: 2em;">现在，您的数据库已经启动并运行，您可以开始使用 Oracle 10g
中提供的许多新特性。最好从 Oracle Enterprise Manager 开始使用，这是因为它是彻底地重新编写的，采用了基于 Web
的界面。如果不确定从何处开始，Oracle 概念指南 和 DBA 两日速成指南 将帮助您熟悉新数据库。OTN 还提供了一些旨在帮助您充分利用
10g 的文章。我最喜欢的是由 Arup Nanda 编写的系列文章“Oracle 数据库 10g：为 DBA 提供的 20
个最重要的特性。” </p>
		<p style="text-indent: 2em;">在下一篇文章中，我们将逐步讲解如何安装和配置一个功能齐全的双节点 Oracle RAC 10g 数据库。 </p>
		<p style="text-indent: 2em;">-------------------------------------------------------------------------------- </p>
		<p style="text-indent: 2em;">附录 </p>
		<p style="text-indent: 2em;">使用 SQL*Plus 访问数据库 </p>
		<p style="text-indent: 2em;">以 oracle 身份登录到 Linux。设置环境。 </p>
		<p style="text-indent: 2em;">设置 Oracle 环境变量： </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>$ export ORACLE_BASE=/u01/app/oracle<br />$ export ORACLE_SID=demo1<br />$ export ORACLE_HOME=$ORACLE_BASE/product/10.1.0/db_1<br />$ export PATH=$PATH:$ORACLE_HOME/bin</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">运行 SQL*Plus： </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>$ sqlplus<br /><br />SQL*Plus:Release 10.1.0.2.0 - Production on Sat Jun 5 16:59:21 2004<br /><br />Copyright (c) 1982, 2004, Oracle.All rights reserved.<br /><br />Enter user-name:/ as sysdba<br /><br />Connected to:<br />Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production<br />With the Partitioning, OLAP and Data Mining options<br /><br />SQL&gt;</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> 使用 Oracle Enterprise Manager 10g 数据库控制 </p>
		<p style="text-indent: 2em;">在 Web 浏览器中，连接到安装过程中提供的 URL。 </p>
		<p style="text-indent: 2em;">例如： </p>
		<p style="text-indent: 2em;">http://ds1.orademo.org:5500/em（如果服务器不在 DNS 中，则必须使用 IP 地址代替主机名。） </p>
		<p style="text-indent: 2em;">用户名：SYS </p>
		<p style="text-indent: 2em;">口令：&lt;安装过程中选择的口令&gt; </p>
		<p style="text-indent: 2em;">连接为：SYSDBA </p>
		<p style="text-indent: 2em;">单击 </p>
		<center>
				<img alt="" src="http://www.itzero.com/uploadfile/200610/20061011100546320.gif" />
		</center>
		<p style="text-indent: 2em;">欢迎走入 Oracle Enterprise Manager 10g 数据库控制的精彩世界！ </p>
		<p style="text-indent: 2em;">启动和停止 Oracle Enterprise Manager 数据库控制： </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>$ emctl start dbconsole<br />$ emctl stop dbconsole</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> 使用 iSQL*Plus 访问数据库 </p>
		<p style="text-indent: 2em;">iSQL*Plus 是历史悠久的 SQL*Plus 交互式工具的基于 Web
的版本，用于访问数据库。要使用 iSQL*Plus，请单击 OEM 控制台 Related Links 部分中的 iSQL*Plus
链接，或将浏览器指向安装过程中提供的 iSQL*Plus URL。 </p>
		<p style="text-indent: 2em;">例如： </p>
		<p style="text-indent: 2em;">http://ds1.orademo.org:5560/isqlplus（如果数据库服务器不在 DNS 中，则必须使用 IP 地址代替主机名。） </p>
		<p style="text-indent: 2em;"> 用户名：SYSTEM </p>
		<p style="text-indent: 2em;">口令：&lt;安装过程中选择的口令&gt; </p>
		<p style="text-indent: 2em;">单击 <login></login>。 </p>
		<p style="text-indent: 2em;">在 Workspace 框中输入 SQL 命令，然后单击 Execute。  </p>
		<center>
				<img alt="" src="http://www.itzero.com/uploadfile/200610/20061011100546287.gif" />
		</center>
		<p style="text-indent: 2em;">启动和停止 iSQL*Plus： </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>$ isqlplusctl start<br />$ isqlplusctl stop</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">启动和停止监听器： </p>
		<p style="text-indent: 2em;">监听器接受客户端的连接请求，并在验证证书后创建数据库连接。要使用 OEM 或 iSQL*Plus，必须先启动监听器。 </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>$ lsnrctl start<br />$ lsnrctl stop</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">启动和停止数据库： </p>
		<p style="text-indent: 2em;">启动和停止数据库的最简单方法是从 OEM 控制台启动和停止。要从命令行执行此操作，请在以 oracle 身份登录后使用 SQL*Plus，如下所示： </p>
		<p style="text-indent: 2em;">启动： </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>$ sqlplus<br /><br />SQL*Plus:Release 10.1.0.2.0 - Production on Sun Jun 13 22:27:48 2004<br /><br />Copyright (c) 1982, 2004, Oracle.All rights reserved.<br /><br />Enter user-name:/ as sysdba<br />Connected to an idle instance.<br /><br />SQL&gt; startup<br />ORACLE instance started.<br /><br />Total System Global Area  188743680 bytes<br />Fixed Size                   778036 bytes<br />Variable Size             162275532 bytes<br />Database Buffers           25165824 bytes<br />Redo Buffers                 524288 bytes<br />Database mounted.<br />Database opened.<br />SQL&gt; exit<br /><br />Shutdown:<br /><br />$ sqlplus<br /><br />SQL*Plus:Release 10.1.0.2.0 - Production on Sun Jun 13 22:25:55 2004<br /><br />Copyright (c) 1982, 2004, Oracle.All rights reserved.<br /><br />Enter user-name:/ as sysdba<br /><br />Connected to:<br />Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production<br />With the Partitioning, OLAP and Data Mining options<br /><br />SQL&gt; shutdown immediate<br />Database closed.<br />Database dismounted.<br />ORACLE instance shut down.<br />SQL&gt; exit</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">列出 Oracle 进程： </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>$ ps a€“fuoracle</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">什么是 ocssd.bin 进程？ </p>
		<p style="text-indent: 2em;">Oracle 集群同步服务 (OCSSD) 是 Oracle 集群就绪服务
(CRS) 的一个组件，用于 RAC 和使用 ASM 的单个实例数据库。它在默认情况下安装，使用很少的系统资源，并在 /etc/inittab
中进行配置。这些进程在系统每次启动时自动启动。Oracle 建议不要禁用 OCSSD，即使您未运行 ASM。  </p>
		<p style="text-indent: 2em;">-------------------------------------------------------------------------------- </p>
		<p style="text-indent: 2em;">John Smiley (smileyj@tusc.com) 是 TUSC Inc
的一位技术管理顾问。作为 DBA、开发人员和项目经理，他具有 18 年的 Oracle 系统使用经验。他专门从事高级性能调整、Oracle
真正应用集群、PL/SQL 编程、容量规划以及与 UNIX 有关的逻辑和物理数据库设计。 </p>
		<br />
<img src ="http://www.blogjava.net/ASONG/aggbug/85855.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ASONG/" target="_blank">汪松明</a> 2006-12-06 15:19 <a href="http://www.blogjava.net/ASONG/articles/85855.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Linux x86上安装Oracle数据库 10g (2)</title><link>http://www.blogjava.net/ASONG/articles/85852.html</link><dc:creator>汪松明</dc:creator><author>汪松明</author><pubDate>Wed, 06 Dec 2006 07:18:00 GMT</pubDate><guid>http://www.blogjava.net/ASONG/articles/85852.html</guid><wfw:comment>http://www.blogjava.net/ASONG/comments/85852.html</wfw:comment><comments>http://www.blogjava.net/ASONG/articles/85852.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ASONG/comments/commentRss/85852.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ASONG/services/trackbacks/85852.html</trackback:ping><description><![CDATA[
		<p style="text-indent: 2em;">选择 Shutdown。 </p>
		<p style="text-indent: 2em;">选择 Restart computer。 </p>
		<p style="text-indent: 2em;">输入 root 口令。 </p>
		<p style="text-indent: 2em;">单击 OK。 </p>
		<p style="text-indent: 2em;">恭喜！您的 Linux 软件现已安装完毕。 </p>
		<p style="text-indent: 2em;">验证您的安装 </p>
		<p style="text-indent: 2em;">如果完成了以上步骤，您应该具备 Oracle 10g 所需的所有程序包和更新。您可以执行以下步骤验证您的安装。 </p>
		<p style="text-indent: 2em;">
				<br />
				<br />
				<br />
				<br />
				<br />
				<br />
		</p>
		<p style="text-indent: 2em;">所需内核版本：2.4.21-138（或更高版本） </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">通过运行以下命令检查内核版本： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>uname -r</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">例如： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code># uname -r<br />k_smp-2.4.21-138</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">其他所需程序包的版本（或更高版本）： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>gcc-3.2.2-38 <br />make-3.79 <br />binutils-2.12 <br />openmotif-2.2.2-124</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">要查看系统上安装了这些程序包的哪些版本，以 root 用户身份运行以下命令： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>rpm -q gcc make binutils openmotif</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">例如： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code># rpm rpm -q gcc make binutils openmotif<br />gcc-3.2.2-38<br />make-3.79.1-407<br />binutils-2.12.90.0.15-50<br />openmotif-2.2.2-124</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">如果系统上缺少任何程序包版本，或版本比以上指定的版本旧，则可以从 SUSE Linux Portal 下载和安装更新。 </p>
		<p style="text-indent: 2em;">-------------------------------------------------------------------------------- </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">第 2 部分：针对 Oracle 配置 Linux </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">Linux 软件现已安装完毕，您需要针对 Oracle 对其进行配置。本部分将逐步讲解针对 Oracle 数据库 10g 配置 Linux 的过程。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">验证系统要求 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">要验证系统是否满足 Oracle 10g 数据库的最低要求，以 root 用户身份登录并运行以下命令。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">要查看可用 RAM 和交换空间大小，运行以下命令： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>grep MemTotal /proc/meminfo<br />grep SwapTotal /proc/meminfo</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">例如： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code># grep MemTotal /proc/meminfo<br />MemTotal:512236 kB<br /># grep SwapTotal /proc/meminfo<br />SwapTotal:1574360 kB</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">所需最小 RAM 为 512MB，而所需最小交换空间为 1GB。对于 RAM 小于或等于 2GB 的系统，交换空间应为 RAM 数量的两倍；对于 RAM 大于 2GB 的系统，交换空间应为 RAM 数量的一到两倍。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">Oracle 10g 软件还需要 2.5GB 的可用磁盘空间，而数据库则另需 1.2GB 的可用磁盘空间。/tmp 目录至少需要 400MB 的可用空间。要检查系统上的可用磁盘空间，运行以下命令： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>df -h</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">例如： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code># df -h<br />Filesystem        Size  Used Avail Use% Mounted on<br />/dev/sda3         6.8G  1.3G  5.2G  20% /<br />/dev/sda1         99M   17M   77M  18% /boot</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">该示例表明，/tmp 目录没有自己的文件系统。（对本指南而言，它是根文件系统的一部分。）根文件系统可用空间为 5.2 GB，除了满足安装 (2.5 + 1.2 + 0.4 = 4.1GB) 外还小有富余。 </p>
		<p style="text-indent: 2em;">创建 Oracle 组和用户帐户 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">接下来，创建用于安装和维护 Oracle 10g 软件的 Linux 组和用户帐户。用户帐户将称为 oracle，而组将称为 oinstall 和 dba。以 root 用户身份执行以下命令：<br /><br /><br /><br /><br /><br /><br /></p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>/usr/sbin/groupadd oinstall<br />/usr/sbin/groupadd dba<br />/usr/sbin/useradd -m -g oinstall -G dba oracle<br />id oracle</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">例如： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code># /usr/sbin/groupadd oinstall<br /># /usr/sbin/groupadd dba<br /># /usr/sbin/useradd -m -g oinstall -G dba oracle<br /># id oracle<br />uid=501(oracle) gid=501(oinstall) groups=501(oinstall),502(dba)</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">设置 oracle 帐户的口令： </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>passwd oracle</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">例如： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code># passwd oracle<br />Changing password for user oracle.<br />New password:<br />Retype new password:<br />passwd:all authentication tokens updated successfully.</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">创建目录 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">现在，创建存储 Oracle 10g 软件和数据库文件的目录。本指南在创建目录结构时所用的命名惯例符合最佳灵活结构 (OFA) 规范。有关 OFA 标准的更多信息，请参阅针对 UNIX 系统的 Oracle 数据库 10g 安装指南 的附录 D。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">以下假设在根文件系统中创建目录。这样做是为了简便起见，不建议将其作为通用做法。这些目录通常被创建为单独的文件系统。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">以 root 用户身份执行以下命令： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>mkdir -p /u01/app/oracle<br />mkdir -p /u02/oradata<br />chown -R oracle:oinstall /u01/app/oracle /u02/oradata<br />chmod -R 775 /u01/app/oracle /u02/oradata</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">例如： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code># mkdir -p /u01/app/oracle<br /># mkdir -p /u02/oradata<br /># chown -R oracle:oinstall /u01/app/oracle /u02/oradata<br /># chmod -R 775 /u01/app/oracle /u02/oradata</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">配置 Linux 内核参数 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">Linux 内核非常出色。与大多数其他 *NIX 系统不同，Linux
允许在系统启动和运行时修改大多数内核参数。完成内核参数更改后不必重新启动系统。Oracle 数据库 10g
需要以下所示的内核参数设置。其中给出的是最小值，因此如果您的系统使用的值较大，则不要更改它。<br /><br /><br /></p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>kernel.shmall = 2097152<br />kernel.shmmax = 2147483648<br />kernel.shmmni = 4096<br />kernel.sem = 250 32000 100 128<br />fs.file-max = 65536<br />net.ipv4.ip_local_port_range = 1024 65000</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">如果您按照以上说明安装了 Linux，且内核参数全部采用默认值，则只需在以 root 用户身份登录后执行下命令。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>cat &gt;&gt; /etc/sysctl.conf &lt;&lt;EOF<br />kernel.shmall = 2097152<br />kernel.shmmax = 2147483648<br />kernel.shmmni = 4096<br />kernel.sem = 250 32000 100 128<br />fs.file-max = 65536<br />net.ipv4.ip_local_port_range = 1024 65000<br />EOF<br />/sbin/sysctl -p</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">例如： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code># cat &gt;&gt; /etc/sysctl.conf &lt;&lt;EOF<br />&gt; kernel.shmall = 2097152<br />&gt; kernel.shmmax = 2147483648<br />&gt; kernel.shmmni = 4096<br />&gt; kernel.sem = 250 32000 100 128<br />&gt; fs.file-max = 65536<br />&gt; net.ipv4.ip_local_port_range = 1024 65000<br />&gt; EOF<br /># /sbin/sysctl -p<br />net.ipv4.ip_forward = 0<br />net.ipv4.conf.default.rp_filter = 1<br />kernel.sysrq = 0<br />kernel.shmall = 2097152<br />kernel.shmmax = 2147483648<br />kernel.shmmni = 4096<br />kernel.sem = 250 32000 100 128<br />fs.file-max = 65536<br />net.ipv4.ip_local_port_range = 1024 65000</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">以 root 用户身份运行以下命令来验证您的设置： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>/sbin/sysctl -a | grep shm<br />/sbin/sysctl -a | grep sem<br />/sbin/sysctl -a | grep file-max<br />/sbin/sysctl -a | grep ip_local_port_range</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">例如： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code># /sbin/sysctl -a | grep shm<br />kernel.shmmni = 4096<br />kernel.shmall = 2097152<br />kernel.shmmax = 2147483648<br />kernel.shm-use-bigpages = 0<br /># /sbin/sysctl -a | grep sem<br />kernel.sem = 250        32000   100     128<br /># /sbin/sysctl -a | grep file-max<br />fs.file-max = 65536<br /># /sbin/sysctl -a | grep ip_local_port_range<br />net.ipv4.ip_local_port_range = 1024     65000</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">如果系统的参数设置的比上述参数值小，则编辑 /etc/sysctl.conf 文件，添加或更改这些参数。完成后，运行以下命令激活更改： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>/sbin/sysctl -p</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">对于 SLES 8，在完成以上步骤后运行以下命令。 </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>/sbin/chkconfig boot.sysctl on</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">为 oracle 用户设置 Shell 限制 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">Oracle 建议对每个 Linux 帐户可以使用的进程数和打开的文件数设置限制。要进行这些更改，以 root 用户的身份执行下列命令：<br /><br /><br /><br /><br /></p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>cat &gt;&gt; /etc/security/limits.conf &lt;&lt;EOF<br />oracle               soft    nproc   2047<br />oracle               hard    nproc   16384<br />oracle               soft    nofile  1024<br />oracle               hard    nofile  65536<br />EOF<br /><br />cat &gt;&gt; /etc/pam.d/login &lt;&lt;EOF<br />session    required     /lib/security/pam_limits.so<br />EOF</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">对于 RHEL 2.1 和 RHEL 3，使用以下命令： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>cat &gt;&gt; /etc/profile &lt;&lt;EOF<br />if [ \$USER = "oracle" ]; then  <br />if [ \$SHELL = "/bin/ksh" ]; then<br />ulimit -p 16384<br />ulimit -n 65536<br />else<br />ulimit -u 16384 -n 65536<br />fi<br />umask 022<br />fi<br />EOF<br /><br />cat &gt;&gt; /etc/csh.login &lt;&lt;EOF<br />if ( \$USER == "oracle" ) then<br />limit maxproc 16384<br />limit descriptors 65536<br />umask 022<br />endif<br />EOF</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">对于 SLES 8，使用以下命令： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>cat &gt;&gt; /etc/profile.local &lt;&lt;EOF<br />if [ \$USER = "oracle" ]; then  <br />if [ \$SHELL = "/bin/ksh" ]; then<br />ulimit -p 16384<br />ulimit -n 65536<br />else<br />ulimit -u 16384 -n 65536<br />fi<br />umask 022<br />fi<br />EOF<br /><br />cat &gt;&gt; /etc/csh.login.local &lt;&lt;EOF<br />if ( \$USER == "oracle" ) then<br />limit maxproc 16384<br />limit descriptors 65536<br />umask 022<br />endif<br />EOF</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">避免错误！（仅限 SLES 8） </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">在 SLES 8 上安装 Oracle Enterprise Manager 10g
时存在一个错误 — 由于所需端口以为 /etc/services 所保留而导致安装失败。OEM DBConsole 需要端口 1830，而在
SLES8 环境中，此端口已经为 /etc/services 所保留。此错误在 MetaLink 上的错误号为 3513603。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">要避免安装过程中出现问题，以 root 用户身份登录，并在安装 Oracle 10g 软件之前将 /etc/services 文件中的端口 1830 至 1849 对应的行注释掉。（注意：此时，您最好重新启动服务器以确保以上更改生效。） </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">oracle 用户的环境变量 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">要使用 Oracle 产品，应该或必须设置几个环境变量。对于数据库服务器，建议设置以下环境变量： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>ORACLE_BASE<br />ORACLE_HOME<br />ORACLE_SID<br />PATH</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">如果您在同一服务器上安装了多个 Oracle 产品或数据库，则
ORACLE_HOME、ORACLE_SID 和 PATH 变量可能会更改。ORACLE_BASE
变量不应更改，并可以在需要时在您的登录配置文件中设置它。Oracle 提供了一个称作 oraenv 的实用程序来设置其他变量。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">以 oracle 身份登录，并通过在 .bash_profile 或 .profile（bash 或 ksh）中添加以下行，将 ORACLE_BASE 添加到登录配置文件： </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">或在 .login (csh) 中添加以下行： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>setenv ORACLE_BASE /u01/app/oracle</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">此更改将在您下次登录到 oracle 帐户时生效。要使更改对当前会话为活动状态，只需从命令行运行此命令。 </p>
		<p style="text-indent: 2em;">-------------------------------------------------------------------------------- </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">第 3 部分：安装 Oracle </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">可以从 OTN 下载 Oracle 数据库 10g。Oracle 提供了一个免费的开发和测试许可。但不提供支持，且该许可不允许用于生产目的。OTN 提供了完整的许可协议。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">要使 Oracle 10g 发行套件介质可以在服务器上使用，最简单的方法是将其直接下载到服务器。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">使用图形登录以 oracle 身份登录。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">创建一个目录以存放 Oracle 10g 发行套件： </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">mkdir 10g_db </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">要从 OTN 下载 Oracle 数据库 10g，请将浏览器（Mozilla
比较好用）指向
http://www.oracle.com/technology/software/products/database/oracle10g/htdocs/linuxsoft.html。
填写 Eligibility Export Restrictions 页面，并阅读 OTN 许可协议。如果您接受限制和许可协议，则单击 I
Accept。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">单击 ship.db.cpio.gz 链接，并将该文件保存在为此目的创建的目录 (10g_db) 中 — 如果尚未登录到 OTN，则此时可能提示您登录。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">解压缩此文件： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>cd 10g_db<br />gunzip ship.db.cpio.gz<br />cpio -idmv &lt; ship.db.cpio</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">安装软件 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">使用 oracle 帐户登录。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">指定数据库名称 (ORACLE_SID)。该名称通常不多于五个字符。对此安装使用 demo1。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">设置环境变量： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>Borne shell 和 Korn shell<br /><br />ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE<br />ORACLE_SID=demo1; export ORACLE_SID<br /><br />C shell<br /><br />setenv ORACLE_BASE /u01/app/oracle<br />setenv ORACLE_SID demo1</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">将目录更改为 Oracle 10g 软件解压缩到的位置。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">例如： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>$ cd $HOME/10g_db</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">将目录更改为 Disk1。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">例如： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>$ cd Disk1</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">启动 Oracle 通用安装程序。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>$ ./runInstaller</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">欢迎 </p>
		<p style="text-indent: 2em;">单击 Next。 </p>
		<p style="text-indent: 2em;">指定清单目录和证书 </p>
		<p style="text-indent: 2em;">如果您一直在依循本指南中的步骤，则使用默认值即可。否则，编辑清单目录的路径，以指向正确目录。 </p>
		<p style="text-indent: 2em;">操作系统组名称应为 oinstall。 </p>
		<p style="text-indent: 2em;">如果这是首次在此机器上安装 Oracle，则您将收到一个弹出窗口，提示需要以 root 用户身份运行 orainstRoot.sh 脚本。以 root 用户身份登录，更改到窗口中指定的目录，执行该脚本，然后继续操作。 </p>
		<p style="text-indent: 2em;">指定文件位置 </p>
		<p style="text-indent: 2em;">如果您一直在依循本指南中的步骤，则使用默认值即可。否则，在继续操作前确保源路径和目标路径正确。 </p>
		<p style="text-indent: 2em;">选择安装类型 </p>
		<p style="text-indent: 2em;">接受默认值 Enterprise Edition。 </p>
		<p style="text-indent: 2em;">与特定产品相关的先决条件的检查 </p>
		<p style="text-indent: 2em;">如果您一直在依循本指南中的步骤，则所有检查都应顺利通过。如果一个或多个检查失败，则在继续操作前纠正该问题。 </p>
		<p style="text-indent: 2em;">选择数据库配置 </p>
		<p style="text-indent: 2em;">接受默认值 Create a starter database 和 General Purpose。 </p>
		<p style="text-indent: 2em;">指定数据库配置选项 </p>
		<p style="text-indent: 2em;">输入数据库的全局数据库名称。该名称应包含 ORACLE_SID 和服务器域名（例如，demo1.orademo.org，其中 demo1 是 ORACLE_SID，orademo.org 是域名）。 </p>
		<p style="text-indent: 2em;">输入全局数据库名称时，SID 框将自动填充。 </p>
		<p style="text-indent: 2em;">接受默认的数据库字符集。 </p>
		<p style="text-indent: 2em;">选择 Create database with sample schemas。 </p>
		<p style="text-indent: 2em;">选择数据库管理选项 </p>
		<p style="text-indent: 2em;">选择 Use Database Control for Database Management。 </p>
		<p style="text-indent: 2em;">指定数据库文件存储选项 </p>
		<p style="text-indent: 2em;">选择 File System，然后输入数据库文件要使用的路径名（在本例中为 /u02/oradata）。</p>
<img src ="http://www.blogjava.net/ASONG/aggbug/85852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ASONG/" target="_blank">汪松明</a> 2006-12-06 15:18 <a href="http://www.blogjava.net/ASONG/articles/85852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Linux x86上安装Oracle数据库 10g (1)</title><link>http://www.blogjava.net/ASONG/articles/85851.html</link><dc:creator>汪松明</dc:creator><author>汪松明</author><pubDate>Wed, 06 Dec 2006 07:17:00 GMT</pubDate><guid>http://www.blogjava.net/ASONG/articles/85851.html</guid><wfw:comment>http://www.blogjava.net/ASONG/comments/85851.html</wfw:comment><comments>http://www.blogjava.net/ASONG/articles/85851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ASONG/comments/commentRss/85851.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ASONG/services/trackbacks/85851.html</trackback:ping><description><![CDATA[
		<p style="text-indent: 2em;">概述 </p>
		<p style="text-indent: 2em;">这是在 Linux 上安装 Oracle 10g
软件主要组件指南系列的第一部分。这些文章详细介绍了 Linux 的所有三个已认证的英语发行套件（未介绍 Asianux），并假设使用廉价的
Intel x86 硬件。同时，还逐步演示了为评估主要 Oracle 10g 产品而在常见硬件上进行安装和配置的过程。  </p>
		<p style="text-indent: 2em;">该系列的根本目标是逐步演示如何安装和配置 10g
网格的所有组件。通过这个系列，您将了解如何安装和配置单实例 Oracle 10g 数据库（本文）、双节点 Oracle RAC 10g
数据库、Oracle 应用服务器 10g 和 Oracle Enterprise Manager 10g 网格控制的所有主要组件。 </p>
		<p style="text-indent: 2em;">该系列提供的方法将采用最简单的途径（步骤数最少）来完成任务。该方法通常意味着所选择的配置将只适用于评估。因此，该系列既不适用于构建生产品质的环境，也不反映最佳实践。  </p>
		<p style="text-indent: 2em;">以下是这些文章所介绍的获得 Oracle 10g 认证的三个 Linux 发行套件：  </p>
		<p style="text-indent: 2em;">Red Hat Enterprise Linux 2.1 </p>
		<p style="text-indent: 2em;">Red Hat Enterprise Linux 3 </p>
		<p style="text-indent: 2em;">Novell SUSE Linux Enterprise Server 8 </p>
		<p style="text-indent: 2em;">如果您是初次接触 Linux 和/或 Oracle，那这第一篇文章特适合您。它首先介绍基础知识，然后逐步演示如何从头安装 Oracle 数据库 10g。 </p>
		<p style="text-indent: 2em;">本文由四部分组成：第 1 部分介绍了如何安装 Linux 操作系统，第 2
部分介绍了如何针对 Oracle 配置 Linux，第 3 部分介绍了 Oracle 数据库安装的要点，第 4
部分介绍了如何创建其他文件系统并介绍了自动存储管理 (ASM)（Oracle 数据库 10g
中一个出色的新特性，它显著简化了存储管理）。附录提供了帮助您了解新数据库用法的信息，其中包括如何交互地访问该数据库、如何停止和启动数据库及相关服</p>
		<p style="text-indent: 2em;">-------------------------------------------------------------------------------- </p>
		<p style="text-indent: 2em;">第 1 部分：安装 Linux </p>
		<p style="text-indent: 2em;">本指南采用具有以下硬件配置的服务器： </p>
		<p style="text-indent: 2em;">两个 800MHz Pentium III CPU </p>
		<p style="text-indent: 2em;">512MB RAM </p>
		<p style="text-indent: 2em;">两个 SCSI 主机适配器 (Ultra SCSI 160) </p>
		<p style="text-indent: 2em;">八个 SCSI 磁盘驱动器 (2 x 9GB + 6 x 36GB) </p>
		<p style="text-indent: 2em;">一个 100Base-T 以太网适配器 </p>
		<p style="text-indent: 2em;">一个 1000Base-T 以太网适配器 </p>
		<p style="text-indent: 2em;">对磁盘进行配置，使每个 SCSI 主机适配器连接到一个 9GB 磁盘和三个 36GB 磁盘。 </p>
		<p style="text-indent: 2em;">请注意，尽管这根本算不上是一个“强大”的设置，但即便是使用再低的设置也可以完成本指南介绍的大部分任务。基本数据库安装只需要一个 CPU、512MB 内存和一个可用空间至少为 6.5GB 的磁盘驱动器（IDE、SCSI 或 FireWire）。 </p>
		<p style="text-indent: 2em;">现在，我们将逐步演示在服务器上安装 Linux 操作系统的过程。本文假设进行 Linux 系统全新安装（有别于升级），并假设服务器为 Oracle 所专用，且服务器上没有其他操作系统或数据。 </p>
		<p style="text-indent: 2em;">Red Hat Enterprise Linux 2.1 </p>
		<p style="text-indent: 2em;">Oracle 10g 经认证可以在 Red Hat Enterprise Linux
2.1（Advanced Server 和 Enterprise Server）(Update 3) 或更高版本上运行。Red Hat
Network (RHN) 提供更新，这些更新可以作为用于创建 CD 的 ISO 文件或作为单个程序包更新下载。 </p>
		<p style="text-indent: 2em;">要对全新 Linux 安装应用更新，最简单、最快速的方法是使用更新 CD 执行安装。如果 Linux 已经安装或 CD 上没有更新，则可以通过 RHN 应用这些更新。由于本指南针对的是全新 Linux 安装，因此您将使用更新 CD。 </p>
		<p style="text-indent: 2em;">使用更新 CD 集中的第一张 CD 启动服务器。 </p>
		<p style="text-indent: 2em;">您可能需要更改 BIOS 设置，以允许从 CD 启动。 </p>
		<p style="text-indent: 2em;">启动屏幕上出现时在底部显示 boot:。 </p>
		<p style="text-indent: 2em;">选择 Enter，从控制台上执行图形安装。（对于其他安装方法和选项，请参阅 Red Hat 安装指南。） </p>
		<p style="text-indent: 2em;">安装程序扫描硬件，短暂显示 Red Hat 闪屏，然后开始显示一系列屏幕提示。 </p>
		<p style="text-indent: 2em;">选择语言 </p>
		<p style="text-indent: 2em;">接受默认值。 </p>
		<p style="text-indent: 2em;">配置键盘 </p>
		<p style="text-indent: 2em;">接受默认值。 </p>
		<p style="text-indent: 2em;">配置鼠标 </p>
		<p style="text-indent: 2em;">接受默认值。 </p>
		<p style="text-indent: 2em;">安装类型 </p>
		<p style="text-indent: 2em;">接受默认值。 </p>
		<p style="text-indent: 2em;">设置磁盘分区 </p>
		<p style="text-indent: 2em;">本文不介绍磁盘分区的详细方法，而是假设您熟悉磁盘分区方法。 </p>
		<p style="text-indent: 2em;">（警告：对磁盘进行错误分区是删除硬盘上所有内容的最可靠、最快捷的方法之一。如果不确定如何分区，请先停下来，找人帮帮您，否则您将冒丢失数据的危险！） </p>
		<p style="text-indent: 2em;">本文使用以下分区方案（文件系统均为 ext3）： </p>
		<p style="text-indent: 2em;">第一个控制器 (/dev/sda) 上的 9GB 磁盘包含以下分区，用于存放所有 Linux 和 Oracle 软件： </p>
		<p style="text-indent: 2em;">- 100MB /boot 分区（对于 RHEL 2.1，最小为 50MB） </p>
		<p style="text-indent: 2em;">-1,500MB 交换分区 — 将此分区大小至少设置为系统 RAM 的两倍，但不要超过 2GB（32 位系统不支持大于 2GB 的交换文件）。如果需要大于 2GB 的交换空间，则创建多个交换分区。 </p>
		<p style="text-indent: 2em;">-7,150MB 根分区 — 该分区将用于所有目录，包括 /usr、/tmp、/var、/opt、/home 等。这样做纯粹是为了讲解本指南而简化安装。更可靠的分区方案是将这些目录划分到单独的文件系统。 </p>
		<p style="text-indent: 2em;">配置启动加载程序 </p>
		<p style="text-indent: 2em;">接受默认值。 </p>
		<p style="text-indent: 2em;">配置启动加载程序口令 </p>
		<p style="text-indent: 2em;">如果要为 GRUB 设置口令，请在此处输入。对于评估系统，无需设置该项。 </p>
		<p style="text-indent: 2em;">配置网络 </p>
		<p style="text-indent: 2em;">通常情况下，最好使用静态 IP 地址配置数据库服务器。为此，取消选中 Configure using DHCP 并输入服务器的网络配置。确保输入了主机名且已选中 Activate on boot。 </p>
		<p style="text-indent: 2em;">配置防火墙 </p>
		<p style="text-indent: 2em;">出于本演示的需要，将不配置防火墙。选择 No firewall（安全管理员，请不要生气）。 </p>
		<p style="text-indent: 2em;">其他语言支持 </p>
		<p style="text-indent: 2em;">接受默认值。 </p>
		<p style="text-indent: 2em;">选择时区 </p>
		<p style="text-indent: 2em;">选择适合您区域的时间设置。将系统时钟设置为 UTC 对服务器而言通常是一个很好的做法。为此，单击 System clock uses UTC。 </p>
		<p style="text-indent: 2em;">配置帐户 </p>
		<p style="text-indent: 2em;">为 root 用户选择一个口令，并将其输入所给的域中。为自己创建一个帐户。（不要在此时创建 oracle 帐户；我们将在稍后创建它。） </p>
		<p style="text-indent: 2em;">选择程序包组 </p>
		<p style="text-indent: 2em;">选择 Gnome 或 KDE（或两者都选择）图形用户界面（默认为
Gnome）。注意：这两个 GUI 都非常受欢迎，其中 Gnome 在美国使用更普遍。我个人偏爱
KDE，这是因为它的终端模拟器可轻松实现剪切和粘贴，从而可将输入复制到多个连接（例如，当您在多个节点上配置 RAC 时，这将节省键入操作）。 </p>
		<p style="text-indent: 2em;">选择 Software Development </p>
		<p style="text-indent: 2em;">未解决的相关性 </p>
		<p style="text-indent: 2em;">如果看到此屏幕，只需选择 Install packages to satisfy dependencies（默认值）并继续操作。 </p>
		<p style="text-indent: 2em;">配置图形界面 (X) </p>
		<p style="text-indent: 2em;">接受默认值，除非安装程序无法识别您的视频卡。如果您的视频卡无法被识别，则将无法继续操作。 </p>
		<p style="text-indent: 2em;">准备安装 </p>
		<p style="text-indent: 2em;">单击 Next </p>
		<p style="text-indent: 2em;">安装程序包 </p>
		<p style="text-indent: 2em;">软件将被复制到硬盘并被安装。根据提示更改磁盘，然后在安装完成时单击 Next。 </p>
		<p style="text-indent: 2em;">创建启动磁盘 </p>
		<p style="text-indent: 2em;">如果需要，创建一张启动磁盘，或选择 Skip boot disk creation。 </p>
		<p style="text-indent: 2em;">配置监视器 </p>
		<p style="text-indent: 2em;">如果安装程序正确识别了您的监视器，则接受默认值。否则，从列表中选择一个兼容的监视器。 </p>
		<p style="text-indent: 2em;">恭喜 </p>
		<p style="text-indent: 2em;">从系统中取出安装介质，然后单击 Next。 </p>
		<p style="text-indent: 2em;">系统自动重新启动，并显示一个图形登录屏幕。如果您是使用基本产品 CD 而非更新 CD 执行的安装，则在继续操作前必须通过 RHN 应用更新。 </p>
		<p style="text-indent: 2em;">验证您的安装 </p>
		<p style="text-indent: 2em;">如果完成了以上步骤，您应该具备 Oracle 10g 所需的所有程序包和更新。您可以执行以下步骤验证您的安装。 <br /><br />　　所需内核版本：2.4.9-e.25（或更高版本）  </p>
		<p style="text-indent: 2em;">通过运行以下命令检查内核版本： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>uname -r</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">例如： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code># uname -r<br />2.4.9-e.27smp</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">其他所需程序包的版本（或更高版本）： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>gcc-2.96-124 <br />make-3.79 <br />binutils-2.11 <br />openmotif-2.1.30-11 <br />glibc-2.2.4-31</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">要查看系统上安装了这些程序包的哪些版本，运行以下命令： </p>
		<p style="text-indent: 2em;"> </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>rpm -q gcc make binutils openmotif glibc</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">例如： </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code># rpm -q gcc make binutils openmotif glibc<br />gcc-2.96-118.7.2<br />make-3.79.1-8<br />binutils-2.11.90.0.8-12<br />openmotif-2.1.30-11<br />glibc-2.2.4-32.8</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">如果系统上缺少任何程序包版本，或版本比以上指定的版本旧，则可以从 Red Hat Network 下载并安装更新。 </p>
		<p style="text-indent: 2em;">Red Hat Enterprise Linux 3 </p>
		<p style="text-indent: 2em;">Oracle 10g 经认证可以在不需要更新的情况下运行 Red Hat
Enterprise Linux 3（Advanced Server 和 Enterprise Server）的基本版本。如果拥有更新
CD，则可以使用更新版本中的启动 CD 而非基本版本中的启动 CD 在安装过程中自动应用所有更新。Oracle 支持 Red Hat
的所有更新。 </p>
		<p style="text-indent: 2em;">使用第一张 CD 启动服务器。 </p>
		<p style="text-indent: 2em;">您可能需要更改 BIOS 设置，以允许从 CD 启动。 </p>
		<p style="text-indent: 2em;">启动屏幕上出现时在底部显示 boot:。 </p>
		<p style="text-indent: 2em;">选择 Enter，从控制台上执行图形安装。（对于其他安装方法和选项，请参阅 Red Hat 安装指南。） </p>
		<p style="text-indent: 2em;">安装程序扫描硬件，短暂显示 Red Hat 闪屏，然后开始显示一系列屏幕提示。 </p>
		<p style="text-indent: 2em;">选择语言 </p>
		<p style="text-indent: 2em;">接受默认值。 </p>
		<p style="text-indent: 2em;">配置键盘 </p>
		<p style="text-indent: 2em;">接受默认值。 </p>
		<p style="text-indent: 2em;">欢迎屏幕 </p>
		<p style="text-indent: 2em;">单击 Next。 </p>
		<p style="text-indent: 2em;">配置鼠标 </p>
		<p style="text-indent: 2em;">接受默认值。 </p>
		<p style="text-indent: 2em;">安装类型 </p>
		<p style="text-indent: 2em;">选择 Custom。 </p>
		<p style="text-indent: 2em;">设置磁盘分区 </p>
		<p style="text-indent: 2em;">本文不介绍磁盘分区的详细方法，而是假设您熟悉磁盘分区方法。 </p>
		<p style="text-indent: 2em;">（警告：对磁盘进行错误分区是删除硬盘上所有内容的最可靠、最快捷的方法之一。如果不确定如何分区，请先停下来，找人帮帮您，否则您将冒丢失数据的危险！） </p>
		<p style="text-indent: 2em;">本文使用以下分区方案（文件系统均为 ext3）： </p>
		<p style="text-indent: 2em;">第一个控制器 (/dev/sda) 上的 9GB 磁盘包含以下分区，用于存放所有 Linux 和 Oracle 软件： </p>
		<p style="text-indent: 2em;">- 100MB /boot 分区 </p>
		<p style="text-indent: 2em;">-1,500MB 交换分区 — 将此分区大小至少设置为系统 RAM 的两倍，但不要超过 2GB（32 位系统不支持大于 2GB 的交换文件）。如果需要大于 2GB 的交换空间，则创建多个交换分区。 </p>
		<p style="text-indent: 2em;">-7,150MB 根分区 — 该分区将用于所有目录，包括 /usr、/tmp、/var、/opt、/home 等。这样做纯粹是为了讲解本指南而简化安装。更可靠的分区方案是将这些目录划分到单独的文件系统。 </p>
		<p style="text-indent: 2em;">配置启动加载程序 </p>
		<p style="text-indent: 2em;">接受默认值。 </p>
		<p style="text-indent: 2em;">配置网络 </p>
		<p style="text-indent: 2em;">通常情况下，最好使用静态 IP 地址配置数据库服务器。为此，单击 Edit。 </p>
		<p style="text-indent: 2em;">出现一个弹出窗口。取消选中 Configure using DHCP 复选框，并输入服务器的 IP 地址和网络掩码。确保选中 Activate on boot，然后单击 OK。 </p>
		<p style="text-indent: 2em;">在 Hostname 框中，选择 manually 并输入主机名。 </p>
		<p style="text-indent: 2em;">在 Miscellaneous Settings 框中，输入其他网络设置。 </p>
		<p style="text-indent: 2em;">配置防火墙 </p>
		<p style="text-indent: 2em;">出于本演示的需要，将不配置防火墙。选择 No firewall。 </p>
		<p style="text-indent: 2em;">其他语言支持 </p>
		<p style="text-indent: 2em;">接受默认值。 </p>
		<p style="text-indent: 2em;">选择时区 </p>
		<p style="text-indent: 2em;">选择适合您区域的时间设置。将系统时钟设置为 UTC 对服务器而言通常是一个很好的做法。为此，单击 System clock uses UTC。 </p>
		<p style="text-indent: 2em;">设置 Root 口令 </p>
		<p style="text-indent: 2em;">输入 root 的口令，并再次输入以进行确认。 </p>
		<p style="text-indent: 2em;">选择程序包组 </p>
		<p style="text-indent: 2em;">只选择此处显示的程序包集，其他选项不要选。 </p>
		<p style="text-indent: 2em;">桌面 </p>
		<p style="text-indent: 2em;">- X Window 系统 </p>
		<p style="text-indent: 2em;">- Gnome </p>
		<p style="text-indent: 2em;">- KDE </p>
		<p style="text-indent: 2em;">- 请参阅我在 RHES 2.1 部分中提供的有关 GUI 选择的意见。 </p>
		<p style="text-indent: 2em;">应用程序 </p>
		<p style="text-indent: 2em;">- 编辑器 </p>
		<p style="text-indent: 2em;">- 图形因特网 </p>
		<p style="text-indent: 2em;">服务器 </p>
		<p style="text-indent: 2em;">- 不要选择该组中的任何选项。 </p>
		<p style="text-indent: 2em;">开发 </p>
		<p style="text-indent: 2em;">- 开发工具 </p>
		<p style="text-indent: 2em;">系统 </p>
		<p style="text-indent: 2em;">- 管理工具 </p>
		<p style="text-indent: 2em;">Red Hat Enterprise Linux </p>
		<p style="text-indent: 2em;">- 不要选择该组中的任何选项。 </p>
		<p style="text-indent: 2em;">杂项 </p>
		<p style="text-indent: 2em;">- 原有软件开发 </p>
		<p style="text-indent: 2em;">单击 Next 继续操作。 </p>
		<p style="text-indent: 2em;">准备安装 </p>
		<p style="text-indent: 2em;">单击 Next。 </p>
		<p style="text-indent: 2em;">安装程序包 </p>
		<p style="text-indent: 2em;">软件将被复制到硬盘并被安装。根据提示更改磁盘，然后在安装完成时单击 Next。 </p>
		<p style="text-indent: 2em;">配置图形界面 (X) </p>
		<p style="text-indent: 2em;">接受默认值，除非安装程序无法识别您的视频卡。如果您的视频卡无法被识别，则将无法继续操作。 </p>
		<p style="text-indent: 2em;">配置监视器 </p>
		<p style="text-indent: 2em;">如果安装程序正确识别了您的监视器，则接受默认值。否则，从列表中选择一个兼容的监视器。 </p>
		<p style="text-indent: 2em;">定制图形配置 </p>
		<p style="text-indent: 2em;">接受默认值。 </p>
		<p style="text-indent: 2em;">恭喜 </p>
		<p style="text-indent: 2em;">从系统中取出安装介质，然后单击 Next。 </p>
		<p style="text-indent: 2em;">系统自动重新启动并显示一个新的欢迎屏幕。 </p>
		<p style="text-indent: 2em;">单击 Next。 </p>
		<p style="text-indent: 2em;">许可协议 </p>
		<p style="text-indent: 2em;">阅读许可协议。如果同意其中的条款，则选择 Yes, I agree to the License Agreement 并单击 Next。 </p>
		<p style="text-indent: 2em;">日期和时间 </p>
		<p style="text-indent: 2em;">设置日期和时间。 </p>
		<p style="text-indent: 2em;">如果要使用 NTP 服务器（推荐），则选择 Enable Network Time Protocol 并输入 NTP 服务器的名称。 </p>
		<p style="text-indent: 2em;">用户帐户 </p>
		<p style="text-indent: 2em;">为自己创建一个帐户。 </p>
		<p style="text-indent: 2em;">此时不要为 oracle 创建帐户。本部分稍后将介绍如何创建 oracle 帐户。 </p>
		<p style="text-indent: 2em;">Red Hat Network </p>
		<p style="text-indent: 2em;">如果要立即使用或激活 Red Hat Network 帐户，则接受默认值，单击 Next 并遵循 Red Hat 产品附带的产品激活说明。 </p>
		<p style="text-indent: 2em;">其他 CD </p>
		<p style="text-indent: 2em;">单击 Next。 </p>
		<p style="text-indent: 2em;">完成设置 </p>
		<p style="text-indent: 2em;">单击 Next。 </p>
		<p style="text-indent: 2em;">出现一个图形登录屏幕。 </p>
		<p style="text-indent: 2em;">恭喜！您的 Linux 软件现已安装完毕。 </p>
		<p style="text-indent: 2em;">验证您的安装 </p>
		<p style="text-indent: 2em;">如果完成了以上步骤，您应该具备 Oracle 10g 所需的所有程序包和更新。您可以执行以下步骤验证您的安装。 </p>
		<p style="text-indent: 2em;">所需内核版本：2.4.21-4.EL（这是 RHEL 3 的基本版本附带的内核版本。此内核或更新中提供的任何版本的内核均适用于 Oracle 10g。） </p>
		<p style="text-indent: 2em;"> 通过运行以下命令检查内核版本： </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>uname -r</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">例如： </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code># uname -r<br />2.4.21-4.0.1.ELsmp</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">其他所需程序包的版本（或更高版本）： </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>gcc-3.2.3-2 <br />make-3.79 <br />binutils-2.11 <br />openmotif-2.2.2-16 <br />setarch-1.3-1 <br />compat-gcc-7.3-2.96.122 <br />compat-gcc-c++-7.3-2.96.122 <br />compat-libstdc++-7.3-2.96.122 <br />compat-libstdc++-devel-7.3-2.96.122</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">compat-db-4.0.14.5（Oracle 10g 数据库安装指南 中将其列为是必需的，但此处并不需要） </p>
		<p style="text-indent: 2em;">要查看系统上安装了这些程序包的哪些版本，以 root 用户身份运行以下命令： </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>rpm -q gcc make binutils openmotif setarch compat-db compat-gcc \<br />compat-gcc-c++ compat-libstdc++ compat-libstdc++-devel</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">例如： </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code># rpm -q gcc make binutils openmotif setarch compat-db compat-gcc \<br />&gt;      openmotif compat-gcc-c++ compat-libstdc++ compat-libstdc++-devel<br />gcc-3.2.3-20<br />make-3.79.1-17<br />binutils-2.14.90.0.4-26<br />openmotif-2.2.2-16<br />setarch-1.3-1<br />package compat-db is not installed<br />compat-gcc-7.3-2.96.122<br />compat-gcc-c++-7.3-2.96.122<br />compat-libstdc++-7.3-2.96.122<br />compat-libstdc++-devel-7.3-2.96.122</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">请注意，尚未安装 compat-db
程序包。安装过程中可用的任何程序包组均不包含此程序包，因此必须在单独的步骤中安装。如果系统上缺少任何其他程序包版本，或版本比以上指定的版本旧
（compat-db 除外），则可以从 Red Hat Network 下载并安装更新。 </p>
		<p style="text-indent: 2em;">安装 compat-db </p>
		<p style="text-indent: 2em;">插入原始 Red Hat Enterprise Linux 介质的第二张 CD。（Update 2 中未包含该程序包，它仅存在于原始介质中。） </p>
		<p style="text-indent: 2em;"> 此 CD 自动挂载。 </p>
		<p style="text-indent: 2em;"> 以 root 用户身份运行以下命令： </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code>rpm -ivh /mnt/cdrom/RedHat/RPMS/compat-db-4.0.14-5.i386.rpm</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;"> 例如： </p>
		<center>
				<ccid_nobr>
				</ccid_nobr>
				<table bordercolordark="#ffffff" bordercolorlight="#000000" align="center" border="1" cellpadding="2" cellspacing="0" width="400">
						<tbody>
								<tr>
										<td class="code" style="font-size: 9pt;" bgcolor="#e6e6e6">
												<pre>
														<ccid_code>
														</ccid_code># rpm -ivh /mnt/cdrom/RedHat/RPMS/compat-db-4.0.14-5.i386.rpm<br />Preparing...         ########################################### [100%]<br />1:compat-db       ########################################### [100%]</pre>
										</td>
								</tr>
						</tbody>
				</table>
		</center>
		<p style="text-indent: 2em;">SUSE Linux Enterprise Server 8  </p>
		<p style="text-indent: 2em;">Oracle 10g 经认证可以在 Novell SUSE Linux
Enterprise Server (SLES) 8 上运行。Novell 通过 CD 或通过其支持门户在线提供 Service Pack
和程序包更新。在本指南中，我们将从 CD 安装 SLES 8 (Service Pack 3)。 </p>
		<p style="text-indent: 2em;">使用 SLES 8 CD 启动服务器。 </p>
		<p style="text-indent: 2em;">您可能需要更改 BIOS 设置，以允许从 CD 启动。 </p>
		<p style="text-indent: 2em;">出现 SUSE Linux Enterprise Server 安装屏幕。 </p>
		<p style="text-indent: 2em;">选择 Installation。 </p>
		<p style="text-indent: 2em;">安装程序扫描您的硬件并显示 YaST 界面。 </p>
		<p style="text-indent: 2em;">选择语言 </p>
		<p style="text-indent: 2em;">接受许可协议。 </p>
		<p style="text-indent: 2em;">接受默认值 English (US)。 </p>
		<p style="text-indent: 2em;">安装设置 </p>
		<p style="text-indent: 2em;">选择 New Installation。 </p>
		<p style="text-indent: 2em;">分区 </p>
		<p style="text-indent: 2em;">本文不介绍磁盘分区的详细方法，而是假设您熟悉磁盘分区方法。 </p>
		<p style="text-indent: 2em;">（警告：对磁盘进行错误分区是删除硬盘上所有内容的最可靠、最快捷的方法之一。如果不确定如何分区，请先停下来，找人帮帮您，否则您将冒丢失数据的危险！） </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">本文使用以下分区方案（文件系统均为 ext3）： </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">第一个控制器 (/dev/sda) 上的 9GB 磁盘包含以下分区，用于存放所有 Linux 和 Oracle 软件： </p>
		<p style="text-indent: 2em;">- 100MB /boot 分区 </p>
		<p style="text-indent: 2em;">-1,500MB 交换分区 — 将此分区大小至少设置为系统 RAM 的两倍，但不要超过 2GB（32 位系统不支持大于 2GB 的交换文件）。如果需要大于 2GB 的交换空间，则创建多个交换分区。 </p>
		<p style="text-indent: 2em;">-7,150MB 根分区 — 该分区将用于所有目录，包括 /usr、/tmp、/var、/opt、/home 等。这样做纯粹是为了讲解本指南而简化安装。更可靠的分区方案是将这些目录划分到单独的文件系统。 </p>
		<p style="text-indent: 2em;"> </p>
		<p style="text-indent: 2em;">软件 </p>
		<p style="text-indent: 2em;">单击 Software 的链接。 </p>
		<p style="text-indent: 2em;">出现 Software Selection 屏幕。 </p>
		<p style="text-indent: 2em;">单击 Detailed Selection。 </p>
		<p style="text-indent: 2em;">左侧窗口显示软件选择列表。单击每个选项旁的复选框以将其选中/取消选中。 </p>
		<p style="text-indent: 2em;">选择以下软件（这是推荐的软件集；不要选中其他软件）： </p>
		<p style="text-indent: 2em;">- C/C++ 编译器和工具 </p>
		<p style="text-indent: 2em;">- KDE（或 Gnome） </p>
		<p style="text-indent: 2em;">- LSB 运行时环境 </p>
		<p style="text-indent: 2em;">- 帮助与支持文档 </p>
		<p style="text-indent: 2em;">- 图形基本系统 </p>
		<p style="text-indent: 2em;">- YaST2 配置模块 </p>
		<p style="text-indent: 2em;">- SLES 管理工具 </p>
		<p style="text-indent: 2em;">建议不要安装以下项，因为它们可能与提供相同服务的 Oracle 产品冲突： </p>
		<p style="text-indent: 2em;">- 简单 Web 服务器 </p>
		<p style="text-indent: 2em;">- 身份验证服务器（NIS、LDAP、Kerberos） </p>
		<p style="text-indent: 2em;">时区 </p>
		<p style="text-indent: 2em;">设置您的时区。 </p>
		<p style="text-indent: 2em;">单击 Accept。 </p>
		<p style="text-indent: 2em;">出现一个警告对话框。准备好继续操作时，单击 Yes, install。 </p>
		<p style="text-indent: 2em;">根据安装程序的提示更换 CD。 </p>
		<p style="text-indent: 2em;">安装此软件后，将显示一个窗口，提示基本系统已经安装成功。 </p>
		<p style="text-indent: 2em;">取出安装 CD，然后单击 OK。 </p>
		<p style="text-indent: 2em;">系统重新启动。 </p>
		<p style="text-indent: 2em;">输入 root 用户的口令，并再次输入以进行确认。 </p>
		<p style="text-indent: 2em;">为自己创建一个帐户。不要在此时创建 oracle 帐户；我们将在稍后创建它。 </p>
		<p style="text-indent: 2em;">桌面设置 </p>
		<p style="text-indent: 2em;">接受默认值。 </p>
		<p style="text-indent: 2em;">出现一个有关自动检测本地打印机的警告窗口。 </p>
		<p style="text-indent: 2em;">单击 Skip detection。 </p>
		<p style="text-indent: 2em;">配置网络接口，并在准备好继续操作后单击 Next。 </p>
		<p style="text-indent: 2em;">建议为服务器设置静态 IP 地址。 </p>
		<p style="text-indent: 2em;">构建数据库无需配置打印机、调制解调器、ISDN 适配器或声卡。 </p>
		<p style="text-indent: 2em;">出现一个图形登录屏幕。 </p>
		<p style="text-indent: 2em;">现在，您需要安装 Service Pack 3。以您自己的身份登录。 </p>
		<p style="text-indent: 2em;">插入更新 CD，然后单击 Patch CD Update。 </p>
		<p style="text-indent: 2em;">启动 YaST2（SUSE 的系统管理工具）。 </p>
		<p style="text-indent: 2em;">选择 SUSE &gt; System &gt; YaST2。（SUSE 是位于屏幕左下部带微笑蜥蜴侧脸的绿色圆按钮。它相当于“开始”。） </p>
		<p style="text-indent: 2em;">出现一个窗口，提示输入 root 用户口令。输入口令，然后单击 OK。 </p>
		<p style="text-indent: 2em;">出现 YaST Control Center。 </p>
		<p style="text-indent: 2em;">出现 YaST Online Update 窗口。 </p>
		<p style="text-indent: 2em;">接受默认值，然后单击 Next。 </p>
		<p style="text-indent: 2em;">出现一个窗口，显示一个补丁更新列表。 </p>
		<p style="text-indent: 2em;">YaST 在更新系统其他部分之前需要先对自身进行更新。所需程序包已被选中。此时不要选择任何其他程序包。 </p>
		<p style="text-indent: 2em;">单击 Accept。 </p>
		<p style="text-indent: 2em;">出现一个窗口，提示重新启动在线更新。 </p>
		<p style="text-indent: 2em;">单击 OK。 </p>
		<p style="text-indent: 2em;">出现一个窗口，提示安装已成功。 </p>
		<p style="text-indent: 2em;">单击 OK。 </p>
		<p style="text-indent: 2em;">在 YaST Online Update 窗口中，单击 Finish。 </p>
		<p style="text-indent: 2em;">在 YaST Control Center 窗口中，单击 Close。 </p>
		<p style="text-indent: 2em;">重复步骤 21 和 22。 </p>
		<p style="text-indent: 2em;">出现一个窗口，显示一个补丁更新列表。 </p>
		<p style="text-indent: 2em;">单击 Accept 接受默认值。 </p>
		<p style="text-indent: 2em;">可能出现包含各种提示（如“Make sure you update sendmail”）的小弹出窗口。单击 OK 关闭它们。 </p>
		<p style="text-indent: 2em;">此步骤需要一些时间。将光标悬停在 Next 按钮上。如果更新仍在运行，则显示一个时钟图标。 </p>
		<p style="text-indent: 2em;">出现一个窗口，提示安装已成功。 </p>
		<p style="text-indent: 2em;">单击 OK。 </p>
		<p style="text-indent: 2em;">在 YaST Online Update 屏幕上，单击 Next。 </p>
		<p style="text-indent: 2em;">安装程序写系统配置。 </p>
		<p style="text-indent: 2em;">在 YaST Control Center 中，单击 Close。 </p>
		<p style="text-indent: 2em;">注销。 </p>
		<p style="text-indent: 2em;">SUSE &gt; Logout。 </p>
		<p style="text-indent: 2em;">取出更新 CD。 </p>
		<p style="text-indent: 2em;">重新启动系统。 </p>
		<p style="text-indent: 2em;">在图形登录屏幕上，单击 Menu。 </p>
<img src ="http://www.blogjava.net/ASONG/aggbug/85851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ASONG/" target="_blank">汪松明</a> 2006-12-06 15:17 <a href="http://www.blogjava.net/ASONG/articles/85851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL大全</title><link>http://www.blogjava.net/ASONG/articles/55264.html</link><dc:creator>汪松明</dc:creator><author>汪松明</author><pubDate>Tue, 27 Jun 2006 01:57:00 GMT</pubDate><guid>http://www.blogjava.net/ASONG/articles/55264.html</guid><wfw:comment>http://www.blogjava.net/ASONG/comments/55264.html</wfw:comment><comments>http://www.blogjava.net/ASONG/articles/55264.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ASONG/comments/commentRss/55264.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ASONG/services/trackbacks/55264.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<font size="2">一、<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>PLUS <br />1引言 <br /><br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>命令 <br />以下17个是作为语句开头的关键字： <br />alterdroprevoke <br />auditgrantrollback* <br />commit*insertselect <br />commentlockupdate <br />createnoauditvalidate <br />deleterename <br />这些命令必须以“;”结尾 <br />带*命令句尾不必加分号，并且不存入<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>缓存区。 <br /><br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>中没有的<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>*PLUS命令 <br />这些命令不存入<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>缓存区 <br />@definepause <br />#delquit <br />$describeremark <br />/disconnectrun <br />acceptdocumentsave <br />appendeditset <br />breakexitshow <br />btitlegetspool <br />changehelp<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">sql</b>plus <br />clearhoststart <br />columninputtiming <br />computelistttitle <br />connectnewpageundefine <br />copy <br /><br />--------- <br />2数据库查询 <br /><br />数据字典 <br />TAB用户创建的所有基表、视图和同义词清单 <br /><br />DTAB构成数据字典的所有表 <br /><br />COL用户创建的基表的所有列定义的清单 <br /><br />CATALOG用户可存取的所有基表清单 <br /><br />select*fromtab; <br /><br />describe命令描述基表的结构信息 <br />describedept <br /><br />select* <br />fromemp; <br /><br />selectempno,ename,job <br />fromemp; <br /><br />select*fromdept <br />orderbydeptnodesc; <br /><br />逻辑运算符 <br />=!=或&lt;&gt;&gt;&gt;=&lt;&lt;= <br />in <br />betweenvalue1andvalue2 <br />like <br />% <br />_ <br />innull <br />not <br />noin,isnotnull <br /><br />谓词in和notin <br />有哪些职员和分析员 <br />selectename,job <br />fromemp <br />wherejobin('clerk','analyst'); <br /><br />selectename,job <br />fromemp <br />wherejobnotin('clerk','analyst'); <br /><br />谓词between和notbetween <br />哪些雇员的工资在2000和3000之间 <br />selectename,job,salfromemp <br />wheresalbetween2000and3000; <br /><br />selectename,job,salfromemp <br />wheresalnotbetween2000and3000; <br /><br />谓词like,notlike <br />selectename,deptnofromemp <br />whereenamelike'S%'; <br />(以字母S开头) <br />selectename,deptnofromemp <br />whereenamelike'%K'; <br />(以K结尾) <br />selectename,deptnofromemp <br />whereenamelike'W___'; <br />(以W开头，后面仅有三个字母) <br />selectename,jobfromemp <br />wherejobnotlike'sales%'; <br />(哪些雇员的工种名不以sales开头) <br /><br />谓词isnull,isnotnull <br />没有奖金的雇员（即commision为null） <br />selectename,jobfromemp <br />wherecommisnull; <br /><br />selectename,jobfromemp <br />wherecommisnotnull; <br /><br />多条件查询 <br />selectename,job <br />fromemp <br />wheredeptno=20 <br />andjob!='clerk'; <br /><br />表达式 <br />+-*/ <br /><br />算术表达式 <br />选择奖金高于其工资的5%的雇员 <br />selectename,sal,comm,comm/salfromemp <br />wherecomm&gt;.05*sal <br />orderbycomm/saldesc; <br /><br />日期型数据的运算 <br />addtwodaysto6-Mar-87 <br />6-Mar-87+2=8-Mar-87 <br />addtwohoursto6-Mar-87 <br />6-Mar-87+2/24=6-Mar-87and2hrs <br />add15secondsto6-Mar-87 <br />6-Mar-87+15/(24*60*60)=6-Mar-87and15secs <br /><br />列名的别名 <br />selectenameemployeefromemp <br />wheredeptno=10; <br />（别名：employee） <br />selectename,sal,comm,comm/sal"C/SRATIO"fromemp <br />wherecomm&gt;.05*sal <br />orderbycomm/saldesc; <br /><br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>命令的编辑 <br />listorl显示缓冲区的内容 <br />list4显示当前<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>命令的第4行，并把第4行作为当前行，在该行号后面有个*。 <br />changeorc用新的内容替换原来在一行中第一次出现内容 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;c/(...)/('analyst')/ <br />inputori增加一行或多行 <br />appendora在一行后追加内容 <br />del删除当前行删除<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>缓冲区中的当前行 <br />run显示并运行<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>缓冲区中的命令 <br />/运行<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>缓冲区中的命令 <br />edit把<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>缓冲区中的命令写到操作系统下的文本文件， <br />并调用操作系统提供的编辑器执行修改。 <br /><br />------------- <br />3数据操纵 <br />数据的插入 <br />insertintodept <br />values(10,'accounting','newyork'); <br /><br />insertintodept(dname,deptno) <br />values('accounting',10); <br /><br />从其它表中选择插入数据 <br />insertintoemp(empno,ename,deptno) <br />selectid,name,department <br />fromold_emp <br />wheredepartmentin(10,20,30,40); <br /><br />使用参数 <br />insertintodept <br />values(&amp;deptno,&amp;dname,&amp;loc); <br />执行时，<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>/PLUS对每个参数将有提示用户输入 <br /><br />参数对应日期型或字符型数据时，可在参数上加引号，输入时就可不用引号 <br />insertintodept <br />values(&amp;deptno,'&amp;dname','&amp;loc'); <br /><br />插入空值（NULL） <br />insertintodept <br />values(50,'education',null); <br /><br />插入日期型数据 <br />日期型数据缺省格式：DD-MON-YY <br />insertintoemp <br />(empno,ename,hiredate) <br />values(7963,'stone','07-APR-87'); <br /><br />系统时间：SYSDATE <br />insertintoemp <br />(empno,ename,hiredate) <br />values(7600,'kohn',SYSDATE); <br /><br />数据更新 <br />updateemp <br />setjob='manager' <br />whereename='martin'; <br /><br />updateemp <br />setjob='marketrep' <br />whereename='salesman'; <br /><br />updateemp <br />setdeptno=40,job='marketrep' <br />wherejob='salesman'; <br /><br />数据删除 <br />deleteemp <br />whereempno=765; <br /><br />更新的提交 <br />commit <br /><br />自动提交方式 <br />setautocommiton <br />如果状态设为开，则使用inesrt,update,delete会立即提交。 <br /><br />更新取消 <br />rollback <br /><br />两次连续成功的commit之间的操作，称为一个事务 <br /><br />--------------- <br />4创建基表、视图 <br />创建基表 <br />createtabledept <br />(deptnonumber(2), <br />dnamechar(14), <br />locchar(13)); <br /><br />数据字典会自动更新。 <br />一个基表最多254列。 <br /><br />表名列名命名规则： <br />限制 <br />第一个字符必须是字母，后面可任意（包括$#_但不能是逗号）。 <br />名字不得超过30个字符。 <br /><br />唯一 <br />某一用户的基表名必须唯一，不能是<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</b>的保留字，同一基表的列名互不相同。 <br /><br />使用双引号 <br />如果表名用双引号括起来，则可不满足上述规则； <br />只有使用双引号，才能<a name="2"></a><b style="COLOR: black; BACKGROUND-COLOR: #99ff99">区别</b>大、小写； <br />命名时使用了双引号，在以后的操作也必须使用双引号。 <br /><br />数据类型： <br />char(n)（不得超过240字符） <br />number(n,d) <br />date <br />long（最多65536字符） <br />raw（二进制原始数据） <br /><br />空值处理 <br />有时要求列值不能为空 <br />createtabledept <br />(deptnonumber(2)notnull, <br />dnamechar(14), <br />locchar(13)); <br /><br />在基表中增加一列 <br />altertabledept <br />add(headcntnumber(3)); <br /><br />修改已有列属性 <br />altertabledept <br />modifydnamechar(20); <br />注：只有当某列所有值都为空时，才能减小其列值宽度。 <br />只有当某列所有值都为空时，才能改变其列值类型。 <br />只有当某列所有值都为不空时，才能定义该列为notnull。 <br />例： <br />altertabledeptmodify(locchar(12)); <br />altertabledeptmodifylocchar(12); <br />altertabledeptmodify(dnamechar(13),locchar(12)); <br /><br />创建视图 <br />createviewmanagersas <br />selectename,job,sal <br />fromemp <br />wherejob='manager'; <br /><br />为视图列名取别名 <br />createviewmydept <br />(person,title,salary) <br />asselectename,job,sal <br />fromemp <br />wheredeptno=10; <br /><br />withcheckoption选项 <br />使用withcheckoption，保证当对视图插入或更新数据时， <br />该数据必须满足视图定义中select命令所指定的条件。 <br />createviewdept20as <br />selectename,job,sal,deptno <br />fromemp <br />wheredeptno=20 <br />withcheckoption; <br />在做下述操作时，会发生错误 <br />updatedept20 <br />setdeptno=30 <br />whereename='ward'; <br /><br />基表、视图的拷贝 <br />createtableemp2 <br />asselect*fromemp; <br /><br />基表、视图的删除 <br />droptable表名 <br />dropview视图名 <br /><br />------------ <br />5<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>*PLUS报表功能 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>*PLUS的一些基本格式命令 <br />columndeptnoheadingdepartment <br /><br />columnenameheadingname <br /><br />columnsalheadingsalary <br /><br />columnsalformat$99,999.00 <br /><br />ttitlesamplereportfor｜hitechcorp <br /><br />btitlestrictlyconfidential <br /><br />breakondeptno <br /><br />computesumofsalondeptno <br /><br />run <br /><br />表头和表尾 <br />ttitlesamplereportfor｜hitechcorp <br />btitlerightstrictlyconfidential <br /><br />“｜”表示换行，结尾不必加分号 <br />选项有三种：leftrightcenter <br /><br />使用TTITLE，系统将自动地在每页的顶部显示日期和页号。 <br />TTITLET和BTITLE命令有效，直至重新设置表头或表尾，或退出<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>*PLUS。 <br /><br />下面命令使标题语句失效 <br />TTITLEOFF <br />BTITLEOFF <br /><br />列名 <br />column命令定义用于显示列名 <br />若名字为一个单词，不必加引号 <br />columnenameheadingemployee <br /><br />columnenameheading'employee｜name' <br />（｜为换行） <br /><br />取消栏定义 <br />columnenameclear <br /><br />列的格式 <br />columnenameformatA15 <br /><br />columnsalformat$9,999.99 <br /><br />columncommlikesal <br /><br />like子句，使得某一列的格式参照另一列格式，它拷贝列名及其格式 <br /><br />控制记录显示分组顺序 <br />breakondeptno <br />（不显示重复值） <br /><br />selectdeptno,ename <br />fromemp <br />orderbydeptno; <br />（ORDERBY子句用于控制BREAK） <br /><br />显示为 <br />10clark <br />niller <br />20smith <br />scott <br />30allen <br />blake <br /><br />每次只有一个BREAK命令起作用，但一次可以在多个列上使用BREAK命令 <br />breakon列名1on列名2 <br /><br />记录分组 <br />breakondeptnoskip2 <br />selectdeptno,ename <br />fromemp <br />orderbydeptno; <br /><br />每个deptno之间空两行 <br />clearbreak（取消BREAK命令） <br />breakonpage（每次从一新页开始） <br />breakonreport（每次从一新报表开始） <br />breakonpageonreport（联合使用） <br /><br />分组计算 <br />breakondeptnoskip2 <br />computesumofsalondeptno <br />计算每个部门的工资总和 <br />skip子句使部门之间的信息分隔开 <br /><br />其他计算命令 <br />computeavgofsalondeptno（平均值） <br />count非空值的总数 <br />MAX最大值 <br />MIN最小值 <br />STD标准偏差 <br />VAR协方差 <br />NUMBER行数 <br /><br />使compute命令失效 <br />一旦定义了COMPUTE，则一直有效，直到 <br />关闭COMPUTE（clearcompute） <br /><br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>/PLUS环境命令 <br />show选项 <br />（显示当前参数设置情况） <br /><br />showall（显示全部参数） <br /><br />设置参数 <br />set选项值或开关 <br /><br />setautocommiton <br /><br />SET命令包括 <br />setautocommit{off｜on｜immediate} <br />（自动提交，OFF缺省） <br /><br />setecho{off｜on} <br />（命令文件执行，是否在终端上显示命令本身，OFF缺省） <br /><br />setfeedback{off｜on} <br />（ON：查询结束时，给出结果，记录数的信息，缺省； <br />OFF：无查询结果，记录数的信息） <br /><br />setheading{off｜on} <br />（ON：列的头标在报表上显示，缺省；OFF：不在报表上显示） <br /><br />setlinesize{n} <br />一行显示的最大字符数，缺省为80 <br /><br />setpagesize{n} <br />每页的行数，缺省是14 <br /><br />setpause{off｜on｜text} <br />（ON：当报表超过一页时，每显示一屏就暂停显示，等待用户打回车键，再接着显示； <br />OFF：页与页不停顿，缺省；text：页与页停顿，并向用户提示信息） <br /><br />SETBUFFERbuffer <br />设置当头的命令缓冲区，通常情况下，<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>命令缓冲区已为当前缓冲区。 <br />由于<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>命令缓冲区只能存放一条<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>命令， <br />所以可用其它缓冲区来存放<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>命令和<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>*PLUS命令。 <br /><br />经常用到的设置可放在login.<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">sql</b>文件中。 <br /><br />SETNULL <br />setnull'nodata' <br /><br />selectename,comm <br />fromemp <br />wheredeptno=30; <br />把部门30中无佣金雇员的佣金显示为“NODATA”。 <br /><br />setnull是<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>*PLUS命令，用它来标识空值（NULL），可以设置为任意字符串。 <br /><br />存盘命令SAVE <br />save文件名 <br /><br />input <br />1selectempno,ename,job <br />2fromemp <br />3wherejob='analyst' <br /><br />saveresearch <br /><br />目录中会增加一个research.<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">sql</b>文件。 <br /><br />编辑命令EDIT <br />edit <br /><br />EDIT编辑当前缓冲区中的内容。 <br /><br />编辑一个文件 <br />editresearch <br /><br />调入命令GET <br />getresearch <br />把磁盘上的文件内容调入缓冲区，并显示在屏幕上，文件名尾不必加.<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">sql</b>。 <br /><br />START命令 <br />运行指定的文件 <br />startresearch <br /><br />输出命令SPOOL <br />spooltryfile <br />不仅可以使查询结果在屏幕上显示，还可以使结果存入文件 <br /><br />停止向文件输出 <br />spooloff <br /><br />把查询结果在打印机上输出，先把它们存入一个文件中， <br />然后不必使用SPOOLOFF，而用： <br />spoolout <br />SPOOLOUT关闭该文件并在系统缺省的打印机上输出 <br /><br />制作报表举例 <br />edittryfile <br /><br />setechooff <br />setautocommiton <br />setpagesize25 <br />insertintoemp(empno,ename,hiredate) <br />values(9999,'geiger',sysdate); <br />insertintoemp(empno,ename,deptno) <br />values(3333,'samson',20); <br />spoolnew_emp <br />select*fromemp <br />wheredeptno=20 <br />ordeptnoisnull <br />/ <br />spooloff <br />setautocommitoff <br /><br />用start命令执行这个文件 <br /><br />-------- <br />6函数 <br />字符型函数 <br />initcap(ename);将ename中每个词的第一个字母改为大写。 <br />如：jacksmith--JackSmith <br /><br />length(ename);计算字符串的长度。 <br /><br />substr(job,1,4); <br /><br />其它 <br />lower <br />upper <br />least取出字符串列表中按字母排序排在最前面的一个串 <br />greatest取出字符串列表中按字母排序排在最后的一个串 <br /><br />日期函数 <br />add_month(hiredate,5)在雇佣时间上加5个月 <br />month_between(sysdate,hiredate)计算雇佣时间与系统时间之间相差的月数 <br />next_day(hiredate,'FRIDAY')计算受雇日期之后的第一个星期五的日期 <br /><br />例 <br />selectename,sal,next_day(sysdate,'FRIDAY')as_of <br />fromemp <br />wheredeptno=20; <br />（as_of是别名） <br /><br />如果不用to_char函数，日期在<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</b>中的缺省格式是'DD_MON_YY' <br />to_char(date,datepicture) <br /><br />selectename,to_char(hiredate,'DyMondd,yyyy')hired <br />fromemp <br />wheredeptno=10; <br /><br />to_date(字符串,格式) <br /><br />insertintoemp(empno,ename,hiredate) <br />values(7999,'asms',to_date('070387083000','MMDDYYHHMISS')); <br /><br />日期型数据的格式 <br />dd12 <br />dyfri <br />dayfriday <br />ddspthtwelfth <br /><br />mm03 <br />monmar <br />monthmarch <br /><br />yy87 <br />yyyy1987 <br /><br />例 <br />Mar12,1987'Mondd,yyyy' <br />MAR12,1987'MONdd,yyyy' <br />ThursdayMARCH12'DayMONTHdd' <br />Mar1211:00am'Monddhh:miam' <br />Thu,thetwelfth'Dy,"the"ddspth' <br /><br />算术函数 <br />least(v1,v2) <br /><br />selectename,empno,mgr,least(empno,mgr)lownum <br />fromemp <br />whereempno0 <br /><br />trunc(sal,0) <br />取sal的近似值（截断） <br /><br />空值函数 <br />nvl(v1,v2) <br />v1为列名，如果v1不是空值，nvl返回其列值。 <br />v1为空值，返回v2的值。 <br /><br />聚组函数 <br />selectsum(comm) <br />fromemp; <br />（返回一个汇总信息） <br />不能把sum用在select语句里除非用groupby <br /><br />字符型、日期型、数字型的聚组函数 <br />minmaxcount可用于任何数据类型 <br /><br />selectmin(ename) <br />fromemp; <br /><br />selectmin(hiredate) <br />fromemp; <br /><br />selectmin(sal) <br />fromemp; <br /><br />有多少人有工作？ <br />selectcount(job) <br />fromemp; <br /><br />有多少种不同的工种？ <br />selectcount(distinctjob) <br />fromemp; <br /><br />countdistinct计算某一字段中不同的值的个数 <br /><br />其它聚组函数（只用于数字型数据） <br />avg计算平均工资 <br />selectavg(sal) <br />fromemp; <br /><br />stddev计算工资的平均差 <br />selectstddev(sal) <br />fromemp; <br /><br />sum计算总工资 <br />selectsum(sal) <br />fromemp; <br /><br />groupby子句 <br />selectdeptno,sum(sal),avg(sal) <br />fromemp <br />groupbydeptno; <br /><br />按多个条件分组 <br />每个部门的雇员数 <br />selectdeptno,count(*) <br />fromemp <br />groupbydeptno; <br /><br />每个部门的每个工种的雇员数 <br />selectdeptno,job,count(*) <br />fromemp <br />groupbydeptno,job; <br /><br />满足条件的分组 <br />（where是针对select的，having是针对groupby的） <br />哪些部门的工资总和超过了9000 <br />selectdeptno,sum(sal) <br />fromemp <br />groupbydeptno <br />havingsum(sal)&gt;9000; <br /><br />select小结 <br />除去职员，哪些部门的工资总和超过了8000 <br />selectdeptno,sum(sal) <br />fromemp <br />wherejob!='clerk' <br />groupbydeptno <br />havingsum(sal)&gt;8000 <br />orderbysum(sal); <br /><br />--------- <br />7高级查询 <br />等值联接 <br />selectempno,ename,job,emp.deptno,dname <br />fromemp,dept <br />whereemp.deptno=dept.deptno; <br /><br />外联接 <br />selectename,dept.deptno,loc <br />fromemp,dept <br />whereemp.deptno(+)=dept.deptno; <br />如果在dept.deptno中有的数值，在emp.deptno中没有（如deptno=40）， <br />则作外联接时，结果中会产生一个空值 <br /><br />自联接：同一基表的不同行要做联接，可使用自联接 <br />指出每个雇员的经理名字 <br />selectworker.ename,manager.enamemanager <br />fromempworker,empmanager <br />whereworker.mgr=manager.empno; <br /><br />非等值联接 <br />哪些雇员的工资属于第三级别 <br />selectename,sal <br />fromemp,salgrade <br />wheregrade=3 <br />andsalbetweenlosalandhisal; <br />（基表salgrade：gradelosalhisal） <br /><br />集合运算 <br />行的连接 <br />集合运算把2个或多个查询结果合并为一个 <br />union-setunion <br />Rowsoffirstqueryplusofsecondquery,lessduplicaterows <br /><br />intersect-setintersection <br />Rowsbothquerieshaveincommon <br /><br />minus-setdifference <br />rowsuniquetothefirstquery <br /><br />介绍几个视图 <br />accountview <br />enamesaljob <br /><br />salesview <br />enamesaljob <br /><br />researchview <br />enamesaljob <br /><br />union运算 <br />返回一个查询结果中有但又不重要的行，它将基表或视图中的记录合并在一起 <br />所有部门中有哪些雇员工资超过2000 <br />对应列的数据类型必须相同 <br />selectename,sal <br />fromaccount <br />wheresal&gt;2000 <br />union <br />selectename,sal <br />fromresearch <br />wheresal&gt;2000 <br />union <br />selectename,sal <br />fromsales <br />wheresal&gt;2000; <br /><br />intersect运算 <br />返回查询结果中相同的部分 <br />各个部门中有哪些相同的工种 <br />selectjob <br />fromaccount <br />intersect <br />selectjob <br />fromresearch <br />intersect <br />selectjob <br />fromsales; <br /><br />minus运算 <br />返回在第一个查询结果中与第二个查询结果不相同的那部分行记录。 <br />有哪些工种在财会部中有，而在销售部中没有？ <br />selectjobfromaccount <br />minus <br />selectjobfromsales; <br /><br />子查询 <br />slectename,deptno <br />fromemp <br />wheredeptno= <br />(selectdeptno <br />fromemp <br />whereename='smith'); <br /><br />多级子查询 <br />selectename,job,sal <br />fromemp <br />wherejob= <br />(selectjob <br />fromemp <br />whereename='clark') <br />orsal&gt; <br />(selectsal <br />fromemp <br />whereename='clark'); <br /><br />多个基表与子查询 <br />selectename,job,sal <br />fromemp,dept <br />whereloc='newyork' <br />andemp.deptno=dept.deptno <br />andsal&gt; <br />(selectsal <br />fromemp <br />whereename='scott'); <br /><br />子查询中使用聚组函数 <br />selectename,hiredate <br />fromemp <br />wherehiredate= <br />(selectmin(hiredate) <br />fromemp); <br /><br />------------ <br />8授权 <br />系统权限 <br />DBA所有权限 <br />RESOURCE注册，创建新的基表 <br />CONNECT，注册，查询 <br /><br />只有DBA才有权创建新的用户 <br />grantconnecttoscott <br />identifiedbytiger; <br /><br />DBA或用户自己可以改变用户口令 <br />grantconnecttoscott <br />identifiedbyleopard; <br /><br />基表权限1 <br />有两种方法获得对基表操作的权限 <br /><br />创建自己的基表 <br />获得基表创建用户的许可 <br />grantselect,insert <br />onemp <br />toscott; <br /><br />这些权限有 <br />selectinsertupdatedeletealterindex <br /><br />把所有权限授于他人 <br />grantallonemptoscott; <br /><br />同义词 <br />select* <br />fromscott.emp <br /><br />创建同义词 <br />为用户allen的EMP基表创建同义词employee <br />createsynonymemployee <br />forallen.emp <br /><br />基表权限2 <br />你可以使其他用户有这样的权力，即其他用户可以把你的基表权限授予他人 <br />grantall <br />onemp <br />toscott <br />withgrantoption; <br /><br />收回权限 <br />系统权限只有被DBA收回 <br /><br />基表权限随时都可以收回 <br /><br />revokeinsert <br />onemp <br />fromscott; <br /><br />--------- <br />9索引 <br />建立索引 <br />createindexemp_ename <br />onemp(ename); <br /><br />删除索引 <br />dropindexemp_ename; <br /><br />关于索引 <br />只对较大的基表建立索引（至少50条记录） <br />建立索引之前插入数据 <br />对一个基表可建立任意多个索引 <br />一般是在作为主键的列上建立索引 <br />建立索引之后，不影响<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>命令的执行 <br />建立索引之后，<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</b>自动维护和使用索引 <br /><br />保证数据唯一性 <br />提高执行速度的同时，索引还可以保证每个记录中的每个列值是不重复的。 <br />createuniqueindexemp_empno <br />onemp(empno); <br /><br />-------- <br />练习和答案 <br /><br />有没有工资比奖金多的雇员？如果有，按工资的降序排列。 <br />如果有两个以上的雇员工资相同，按他们的名字排序。 <br />selectenameemployee,salsalary,commcommision <br />fromemp <br />wheresal&gt;comm <br />orderbysaldesc,ename; <br /><br />列出有关雇员姓名、奖金占收百分比的信息。 <br />要求显示时列名意义明确，按雇员姓名排序，不包括奖金未知的雇员。 <br />selectenameemployee,(comm/(comm+sal))*100incentive <br />fromemp <br />wherecommisnotnull <br />orderbyename; <br /><br />在chicago（部门30）工作的所有雇员的工资上涨10%。 <br />updateemp <br />setsal=1.1*sal <br />wheredeptno=30; <br /><br />updateemp <br />setsal=1.1*sal <br />wheredeptno=(selectdeptno <br />fromdept <br />whereloc='chicago'); <br /><br />为hitech公司新建一个部门，编号为50，其它信息均不可知。 <br />insertintodept(dname,deptno) <br />values('faclities',50); <br /><br />创建视图，三个列名，其中不包括职员信息 <br />createviewemployee("employeename", <br />"employeenumber", <br />"employeejob") <br />asselectename,empno,job <br />fromemp <br />wherejob!='clerk'; <br /><br />制作工资报表，包括雇员姓名、受雇时间（按星期计算），工资和部门编号， <br />一页显示一个部门的信息，每页尾，显示该页的工资之和以及受雇时间之和， <br />报表结尾处，显示所有雇员的工资总和以及受雇时间总和， <br />工资按美元计算，受雇时间按星期计算，每页的上方应有标题。 <br />ttitle'service' <br />breakondeptnoonpageonreport <br />computesumofsalondeptno <br />computesumofsalonreport <br />computesumofservice_lengthondeptno <br />computesumofservice_lengthonreport <br />columnsalformat$99,999.00 <br />columnservice_lengthformat9999 <br />selectdeptno,enameemployee,(sysdate-hiredate)/7service_length,sal <br />fromemp <br />orderbydeptno; <br /><br />制作报表，包括雇员姓名、总收入和受佣日期， <br />且：姓名的第一个字母必须大写，雇佣日期格式为MM/DD/YYYY， <br />总收入包括没有奖金的雇员的总收入，姓名按字母顺序排列。 <br />col"hiredate"formatA12 <br />col"employee"formatA10 <br />col"compensation"format$99,999.00 <br />selectinitcap(ename)"employee", <br />(sal+nvl(comm,0))"compensation", <br />to_char(hiredate,'MM/DD/YYYY')"hiredate" <br />fromemp <br />orderbyename; <br /><br />列出有超过7个周边国家的国家名字和面积。 <br />selectnation,area <br />fromnation <br />wherecodein <br />(selectnation_code <br />fromborder <br />groupbynation_code <br />havingcount(*)&gt;7); <br /><br />列出所有面积大于等于日本的岛国的国名和人口。 <br />selectnation,population <br />fromnation,border <br />wherecode=nation_code(+) <br />andnation_codeisnull <br />andarea&gt;= <br />(selectarea <br />fromnation <br />whereupper(nation)='JAPAN'); <br /><br />列出所有边界在其它国家中的国名，并且显示其边界国家名字。 <br />breakonnation <br />selectnation1.nation, <br />nation2.nationborderin_country <br />fromnationnation1,border,nationnation2 <br />wherenation1.code=border.nation_code <br />andborder.border_code=nation2.code <br />orderbynation1.nation; <br /><br />----------- <br />----------- <br />PL/<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b> <br /><br />2PL/<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>的块结构和数据类型 <br /><br />块结构的特点 <br />嵌套 <br />begin <br />...... <br />begin <br />...... <br />exception <br />...... <br />end; <br />exception <br />...... <br />end; <br /><br />标识符： <br />不能超过30个字符 <br />第一个字符必须为字母 <br />其余字符可以是字母，数字，$，_，或# <br />不区分大小写形式 <br />如果用双引号括起来，则字符顺序可以任意排列，并区分大小写形式 <br />无<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>保留字 <br /><br />数据类型 <br />数字型： <br />整数，实数，以及指数 <br /><br />字符串： <br />用单引号括起来 <br />若在字符串表示单引号，则使用两个单引号 <br />字符串长度为零（两个单引号之间没有字符），则表示NULL <br /><br />字符： <br />长度为1的字符串 <br /><br />数据定义 <br />语法 <br />标识符[常数&gt;数据类型[NOTNULL&gt;[:=PL/<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>表达式&gt;; <br />':='表示给变量赋值 <br /><br />数据类型包括 <br />数字型number(7,2) <br />字符型char(120) <br />日期型date <br />布尔型boolean（取值为true,false或null，不存贮在数据库中） <br /><br />日期型 <br />anniversarydate:='05-JUL-95'; <br />project_completiondate; <br /><br />布尔型 <br />over_budgetbooleannotnull:=false; <br />availableboolean; <br />（初始值为NULL） <br /><br />%type类型匹配 <br />books_printednumber(6); <br />books_soldbook_printed%type; <br />manager_nameemp.ename%type; <br /><br />变量赋值 <br />变量名:=PL/<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>表达式 <br />numvar:=5; <br />boolvar:=true; <br />datevar:='11-JUN-87'; <br /><br />字符型、数字型表达式中的空值 <br />null+&lt;数字&gt;=null（空值加数字仍是空值） <br />null&gt;&lt;数字&gt;=null（空值与数字进行比较，结果仍是空值） <br />null｜｜'字符串'='字符串'（null即''） <br />（空值与字符串进行连接运算，结果为原字符串） <br /><br />变量作用范围 <br />标识符在宣言它的块中有效 <br />标识符如果不在子块中重新定义，则在PL/<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>块的所有子块中同样有效 <br />重新定义后的标识符，作用范围仅在本子块中有效 <br /><br />例 <br />declare <br />e_messchar(80); <br />begin <br />/*子块1*/ <br />declare <br />v1number(4); <br />begin <br />selectempnointov1fromemp <br />wherejob='president'; <br />exception <br />whentoo_many_rowsthen <br />insertintojob_errors <br />values('morethanonepresident'); <br />end; <br />/*子块2*/ <br />declare <br />v1number(4); <br />begin <br />selectempnointov1fromemp <br />wherejob='manager'; <br />exception <br />whentoo_many_rowsthen <br />insertintojob_errors <br />values('morethanonemanager'); <br />end; <br />exception <br />whenothersthen <br />e_mess:=substr(<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">sql</b>errm,1,80); <br />insertintogeneralerrorsvalues(e_mess); <br />end; <br /><br />--------- <br />3<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>和PL/<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b> <br /><br />插入 <br />declare <br />my_salnumber(7,2):=3040.55; <br />my_enamechar(25):='wanda'; <br />my_hiredatedate:='08-SEP-88'; <br />begin <br />insertintoemp <br />(empno,enmae,job,hiredate,sal,deptno) <br />values(2741,my_ename,'cabdriver',my_hiredate,my_sal,20); <br />end; <br /><br />删除 <br />declare <br />bad_child_typechar(20):='naughty'; <br />begin <br />deletefromsantas_gift_listwhere <br />kid_rating=bad_child_type; <br />end; <br /><br />事务处理 <br />commit[WORK&gt;; <br />rollback[WORK&gt;; <br />（关键字WORK可选，但对命令执行无任何影响） <br />savepoint标记名;（保存当前点） <br />在事务中标记当前点 <br />rollback[WORK&gt;to[SAVEPOINT&gt;标记名;（回退到当前保存点） <br />取消savepoint命令之后的所有对数据库的修改 <br />关键字WORK和SAVEPOINT为可选项，对命令执行无任何影响 <br /><br />函数 <br />PL/<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>块中可以使用<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>命令的所有函数 <br />insertintophonebook(lastname)value(upper(my_lastname)); <br />selectavg(sal)intoavg_salfromemp; <br /><br />对于非<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>命令，可使用大多数个体函数 <br />不能使用聚组函数和参数个数不定的函数，如 <br />x:=sqrt(y); <br />lastname:=upper(lastname); <br />age_diff:=months_between(birthday1,birthday2)/12; <br /><br />赋值时的数据类型转换 <br />4种赋值形式: <br />变量名:=表达式 <br />insertinto基表名values(表达式1,表达式2,...); <br />update基表名set列名=表达式; <br />select列名into变量名from...; <br /><br />数据类型间能进行转换的有: <br />char转成number <br />number转成char <br />char转成date <br />date转成char <br /><br />例 <br />char_var:=nm_var; <br />数字型转换成字符型 <br />date_var:='25-DEC-88'; <br />字符型转换成日期型 <br />insertinto表名(num_col)values('604badnumber'); <br />错误，无法成功地转换数据类型 <br /><br />--------- <br />4条件控制 <br />例 <br />declare <br />num_jobsnumber(4); <br />begin <br />selectcount(*)intonum_jobsfromauditions <br />whereactorid=&amp;&amp;actor_idandcalled_back='yes'; <br />ifnum_jobs&gt;100then <br />updateactorsetactor_rating='wordclass' <br />whereactorid=&amp;&amp;actor_id; <br />elsifnum_job=75then <br />updateactorsetactor_rating='daytimesoaps' <br />whereactorid=&amp;&amp;actor_id; <br />else <br />updateactorsetactor_rating='waiter' <br />whereactorid=&amp;&amp;actor_id; <br />endif; <br />endif; <br />commit; <br />end; <br /><br />-------- <br />5循环 <br />语法 <br />loop <br />...... <br />endloop; <br />exit;（退出循环） <br />exit[when&gt;;（退出循环，当满足WHEN时） <br />例1 <br />declare <br />ctrnumber(3):=0; <br />begin <br />loop <br />insertintotable1values('tastesgreat'); <br />insertintotable2values('lessfilling'); <br />ctr:=ctr+1; <br />exitwhenctr=100; <br />endloop; <br />end; <br />（注：如果ctr取为NULL，循环无法结束） <br /><br />例2 <br />FOR语法 <br />for变量&lt;范围&gt;loop <br />...... <br />endloop; <br /><br />declare <br />my_indexchar(20):='fettucinialfredo'; <br />bowlchar(20); <br />begin <br />formy_indexinreverse21..30loop <br />insertintotemp(coll)values(my_index); <br />/*循环次数从30到21*/ <br />endloop; <br />bowl:=my_index; <br />end; <br />跟在inreverse后面的数字必须是从小到大的顺序，必须是整数，不能是变量或表达式 <br /><br />---------- <br />6游标 <br />显式游标 <br /><br />打开游标 <br />open&lt;游标名&gt; <br />例 <br />opencolor_cur; <br /><br />游标属性 <br />%notfound <br />%found <br />%rowcount <br />%isopen <br />例 <br />fetchmy_curintomy_var; <br />whilemy_cur%foundloop <br />(处理数据) <br />fetchmy_curintomy_var; <br />exitwhenmy_cur%rowcount=10; <br />endloop; <br /><br />%notfound属性 <br />取值情况如下： <br />fetch操作没有返回记录，则取值为true <br />fetch操作返回一条记录，则取值为false <br />对游标无fetch操作时，取值为null <br />&lt;游标名&gt;%notfound <br />例 <br />ifcolor_cur%notfoundthen... <br />注：如果没有fetch操作，则&lt;游标名&gt;%notfound将导致出错， <br />因为%notfound的初始值为NULL。 <br /><br />关闭游标 <br />close&lt;游标名&gt; <br />例 <br />closecolor_cur; <br /><br />游标的FOR循环 <br />语法 <br />for&lt;记录名&gt;in&lt;游标名&gt;loop <br />&lt;一组命令&gt; <br />endloop; <br />其中： <br />索引是建立在每条记录的值之上的 <br />记录名不必声明 <br />每个值对应的是记录名，列名 <br />初始化游标指打开游标 <br />活动集合中的记录自动完成FETCH操作 <br />退出循环，关闭游标 <br /><br />隐式游标 <br />隐式游标是指<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>命令中用到的，没有明确定义的游标 <br />insert,update,delete,select语句中不必明确定义游标 <br />调用格式为<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>% <br />存贮有关最新一条<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>命令的处理信息 <br /><br />隐式游标的属性 <br />隐式游标有四个属性 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>%NOTFOUND <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>%FOUND <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>%ROWCOUNT：隐式游标包括的记录数 <br />例： <br />deletefrombaseball_teamwherebatting_avg&lt;100; <br />if<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">sql</b>%rowcount&gt;5thn <br />insertintotemp <br />values('yourteamneedshelp'); <br />endif; <br /><br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>%ISOPEN：取值总为FALSE。<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>命令执行完毕，PL/<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>立即关闭隐式游标。 <br /><br />--------- <br />7标号 <br />GOTO语句 <br />用法： <br />gotoyou_are_here; <br />其中you_are_here是要跳转的语句标号 <br />标号必须在同一组命令，或是同一块中使用 <br /><br />正确的使用 <br />&lt;&gt;（标号） <br />x:=x+1 <br />ifa&gt;bthen <br />b:=b+c; <br />gotodinner; <br />endif; <br /><br />错误的使用 <br />gotojail; <br />ifa&gt;bthen <br />b:=b+c; <br />&lt;&gt;（标号） <br />x:=x+1; <br />endif; <br /><br />标号：解决意义模糊 <br />标号可用于定义列值的变量 <br />&lt;&gt; <br />declare <br />deptnonumber:=20; <br />begin <br />updateempsetsal=sal*1.1 <br />wheredeptno=sample.deptno; <br />commit; <br />endsample; <br />如果不用标号和标号限制符，这条命令将修改每条记录。 <br /><br />---------- <br />8异常处理 <br />预定义的异常情况 <br />任何<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</b>错误都将自动产生一个异常信息 <br />一些异常情况已命名，如： <br />no_data_found当SELECT语句无返回记录时产生 <br />too_many_rows没有定义游标，而SELECT语句返回多条记录时产生 <br />whenevernotfound无对应的记录 <br /><br />用户定义的异常情况 <br />由用户自己获取 <br />在DECLARE部分定义： <br />declare <br />xnumber; <br />something_isnt_rightexception; <br />用户定义的异常情况遵循一般的作用范围规则 <br />条件满足时，获取异常情况：raisesomething_isnt_right <br />注意：同样可以获取预定义的异常情况 <br /><br />exception_init语句 <br />允许为<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</b>错误命名 <br /><br />调用格式： <br />pragmaexception_init(&lt;表达式&gt;,); <br />例 <br />declare <br />deadlock_detectedexception; <br />pragmaexception_init(deadlock_detected,-60); <br /><br />raise语句 <br />单独使用RAISE命令，可再一次获取当前的异常情况（就象异常情况被重复处理了一样）。 <br />在异常处理中，此语句只能单独使用。 <br /><br />异常处理标识符 <br />一组用于处理异常情况的语句： <br />exception <br />when&lt;表达式&gt;or[表达式...&gt;then <br />&lt;一组语句&gt; <br />... <br />whenothersthen--最后一个处理 <br />&lt;一组语句&gt; <br />end;既结束PL/<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>块部分，也结束异常处理部分 <br /><br />-------- <br />练习与答案 <br />1: <br />接收contract_no和item_no值，在inventory表中查找，如果产品： <br />已发货，在arrival_date中赋值为今天后的7天 <br />已订货，在arrival_date中赋值为今天后的一个月 <br />既无订货又无发货，则在arrival_date中赋值为今天后的两个月， <br />并在order表中增加一条新的订单记录。 <br /><br />product_status的列值为'shipped'和'ordered' <br /><br />inventory: <br />product_idnumber(6) <br />product_descriptionchar(30) <br />product_statuschar(20) <br />std_shipping_qtynumber(3) <br /><br />contract_item: <br />contract_nonumber(12) <br />item_nonumber(6) <br />arrival_datedate <br /><br />order: <br />order_idnumber(6) <br />product_idnumber(6) <br />qtynumber(3) <br /><br />答案： <br />declare <br />i_product_idinventory.product_id%type; <br />i_product_descriptioninventory.product_description%type; <br />i_product_statusinventory.product_status%type; <br />i_std_shipping_qtyinventory.std_shipping_qty%type; <br /><br />begin <br />selectproduct_id,product_description,product_status,std_shipping_qty <br />intoi_product_id,i_product_description, <br />i_product_status,i_std_shipping_qty <br />frominventory <br />whereproduct_id=( <br />selectproduct_id <br />fromcontract_item <br />wherecontract_no=&amp;&amp;contractnoanditem_no=&amp;&amp;itemno); <br />ifi_product_status='shipped'then <br />updatecontract_item <br />setarrival_date=sysdate+7 <br />whereitem_no=&amp;&amp;itemnoandcontract_no=&amp;&amp;contractno; <br />elsifi_product_status='ordered'then <br />updatecontract_item <br />setarrival_date=add_months(sysdate,1) <br />whereitem_no=&amp;&amp;itemnoandcontract_no=&amp;&amp;contractno; <br />else <br />updatecontract_item <br />setarrival_date=add_months(sysdate,2) <br />whereitem_no=&amp;&amp;itemnoandcontract_no=&amp;&amp;contractno; <br />insertintoorders <br />values(100,i_product_id,i_std_shipping_qty); <br />endif; <br />endif; <br />commit; <br />end; <br /><br /><br />2: <br />1.找出指定部门中的所有雇员 <br />2.用带'&amp;'的变量提示用户输入部门编号 <br />3.把雇员姓名及工资存入prnttable表中，基结构为： <br />createtableprnttable <br />(seqnumber(7),linechar(80)); <br />4.异常情况为，部门中奖金不为空值的雇员信息才能存入prnttable表中。 <br /><br />答案： <br />declare <br />cursoremp_curis <br />selectename,sal,comm <br />fromempwheredeptno=&amp;dno; <br />emp_recemp_cur%rowtype; <br />null_commissionexception; <br />begin <br />openemp_cur; <br />fetchemp_curintoemp_rec; <br />while(emp_cur%found)loop <br />ifemp_rec.commisnullthen <br />begin <br />closeemp_cur; <br />raisenull_commission; <br />end; <br />endif; <br />fetchemp_curintoemp_rec; <br />endloop; <br />closeemp_sur; <br />exception <br />whennull_commissionthen <br />openemp_cur; <br />fetchemp_curintoemp_rec; <br />while(emp_cur%found)loop <br />ifemp_rec.commisnotnullthen <br />insertintotempvalues(emp_rec.sal,emp_rec.ename); <br />endif; <br />fetchemp_curintoemp_rec; <br />endloop; <br />closeemp_cur; <br />commit; <br />end; <br /><br /> <br /> <br />Java研究组织-版权所有2002-2002 <br /><br /><hr /><br /><br /></font>
		</div>
		<div class="postText">
				<div class="post">
						<center class="postText">
								<b>
										<font size="3">
										</font>
								</b> </center>
						<div class="postText">
								<br />作者：UB时间：2003-08-14 21:06:59<a href="file:///F:/LastDoc/article_update.php?file_ID=1039849547&amp;respond_ID=1060866419&amp;path_re=2002-12-14">[修改]</a><a href="file:///F:/LastDoc/article_respond.php?file_ID=1039849547&amp;user=UB&amp;bid=11&amp;subject=编程探讨&amp;path_re=2002-12-14">[回复]</a><a onclick="javascript: if(confirm('你确定要删除吗？'))				  return;		  return false;" href="file:///F:/LastDoc/del_respond.php?file_ID=1039849547&amp;user=UB&amp;bid=11&amp;subject=编程探讨&amp;path_re=2002-12-14&amp;respond_ID=1060866419">[删除]</a><br /><br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</b>数据库对象与用户管理 <br /><br />一、<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</b>数据库的模式对象的管理与维护 <br /><br />本节的主要内容是关于<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</b>数据库的模式对象的管理与维护，这些模式对象包括：表空间、表、视图、索引、序列、同义词、聚集和完整性约束。对于每一个模式对象，首先描述了它的定义，说明了它的功能，最后以基于<b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>语言的实例说明如何对它们进行管理于维护。 <br /><br />1.1表空间 <br /><br />由于表空间是包含这些模式对象的逻辑空间，有必要先对它进行维护。 <br /><br />创建表空间 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;CREATETABLESPACEjxzy <br /><br />&gt;DATAFILE‘/usr/<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">oracle</b>/dbs/jxzy.dbf’ <br /><br />&gt;ONLINE; <br /><br />修改表空间 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;ALTERTABLESPACEjxzyOFFLINENORMAL; <br /><br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;ALTERTABLESPACEjxzy <br /><br />&gt;RENAMEDATAFILE‘/usr/<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">oracle</b>/dbs/jxzy.dbf’ <br /><br />&gt;TO‘/usr/<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">oracle</b>/dbs/jxzynew.dbf’ <br /><br />&gt;ONLINE <br /><br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;CREATETABLESPACEjxzyONLINE <br /><br />删除表空间 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;DROPTABLESPACEjxzy <br /><br />&gt;INCLUDINGCONTENTS <br /><br />1.2表维护 <br /><br />表是数据库中数据存储的基本单位，一个表包含若干列，每列具有列名、类型、长度等。 <br /><br />表的建立 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;CREATETABLEjxzy.switch( <br /><br />&gt;OFFICE_NUMNUMBER(3,0)NOTNULL, <br /><br />&gt;SWITCH_CODENUMBER(8,0)NOTNULL, <br /><br />&gt;SWITCH_NAMEVARCHAR2(20)NOTNULL); <br /><br />表的修改 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;ALTERTABLEjxzy.switch <br /><br />&gt;ADD(DESCVARCHAR2(30)); <br /><br />表的删除 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;DROPTABLEjxzy.switch <br /><br />&gt;CASCADECONSTRAINTS <br /><br />//删除引用该表的其它表的完整性约束 <br /><br />1.3视图维护 <br /><br />视图是由一个或若干基表产生的数据集合，但视图不占存储空间。建立视图可以保护数据安全（仅让用户查询修改可以看见的一些行列）、简化查询操作、保护数据的独立性。 <br /><br />视图的建立 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;CREATEVIEWjxzy.pole_well_viewAS <br /><br />&gt;(SELECTpole_path_numASpath, <br /><br />poleASdevice_numFROMpole <br /><br />&gt;UNION <br /><br />&gt;SELECTpipe_path_numASpath, <br /><br />&gt;wellASdevice_numFROMwell); <br /><br />视图的替换 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;REPLACEVIEWjxzy.pole_well_viewAS <br /><br />&gt;(SELECTpole_path_numASpath, <br /><br />poleASsupport_deviceFROMpole <br />&gt;UNION <br /><br />&gt;SELECTpipe_path_numASpath, <br /><br />wellASsupport_deviceFROMwell); <br />视图的删除 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;DROPVIEWjxzy.pole_well_view; <br /><br />1.4序列维护 <br /><br />序列是由序列发生器生成的唯一的整数。 <br /><br />序列的建立 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;CREATESEQUENCEjxzy.sequence_cable <br /><br />&gt;STARTWITH1 <br /><br />&gt;INCREMENTBY1 <br /><br />&gt;NO_MAXVALUE; <br /><br />建立了一个序列，jxzy.sequence_cable.currval返回当前值，jxzy.sequence_cable.nextval返回当前值加1后的新值 <br /><br />序列的修改 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;ALTERSEQUENCEjxzy.sequence_cable <br /><br />&gt;STARTWITH1//起点不能修改，若修改，应先删除，然后重新定义 <br /><br />&gt;INCTEMENTBY2 <br /><br />&gt;MAXVALUE1000; <br /><br />序列的删除 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;DROPSEQUENCEjxzy.sequence_cable <br /><br />1.5索引维护 <br /><br />索引是与表相关的一种结构，它是为了提高数据的检索速度而建立的。因此，为了提高表上的索引速度，可在表上建立一个或多个索引，一个索引可建立在一个或几个列上。 <br /><br />对查询型的表，建立多个索引会大大提高查询速度，对更新型的表，如果索引过多，会增大开销。 <br /><br />索引分唯一索引和非唯一索引 <br /><br />索引的建立 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;CREATEINDEXjxzy.idx_switch <br /><br />&gt;ONswitch(switch_name) <br /><br />&gt;TABLESPACEjxzy; <br /><br />索引的修改 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;ALTERINDEXjxzy.idx_switch <br /><br />&gt;ONswitch(office_num,switch_name) <br /><br />&gt;TABLESPACEjxzy; <br /><br />索引的删除 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;DROPINDEXjxzy.idx_switch; <br /><br />1.6完整性约束管理 <br /><br />数据库数据的完整性指数据的正确性和相容性。数据完整型检查防止数据库中存在不符合语义的数据。 <br /><br />完整性约束是对表的列定义一组规则说明方法。<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</b>提供如下的完整性约束. <br /><br />a.NOTNULL非空 <br /><br />b.UNIQUE唯一关键字 <br /><br />c.PRIMATYKEY主键一个表只能有一个，非空 <br /><br />d.FOREIGAKEY外键 <br /><br />e.CHECK表的每一行对指定条件必须是true或未知（对于空值） <br /><br />例如： <br /><br />某列定义非空约束 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;ALTERTABLEoffice_organization <br /><br />&gt;MODIFY(descVARCHAR2(20) <br /><br />&gt;CONSTRAINTnn_descNOTNULL) <br /><br />某列定义唯一关键字 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;ALTERTABLEoffice_organization <br /><br />&gt;MODIFY(office_nameVATCHAR2(20) <br /><br />&gt;CONSTRAINTuq_officenameUNIQUE) <br /><br />定义主键约束，主键要求非空 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;CREATETABLEswitch(switch_codeNUMBER(8) <br /><br />&gt;CONSTRAINTpk_switchcodePRIMARYKEY,) <br /><br />使主键约束无效 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;ALTERTABLEswitchDISABLEPRIMARYKEY <br /><br />定义外键 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;CREATETABLEPOLE(pole_codeNUMBER(8), <br /><br />&gt;office_numnumber(3) <br /><br />&gt;CONSTRAINTfk_officenum <br /><br />&gt;REFERENCESoffice_organization(office_num) <br /><br />&gt;ONDELETECASCADE); <br /><br />定义检查 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;CREATETABLEoffice_organization( <br /><br />&gt;office_numNUMBER(3), <br /><br />&gt;CONSTRAINTcheck_officenum <br /><br />&gt;CHECK(office_numBETWEEN10AND99); <br /><br />二、<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</b>数据库用户与权限管理 <br /><br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</b>是多用户系统，它允许许多用户共享系统资源。为了保证数据库系统的安全，数据库管理系统配置了良好的安全机制。 <br /><br />2.1<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</b>数据库安全策略 <br /><br />建立系统级的安全保证 <br />系统级特权是通过授予用户系统级的权利来实现，系统级的权利（系统特权）包括：建立表空间、建立用户、修改用户的权利、删除用户等。系统特权可授予用户，也可以随时回收。<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</b>系统特权有80多种。 <br /><br />建立对象级的安全保证 <br />对象级特权通过授予用户对数据库中特定的表、视图、序列等进行操作（查询、增、删改）的权利来实现。 <br /><br />建立用户级的安全保证 <br />用户级安全保障通过用户口令和角色机制（一组权利）来实现。引入角色机制的目的是简化对用户的授权与管理。做法是把用户按照其功能分组，为每个用户建立角色，然后把角色分配给用户，具有同样角色的用户有相同的特权。 <br /><br />2.2用户管理 <br /><br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</b>用户管理的内容主要包括用户的建立、修改和删除 <br /><br />用户的建立 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;CREATEUSERjxzy <br /><br />&gt;IDENTIFIEDBYjxzy_password <br /><br />&gt;DEFAULTTABLESPACEsystem <br /><br />&gt;QUATA5MONsystem;//供用户使用的最大空间限额 <br /><br />用户的修改 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;CREATEUSERjxzy <br /><br />&gt;IDENTIFIEDBYjxzy_pw <br /><br />&gt;QUATA10MONsystem; <br /><br />删除用户及其所建对象 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;DROPUSERjxzyCASCADE;//同时删除其建立的实体 <br /><br />2.3系统特权管理与控制 <br /><br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</b>提供了80多种系统特权，其中每一个系统特权允许用户执行一个或一类数据库操作。 <br /><br />授予系统特权 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;GRANTCREATEUSER,ALTERUSER,DROPUSER <br /><br />&gt;TOjxzy_new <br /><br />&gt;WITHADMINOPTION; <br /><br />回收系统特权 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;REVOKECREATEUSER,ALTERUSER,DROPUSER <br /><br />&gt;FROMjxzy_new <br /><br />//但没有级联回收功能 <br /><br />显示已被授予的系统特权（某用户的系统级特权） <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;SELECT*FROMsys.dba_sys_privs <br /><br />2.4对象特权管理与控制 <br /><br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</b>对象特权指用户在指定的表上进行特殊操作的权利。这些特殊操作包括增、删、改、查看、执行（存储过程）、引用（其它表字段作为外键）、索引等。 <br /><br />授予对象特权 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;GRANTSELECT,INSERT(office_num,office_name), <br /><br />&gt;UPDATE(desc)ONoffice_organization <br /><br />&gt;TOnew_adminidtrator <br /><br />&gt;WITHGRANTOPTION; <br /><br />//级联授权 <br /><br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;GRANTALLONoffice_organization <br /><br />&gt;TOnew_administrator <br /><br />回收对象特权 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;REVOKEUPDATEONoffice_orgaization <br /><br />&gt;FROMnew_administrator <br /><br />//有级联回收功能 <br /><br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;REVOKEALLONoffice_organization <br /><br />&gt;FROMnew_administrator <br /><br />显示已被授予的全部对象特权 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;SELECT*FROMsys.dba_tab_privs <br /><br />2.5角色的管理 <br /><br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</b>的角色是命名的相关特权组（包括系统特权与对象特权），<b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</b>用它来简化特权管理，可把它授予用户或其它角色。 <br /><br /><b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE</b>数据库系统预先定义了CONNECT、RESOURCE、DBA、EXP_FULL_DATABASE、IMP_FULL_DATABASE五个角色。CONNECT具有创建表、视图、序列等特权；RESOURCE具有创建过程、触发器、表、序列等特权、DBA具有全部系统特权；EXP_FULL_DATABASE、IMP_FULL_DATABASE具有卸出与装入数据库的特权。 <br /><br />通过查询sys.dba_sys_privs可以了解每种角色拥有的权利。 <br /><br />授予用户角色 <br /><b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL</b>&gt;GRANTDBATOnew_administractor <br /><br />&gt;WITHGRANTOPTION; <br /><b></b></div>
						<div class="postText">
								<b>最大值<br />select greatest(jjkxd_sysj,slkxd_sysj,sp_lgfstl_sysj) from wx_ysjcsj where jh_id=6<br /></b>
						</div>
				</div>
		</div>
		<div class="postText">
				<b>最小值<br />select least(jjkxd_sysj,slkxd_sysj,sp_lgfstl_sysj) from wx_ysjcsj where jh_id=6<br /></b>
		</div>
<img src ="http://www.blogjava.net/ASONG/aggbug/55264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ASONG/" target="_blank">汪松明</a> 2006-06-27 09:57 <a href="http://www.blogjava.net/ASONG/articles/55264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>