??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品V亚洲精品V日韩精品 ,亚洲日本香蕉视频,亚洲国产美女视频http://www2.blogjava.net/ASONG/category/12538.htmlzh-cnTue, 27 Feb 2007 19:27:14 GMTTue, 27 Feb 2007 19:27:14 GMT60oracle数据库的q原和备?/title><link>http://m.tkk7.com/ASONG/articles/92408.html</link><dc:creator>汪松?/dc:creator><author>汪松?/author><pubDate>Mon, 08 Jan 2007 08:27:00 GMT</pubDate><guid>http://m.tkk7.com/ASONG/articles/92408.html</guid><wfw:comment>http://m.tkk7.com/ASONG/comments/92408.html</wfw:comment><comments>http://m.tkk7.com/ASONG/articles/92408.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/ASONG/comments/commentRss/92408.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/ASONG/services/trackbacks/92408.html</trackback:ping><description><![CDATA[     摘要: 理解什么是数据库恢?    当我们用一个数据库Ӟd望数据库的内Ҏ可靠的、正的Q但׃计算机系l的故障Q硬件故障、Y件故障、网l故障、进E故障和pȝ故障Q媄响数据库pȝ的操作,影响数据库中数据的正性,甚至破坏数据库,使数据库中全部或部分数据丢失。因此当发生上述故障后,希望能重构这个完整的数据库,该处理称为数据库恢复。恢复过E大致可...  <a href='http://m.tkk7.com/ASONG/articles/92408.html'>阅读全文</a><img src ="http://m.tkk7.com/ASONG/aggbug/92408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/ASONG/" target="_blank">汪松?/a> 2007-01-08 16:27 <a href="http://m.tkk7.com/ASONG/articles/92408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle性能调整的误?/title><link>http://m.tkk7.com/ASONG/articles/92406.html</link><dc:creator>汪松?/dc:creator><author>汪松?/author><pubDate>Mon, 08 Jan 2007 08:24:00 GMT</pubDate><guid>http://m.tkk7.com/ASONG/articles/92406.html</guid><wfw:comment>http://m.tkk7.com/ASONG/comments/92406.html</wfw:comment><comments>http://m.tkk7.com/ASONG/articles/92406.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/ASONG/comments/commentRss/92406.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/ASONG/services/trackbacks/92406.html</trackback:ping><description><![CDATA[Z提高性能,我们针对Oracle数据库本w提供了的方法或Ҏq行q不的试Q主要包? <p>    <strong>׃n服务器模?MTS)<br />    集群技?Clustering)RAC <br />    分区<br />    q行处理(主要是ƈ行查?</strong></p><p>    Oracle提供的这些特性确实是用来q行性能改善?但我们往往忽略了对自n应用Ҏ的分析,它们是否适合于我?最q?通过对这斚w知识的深入了?发现我们以前存在一些错误的认识.我觉得有必要,大家一h改变q种误解.</p><p>    分析之前,先明一下我们的应用Ҏ?数据库应用大体可以分为OLAP和OLTP两大c??联机事务分析(数据仓库)和联Z务处?事务应用)我们的应用系l?其应用特性主要是联机事务处理,又包含了量的数据仓库特?</p><p>    <strong>1.׃n服务?MTS)</strong></p><p>    Oracle~省用的是专用服务器模式,也就是说一个用戯接进E对应一个服务器的进E?记得某大医院刚启用的时?我们曄试过MTS.因ؓ听说MTS在不增加内存和CPU的情况下q接更多的客L,l果q不是我们预期的那样.MTS有问题吗?不是,是因为我们对MTS不了?q不是它有问?而是它不是用来在q种情况下做qg事的.</p><p>    一般情?只有当ƈ发连接数过了操作系l的支持?才徏议用MTS,否则应该使用~省的专用服务器模式.也就是说,在专用服务器模式?因ؓ多一个连接就要多消耗一个操作系l的q程,只有当ƈ发应用需求超q操作系l的允许q接数时,才有必要考虑MTS.<br />    如果现有pȝ,物理上支?00个连接的专用服务器数据库,改ؓ使用׃n服务器模?也许支持1000个连?但同时活动的q接可能只有100?一??个CPU的服务器,应对200?00个ƈ发连接是_?如果q接增加?可以增加CPU和内?</p><p>    MTSh以下一些缺?</p><p>    1.׃n服务器的代码路径比专用服务器?所以它天生比专用服务器慢.<br />    2.存在Zؓ死锁的可?因ؓ它是串行?所有共享服务器l定在一?一个进E?,只要一个连接阻?则所有用户阻?q且极可能死?<br />    3.存在独占事务的可?因ؓ如果一个会话的事务q行旉q长,它独占共享资?其它用户只能{待.(而专用服务器,每个客户端是一个会?<br />    4.׃n服务器模式限制了某些数据库特?例如:不能单独启动和关闭实?不能q行介质恢复,不能使用Log Miner,不能使用,q且SQL_TRACE没有意义(因ؓ是共享而不是当前会话的).</p><p>    MTS减少的内存实际上是专用服务器模式下每个用戯接到操作pȝq程所需的内?但它却用SGA的Large_Pool来分配UGA,拆东墙补西墙,所减少的内存是很少?如果用户会话的连接和断开很频J?数据库进E的创徏和删除的开销会非常大,q种情况最好采用共享服务器模式(否则,应该使用q接池技?.所q的?我们产品的设计可能就考虑了这个因?使用的是一ơ连接终w?会话生命周期?,避免了这U情?</p><p>    所?lg所q?针对我们产品,采用~省的专用服务器模式,q接不够?通过增加g解决,而不是改用MTS.另外,实际?Oracle可以同时支持׃n服务器和专用服务器模?可以指定一个会话用专用服务器,另一个会话用共享服务器.</p><p>    <strong>2.集群技?RAC)</strong></p><p>    Oracle RAC(Real Application Clusters),我们说的双机定w是RAC的一U? 集群技术的优势在在于横向扩展性能,q提供高可用?32位的操作pȝ?G内存的限?有些Unixpȝ(以及非高U版本的Windows)有CPU个数的限?而集技术通过集合多台机器协同工作,横向打破了这U限?通过RAC,一台服务器一个实?多台机器构成一个实例服务集,客户端连接到它上?q项技?我们有时对客戯是负载均?实际上这是片面的,RAC的主要针对的是CPU和内存的负蝲均衡,q没有实现磁盘IO的负载均?(当然,盘IO可以通过Raid或NAS来实?</p><p>    RACq有一个好处是,提高了可用?也就是说一台服务器坏掉?注意:不是数据存储介质),不媄响正怋?像负蝲均衡一?它提高了数据层以上的可用?但不是全?因ؓ数据坏了,它也没有办法.(数据?那是Oracle Data Guard的事?或者干脆说那是存储g的事)</p><p>    但是,RAC带来好处的同?也带来了性能的媄?因ؓ它要全局协调数据高速缓?保证每个实例上连接的用户看到的缓存数据是一致的,所以把以下三方面的矛盾攑֤:</p><p>    <br />    1.高速缓存争?br />    2.q多的I/O<br />    3.锁定</p><p>    也就是说,如果q些斚w有问?用了RAC后问题就会更?例如:׃SQL没有使用l定变量D高速缓存争?用了RAC会更严重.<br />    M,如果你的服务器的CPU插满?内存也加到极限了,而ƈ发用戯在不断增?或者你Ҏ障停机时间要求非帔R,RAC无疑是你应该选择?</p><p>    <strong>3.分区</strong></p><p>    Oracle的分区用途在于把大的表或索引分成的片段,以便更容易管?我们以前可能错误的认为分区就是fast=true,可以提高速度,也在肿瘤和儿U做q这斚w的试?实际?在事务处理系l中,分区一般不能加快查询速度(某些情况下可能会减少对共享资源的争用).Oracle的分区特?主要是针Ҏ据仓库来设计?也就是说你的某张表如果有100G的大?最好用分?好处有以下三个方?</p><p>    1.提高可用?/p><p>    分区的原理就是分而治?如果一张表划分为多个分?其中一个分区所在的介质Z问题,不媄响整个表的其它分区数据的讉K.</p><p>    2.易于理</p><p>    在数据仓库下,表分成小的片?更容易批量的删除,片整理,以及一些ƈ行处?</p><p>    3.提高性能</p><p>    q方?通过分区来达到是最困难?必须l过周密的计来安排分区数据.</p><p>    分区的规划是复杂?拿我们品应用来?一般查询涉及到多个?多个索引,假设我们把病用记?药品收发记录,病hd记录q类大表建立分区.昄,范围分区Ҏ们提升性能用处不大,散列分区才是我们查询需求的,但大多数数据的散列又不够集中.再加?q些表上的烦引这么多,常用的ID,旉cȝ引就不少,很少有h能做到把它们全部q行全局分区或准的q行范围分区(实际上可能根本无法按需求进行多个烦引的范围分区).如果查询l常涉及多个索引,如何保证用到的每个烦引都在一个分Z,如果不是,必然扫描多个分区,增加逻辑I/O和CPU旉,从而增加查询时?(数据分布在不同物理存储介质的情况,在下面的q行处理中再讨论)</p><p>    再来看一?某些情况下可能会减少对共享资源的争用是指什?是指q行修改和更C更快.仔细分析,我们分区的原则是什?一般最常用的可能是按时间段q行范围分区,q样,修改和更新绝大多数还是在同一个分Zq行,所以对减少׃n资源的争用这斚w,基本没有什么效?(有按U室IDq行散列分区的对应的唯一应用需求吗?有基于列表分?典型特征?的对应的唯一应用需求吗?基本上没?)分区主要从ƈ行的角度来提高性能,但事务处理系l本w应用特性决定了它不适合q种技?也就是说,针对我们产品的事务处理应用特?Ҏ没有必要采用分区技?</p><p>    <strong>4.q行处理</strong></p><p>    Ҏ我们的应用特?主要分析q行查询.一般要求配合分区特?多CPUg.自Oracle 8.1.6?增加了一个自动调节ƈ行查询的选项:PARALLEL_AUTOMATIC_TUNING=TRUE在相应的表上讄PARALLEL参数,Oracle׃在适当的时候自动ƈ行化该表上的操作.q行查询对事务处理系l基本上没有?因ؓq行查询的设计是针对数据仓库中的单用户完全消?00的资源而做?而事务处理中,往往有很多ƈ发用?他们争用q资源,所以你惛_法让一个用户占用所有的资源是适得其反</p><div class="yhfmezn" id="ParagraphCount" style="DISPLAY: none">1</div><img src ="http://m.tkk7.com/ASONG/aggbug/92406.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/ASONG/" target="_blank">汪松?/a> 2007-01-08 16:24 <a href="http://m.tkk7.com/ASONG/articles/92406.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL语句优化技术分?/title><link>http://m.tkk7.com/ASONG/articles/86900.html</link><dc:creator>汪松?/dc:creator><author>汪松?/author><pubDate>Mon, 11 Dec 2006 06:44:00 GMT</pubDate><guid>http://m.tkk7.com/ASONG/articles/86900.html</guid><wfw:comment>http://m.tkk7.com/ASONG/comments/86900.html</wfw:comment><comments>http://m.tkk7.com/ASONG/articles/86900.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/ASONG/comments/commentRss/86900.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/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: 宋体">操作W优?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span lang="EN-US">IN </span></b><b><span style="FONT-FAMILY: 宋体">操作W?/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: 宋体">的优Ҏ比较Ҏ写及清晰易懂Q这比较适合C软g开发的风格?/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: 宋体">性能L比较低的Q从</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: 宋体">里面的子查询Q再查询外层的表记录Q如果{换成功则直接采用多个表的q接方式查询。由此可见用</span><span lang="EN-US">IN</span><span style="FONT-FAMILY: 宋体">?/span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">臛_多了一个{换的q程。一般的</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">都可以{换成功,但对于含有分l统计等斚w?/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: 宋体">推荐ҎQ在业务密集?/span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">当中量不采?/span><span lang="EN-US">IN</span><span style="FONT-FAMILY: 宋体">操作W?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span lang="EN-US">NOT IN</span></b><b><span style="FONT-FAMILY: 宋体">操作W?/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: 宋体">此操作是强列推荐不用的Q因为它不能应用表的索引?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span>       </span></span><span style="FONT-FAMILY: 宋体">推荐ҎQ用</span><span lang="EN-US">NOT EXISTS </span><span style="FONT-FAMILY: 宋体">或(外连?/span><span lang="EN-US">+</span><span style="FONT-FAMILY: 宋体">判断为空Q方案代?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span lang="EN-US"><> </span></b><b><span style="FONT-FAMILY: 宋体">操作W(不等于)</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: 宋体">不等于操作符是永q不会用到烦引的Q因此对它的处理只会产生全表扫描?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"><span style="FONT-FAMILY: 宋体">推荐ҎQ用其它相同功能的操作运代替,?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"><span lang="EN-US"><span>       </span>a<>0 </span><span style="FONT-FAMILY: 宋体">改ؓ</span><span lang="EN-US"> a>0 or a<0</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"><span lang="EN-US"><span>       </span>a<>’?</span><span style="FONT-FAMILY: 宋体">改ؓ</span><span lang="EN-US"> a>’?/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: 宋体">操作Q判断字D|否ؓI)</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: 宋体">推荐ҎQ?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体">用其它相同功能的操作q算代替Q如</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>0 </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></span><span style="FONT-FAMILY: 宋体">不允许字DؓI,而用一个缺省g替空|如业扩申请中状态字D不允许为空Q缺省ؓ甌?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span>       </span></span><span style="FONT-FAMILY: 宋体">建立位图索引Q有分区的表不能建,位图索引比较难控Ӟ如字D值太多烦引会使性能下降Q多人更新操作会增加数据块锁的现象)</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">> </span></b><b><span style="FONT-FAMILY: 宋体">?/span><span lang="EN-US"> < </span></b><b><span style="FONT-FAMILY: 宋体">操作W(大于或小于操作符Q?/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: 宋体">大于或小于操作符一般情况下是不用调整的Q因为它有烦引就会采用烦引查找,但有的情况下可以对它q行优化Q如一个表?/span><span lang="EN-US">100</span><span style="FONT-FAMILY: 宋体">万记录,一个数值型字段</span><span lang="EN-US">A</span><span style="FONT-FAMILY: 宋体">Q?/span><span lang="EN-US">30</span><span style="FONT-FAMILY: 宋体">万记录的</span><span lang="EN-US">A=0</span><span style="FONT-FAMILY: 宋体">Q?/span><span lang="EN-US">30</span><span style="FONT-FAMILY: 宋体">万记录的</span><span lang="EN-US">A=1</span><span style="FONT-FAMILY: 宋体">Q?/span><span lang="EN-US">39</span><span style="FONT-FAMILY: 宋体">万记录的</span><span lang="EN-US">A=2</span><span style="FONT-FAMILY: 宋体">Q?/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>2</span><span style="FONT-FAMILY: 宋体">?/span><span lang="EN-US">A>=3</span><span style="FONT-FAMILY: 宋体">的效果就有很大的区别了,因ؓ</span><span lang="EN-US">A>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: 宋体">的记录烦引再q行比较Q?/span><span lang="EN-US">A>=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: 宋体">操作W?/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: 宋体">操作W可以应用通配W查询,里面的通配W组合可能达到几乎是L的查询,但是如果用得不好则会产生性能上的问题Q如</span><span lang="EN-US">LIKE ?5400%?</span><span style="FONT-FAMILY: 宋体">q种查询不会引用索引Q?/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: 宋体">q个条g会生全表扫描,如果Ҏ</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: 宋体">的烦引进行两个范围的查询Q性能肯定大大提高?/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: 宋体">操作W?/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: 宋体">在进行表链接后会{选掉重复的记录,所以在表链接后会对所产生的结果集q行排序q算Q删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是q程表与历史?/span><span lang="EN-US">UNION</span><span style="FONT-FAMILY: 宋体">。如Q?/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: 宋体">q个</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">在运行时先取Z个表的结果,再用排序I间q行排序删除重复的记录,最后返回结果集Q如果表数据量大的话可能会导致用盘q行排序?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体">推荐ҎQ采?/span><span lang="EN-US">UNION ALL</span><span style="FONT-FAMILY: 宋体">操作W替?/span><span lang="EN-US">UNION</span><span style="FONT-FAMILY: 宋体">Q因?/span><span lang="EN-US">UNION ALL</span><span style="FONT-FAMILY: 宋体">操作只是单的两个结果合q后p回?/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: 宋体">E序员写的ؓ</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: 宋体">E序员写的ؓ</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: 宋体">Q带表所有者的前缀Q?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">C</span><span style="FONT-FAMILY: 宋体">E序员写的ؓ</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: 宋体">Q大写表名)</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US">D</span><span style="FONT-FAMILY: 宋体">E序员写的ؓ</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: 宋体">Q中间多了空|</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: 宋体">分析整理之后产生的结果及执行的时间是一LQ但是从</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">׃n内存</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: 宋体">都会对其q行一ơ分析,q且占用׃n内存Q如果将</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">的字W串及格式写得完全相同则</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">只会分析一ơ,׃n内存也只会留下一ơ的分析l果Q这不仅可以减少分析</span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">的时_而且可以减少׃n内存重复的信息,</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: 宋体">子句后面的条仉序对大数据量表的查询会生直接的影响Q如</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: 宋体">Q电压等U)?span lang="EN-US">xh_bz</span>Q销h志)两个字段都没q行索引Q所以执行的时候都是全表扫描,W一?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: 宋体">条g在记录集内比率ؓ<span lang="EN-US">99%</span>Q?/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>Q在q行W一?span lang="EN-US">SQL</span>的时?span lang="EN-US">99%</span>条记录都q行</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: 宋体">的比较,而在q行W二?span lang="EN-US">SQL</span>的时?span lang="EN-US">0.5%</span>条记录都q行</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: 宋体">的比较,以此可以得出W二?span lang="EN-US">SQL</span>?span lang="EN-US">CPU</span>占用率明显比W一条低?/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: 宋体">执行性能影响Q在没有索引?/span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">没有对表q行l计分析的情况下</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">会按表出现的序q行链接Q由此因的顺序不对会产生十分耗服务器资源的数据交叉。(注:如果对表q行了统计分析,</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">会自动先q小表的链接Q再q行大表的链接)</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: 宋体">Ҏ件字D늚一些优?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span style="FONT-FAMILY: 宋体">采用函数处理的字D不能利用烦引,如:</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: 宋体">Q优化处理:</span><span lang="EN-US">hbs_bh like ?400%?/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: 宋体">Q?优化处理Q?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>=trunc(<b>sysdate</b>) <b>and</b> sk_rq<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: 宋体">q行了显式或隐式的运的字段不能q行索引Q如Q?/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>50</span><span style="FONT-FAMILY: 宋体">Q优化处理:</span><span lang="EN-US">ss_df>30</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US">‘X’||hbs_bh>’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: 宋体">Q优化处理:</span><span lang="EN-US">hbs_bh>?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: 宋体">Q优化处理:</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: 宋体">Q优化处理:</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: 宋体">Q?b>注:</b>此条件对</span><span lang="EN-US">hbs_bh </span><span style="FONT-FAMILY: 宋体">q行隐式?/span><span lang="EN-US">to_number</span><span style="FONT-FAMILY: 宋体">转换Q因?/span><span lang="EN-US">hbs_bh</span><span style="FONT-FAMILY: 宋体">字段是字W型?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span style="FONT-FAMILY: 宋体">条g内包括了多个本表的字D运时不能q行索引Q如Q?/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>cx_df</span><span style="FONT-FAMILY: 宋体">Q无法进行优?/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: 宋体">Q优化处理:</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: 宋体">Q提C)处理</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: 宋体">q行以下斚w的提C?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span style="FONT-FAMILY: 宋体">目标斚w的提C:</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: 宋体">Q按成本优化Q?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US">RULE</span><span style="FONT-FAMILY: 宋体">Q按规则优化Q?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US">CHOOSE</span><span style="FONT-FAMILY: 宋体">Q缺省)Q?/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: 宋体">Q所有的行尽快返回)</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US">FIRST_ROWS</span><span style="FONT-FAMILY: 宋体">Q第一行数据尽快返回)</span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span style="FONT-FAMILY: 宋体">执行Ҏ的提C:</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: 宋体">Q?/span><span lang="EN-US">NESTED LOOPS</span><span style="FONT-FAMILY: 宋体">方式联合Q?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US">USE_MERGE</span><span style="FONT-FAMILY: 宋体">Q?/span><span lang="EN-US">MERGE JOIN</span><span style="FONT-FAMILY: 宋体">方式联合Q?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 10.5pt"><span lang="EN-US">USE_HASH</span><span style="FONT-FAMILY: 宋体">Q?/span><span lang="EN-US">HASH JOIN</span><span style="FONT-FAMILY: 宋体">方式联合Q?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span style="FONT-FAMILY: 宋体">索引提示Q?/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: 宋体">Q?/span><span lang="EN-US">TABLE INDEX</span><span style="FONT-FAMILY: 宋体">Q(使用提示的表索引q行查询Q?/span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b><span style="FONT-FAMILY: 宋体">其它高提示Q如q行处理{等Q?/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: 宋体">的提C功能是比较强的功能Q也是比较复杂的应用Qƈ且提C只是给</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">执行的一个徏议,有时如果Z成本斚w的考虑</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">也可能不会按提示q行。根据实践应用,一般不开发h员应?/span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">提示Q因为各个数据库及服务器性能情况不一P很可能一个地Ҏ能提升了,但另一个地方却下降了,</span><span lang="EN-US">ORACLE</span><span style="FONT-FAMILY: 宋体">?/span><span lang="EN-US">SQL</span><span style="FONT-FAMILY: 宋体">执行分析斚w已经比较成熟Q如果分析执行的路径不对首先应在数据库结构(主要是烦引)、服务器当前性能Q共享内存、磁盘文件碎片)、数据库对象Q表、烦引)l计信息是否正确q几斚w分析?/span></p></span> <img src ="http://m.tkk7.com/ASONG/aggbug/86900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/ASONG/" target="_blank">汪松?/a> 2006-12-11 14:44 <a href="http://m.tkk7.com/ASONG/articles/86900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用SQL语句书写技??http://m.tkk7.com/ASONG/articles/86847.html汪松?/dc:creator>汪松?/author>Mon, 11 Dec 2006 03:49:00 GMThttp://m.tkk7.com/ASONG/articles/86847.htmlhttp://m.tkk7.com/ASONG/comments/86847.htmlhttp://m.tkk7.com/ASONG/articles/86847.html#Feedback0http://m.tkk7.com/ASONG/comments/commentRss/86847.htmlhttp://m.tkk7.com/ASONG/services/trackbacks/86847.htmlSQLl构化查询字W串的改写,是实现数据库查询性能提升的最现实、最有效的手D,有时甚至是唯一的手D,比如在不允许大幅度修改现有数据库l构的情况下?br />通过优化SQL语句提高查询性能的关键是Q?br />?Ҏ实际需求情况,建立合适的索引Q?br />?使用一切可能的方式d用好索引Q避免全表扫描;
?量减少内存及数据I/O斚w的开销

一?建立索引
Q一Q徏立“适当”的索引Q是快速查询的基础?br />索引QindexQ是除表之外另一重要的、用户定义的存储在物理介质上的数据结构。当Ҏ索引码的值搜索数据时Q烦引提供了Ҏ据的快速访问。事实上Q没有烦引,数据库也能根据Select语句成功地检索到l果Q但随着表变得越来越大,使用“适当”的索引的效果就来明显。注意,在这句话中,我们用了“适当”这个词Q这是因为,如果使用索引时不认真考虑其实现过E,索引既可以提高也会破坏数据库的工作性能?br />索引实际上是一U特D的目录QSQL SERVER提供了两U烦引:
?聚集索引Qclustered indexQ也U聚cȝ引、簇集烦引)
我们把这U正文内Ҏw就是一U按照一定规则排列的目录UCؓ“聚集烦引”?br />例如Q?br />汉语字典中按拼音查某一个字Q就是用“聚集烦引”,实际上,你根本用不着查目录,直接在字典正文里找,p很快扑ֈ需要的汉字Q假设你知道发音Q?br />?非聚集烦引(nonclustered indexQ也U非聚类索引、非集索引Q?br />我们把目录纯_Ҏ目录Q正文纯_Ҏ正文的排序方式称为“非聚集索引”?br />例如Q?br />汉语字典中按部首查某一个字Q部首目录和正文一定要L的通过늠才能联系CP光序不是天然一致的?br />
聚集索引与非聚集索引的最大区别就在于Q聚集烦引是对原数据表进行排序,因此只要W合索引条gQ就能够直接q箋的读取数据记录,几乎可以辑ֈҎ据表的零扫描Q而非聚集索引仅仅只是另外Z一张烦引表Q取数据的时候,从烦引表取得l果后,q需要到指针所指的数据行读取相应数据,因此Q在性能上,聚集索引会大大优于非聚集索引?br />  但是在一张表中,聚集索引只允怸个,是比较宝늚Q因此要可能的用于那些使用频率最高的索引上?另外Q查询时必需要用到烦引的起始列,否则索引无效。另外,起始列也必需是用频J的列,那样的烦引性能才会辑ֈ最优化?br />
Q二Q表Q何时应使用聚集索引或非聚集索引

动作描述 使用聚集索引 使用非聚集烦?br />列经常被分组排序 ??br />q回某范围内的数??
一个或极少不同?
数目的不同??
大数目的不同??br />频繁更新的列 ?br />外键???br />主键???br />频繁修改索引??br />
Q三Q烦引徏立的一些注意项
1、不要把聚集索引费在主键上Q除非你只按主键查询
虽然SQL SERVER默认是在主键上徏立聚集烦引的Q但实际应用中,q样做比较浪贏V通常Q我们会在每个表中都建立一个ID列,以区分每条数据,q且q个ID列是自动增大的,步长一般ؓ1。此Ӟ如果我们这个列设ؓ主键QSQL SERVER会将此列默认集烦?/font>。这样做有好处,是可以让您的数据在数据库中按照IDq行物理排序Q但q样做实用hg大?br />从我们前面谈到的聚集索引的定义我们可以看出,使用聚集索引的最大好处就是能够根据查询要求,q速羃查询范_避免全表扫描。在实际应用中,因ؓIDh自动生成的,我们q不知道每条记录的IDP所以我们很隑֜实践中用IDhq行查询。这׃让ID可个主键作集烦引成ZU资源浪贏V聚集烦引相对与非聚集烦引的优势是很明显的,而每个表中只能有一个聚集烦引的规则Q这使得聚集索引变得更加宝贵Q应该用在其他查询频率高的字D上。其ơ,让每个ID号都不同的字D作集烦引也不符合“大数目的不同值情况下不应建立聚合索引”规?/font>Q当Ӟq种情况只是针对用户l常修改记录内容Q特别是索引的时候会负作用,但对于查询速度q没有媄响?br />
2、烦引的建立要根据实际应用需求来q行
q是在M字段上简单地建立索引p提高查询速度?font color="#000080">聚集索引建立的规则大致是“既不能l大多数都相同,又不能只有极数相同?/font>。D个例子,在公文表的收发日期字D上建立聚合索引是比较合适的。在政务pȝ中,我们每天都会收一些文Ӟq些文g的发文日期将会相同,在发文日期上建立聚合索引Ҏ能的提升应该是相当大的。在集索引下,数据物理上按序存于数据上Q重复g排列在一P因而在范围查找Ӟ可以先找到这个范围的h点,且只在这个范围内扫描数据,避免了大范围扫描Q提高了查询速度?br />另一个相反的例子Q比如在雇员表的“性别”列上只有“男”与“女”两个不同|因此完全没必要建立索引?br />
3、在聚集索引中加入所有需要提高查询速度的字D,形成复合索引
Ҏ一些实验的l果Q我们可以得Z些可供参考的l论Q?br />?仅用复合聚集索引的v始列作ؓ查询条g和同时用到复合聚集烦引的全部列的查询Q速度是几乎一LQ甚x后者还要快Q在查询l果集数目一L情况下)Q?br />?仅用复合聚集索引的非起始列作为查询条件的话,
q个索引是不起Q何作用的?br />?复合聚集索引的所有列都用上,而且因ؓ查询条g严格Q查询结果少的话Q会形成“烦引覆盖”,性能可以辑ֈ最优?br />?最重要的一点:无论是否l常使用复合聚合索引的其他列Q其起始列一定要是用最频繁的列?br />
4.Ҏ实践得出的一些其他经验,特定情况下有?
?用聚合烦引比用不是聚合烦引的主键速度快;
?用聚合烦引比用一般的主键作order by速度快,特别是在数据量情况Q?br />?使用聚合索引内的旉D,搜烦旉会按数据占整个数据表的百分比成比例减,而无合烦引用了多少个;
?日期列不会因为有分秒的输入而减慢查询速度Q?br />?׃改变一个表的内容,会引v索引的变化。频J的insert,update,delete语句导致系l花费较大的代hq行索引更新Q引h体性能的下降。一般来Ԍ在对查询性能的要求高于对数据l护性能要求Ӟ应该量使用索引Q否则,p慎重考虑一下付出的代h。在某些极端情况下,可先删除索引Q再Ҏ据库表更新大量数据,最后再重徏索引Q新建立的烦引L比较好用?br />
二?~写优化的SQL语句Q充分利用烦?br />下面某些SQL语句的where子句~写中需要注意的问题作详l介l。在q些where子句中,即某些列存在烦引,但是׃~写了劣质的SQLQ系l在q行该SQL语句时也不能使用该烦引,而同样用全表扫描,q就造成了响应速度的极大降低?br />SQL语句在提交给数据库进行操作前Q都会经q查询分析阶D,SQLSERVER内置的查询优化器会分析查询条件的的每个部分,q判断这些条件是否符合扫描参敎ͼSARGQ的标准。只有当一个查询条件符合SARG的标准,才可以通过预先讄的烦引,提升查询性能?br />SARG的定义:用于限制搜烦操作的一U规范,通常是指一个特定的匚wQ一个确定范围内的匹配或者两个以上条件的ANDq接。一般Ş式如下:
列名 操作W?<常数 ?变量>
?br /><常数 ?变量> 操作W?列名
列名可以出现在操作符的一边,而常数或变量出现在操作符的另一辏V如Q?br />Name=’张三?br />h>5000
5000<h
Name=’张三?and h>5000
如果一个表辑ּ不能满SARG的Ş式,那它无法限制搜索的范围了,也就是说SQL SERVER必须Ҏ一行都判断它是否满Where子句中的所有条Ӟ既进行全表扫描。所以,一个烦引对于不满SARG形式的表辑ּ来说是无用的, 如:当查询条件ؓ“h?2 >5000”时Q就无法利用建立在h格字D上的烦??br />SQLSERVER内置了查询优化器Q能一些条件自动{换ؓW合SARG标准Q如Q将“h?2 >5000?转换为“h?>2500/2 ”,以达到可以用烦引的目的Q但q种转化不是100%可靠的,有时会有语义上的损失Q有时{化不了。如果对“查询优化器”的工作原理不是特别了解Q写出的SQL语句可能不会按照您的本意q行查询。所以不能完全依赖查询优化器的优化,大家q是利用自己的优化知识,可能显式的书写出符合SARG标准的SQL语句Q自行确定查询条件的构徏方式Q这样一斚w有利于查询分析器分析最佳烦引匹配顺序,另一斚w也有利于今后重读代码?br />介绍完SARG后,我们再结合一些实际运用中的例子来做进一步的讲解Q?br />1?Like语句是否属于SARG取决于?通配W的样式
如:name like ‘张%?Q这属于SARG
而:name like ?张?,׃属于SARG

通配W?在字W串首字W的使用会导致烦引无法用,虽然实际应用中很N免这LQ但q是应该对这U现象有所了解Q至知道此U用法性能是很低下的?br />2?“非”操作符不满SARG形式Q得烦引无法?
不满SARG形式的语句最典型的情况就是包括非操作W的语句Q如QNOT?=?lt;>?<?>、NOT EXISTS、NOT IN、NOT LIKE{?/font>
下面是一个NOT子句的例子:
  ... where not (status ='valid')
  notq算W也隐式的包含在另外一些逻辑q算W中Q比?lt;>q算W。见下例Q?br />  ... where status <>'invalid';

  再看下面q个例子Q?br />  select * from employee where salary<>3000;
  对这个查询,可以改写Z使用notQ?br />  select * from employee where salary<3000 or salary>3000;

  虽然q两U查询的l果一P但是W二U查询方案会比第一U查询方案更快些。第二种查询允许对salary列用烦引,而第一U查询则不能使用索引?br />
3?函数q算不满SARG形式Q得烦引无法?/font>
例:下列SQL条g语句中的列都建有恰当的烦引,但执行速度却非常慢Q?br />select * from record where substring(card_no,1,4)=?378?13U?
select * from record where amount/30< 1000Q?1U)
select * from record where convert(char(10),date,112)=?9991201Ԍ10U)
分析Q?
where子句中对列的M操作l果都是在SQLq行旉列计算得到的,因此它不得不q行全表扫描Q而没有用该列上面的索引Q如果这些结果在查询~译时就能得刎ͼ那么可以被SQL优化器优化,使用索引Q避免表搜烦Q因此将SQL重写成下面这P
select * from record where card_no like ?378%Ԍ< 1U)
select * from record where amount < 1000*30Q?lt; 1U)
select * from record where date= ?999/12/01?Q?lt; 1U)

你会发现SQL明显快很?br />
4?量不要对徏立了索引的字D,作Q何的直接处理
select * from employs where first_name + last_name ='beill cliton';
无法使用索引

改ؓQ?br />select * from employee where
first_name = substr('beill cliton',1,instr('beill cliton',' ')-1)
and
last_name = substr('beill cliton',instr('beill cliton',' ')+1)
则可以用烦?br />5?不同cd的烦引效能是不一LQ应可能先使用效能高的
比如Q数字类型的索引查找效率高于字符串类型,定长字符串charQnchar的烦引效率高于变长字W串varchar,nvarchar的烦引?/font>
应该?br />where username='张三' and age>20
改进?br />where age>20 and username='张三'
注意Q?br />
此处QSQL的查询分析优化功能可以做到自动重排条仉序,但还是徏议预先手工排列好?br />

6?量不要使用 is null ?is not null作ؓ查询条g
  M包含null值的列都不会被包含在烦引中Q如果某列数据中存在I|那么对该列徏立烦引的性能提升是值得怀疑的Q尤其是null作ؓ查询条g的一部分时。徏议一斚w避免使用is null和is not null, 另一斚w不要让数据库字段中存在null, 即没有内容Q也应利用缺省|或者手动的填入一个|?’?I字W串?/font>

7?某些情况下IN 的作用与OR 相当 Q且都不能充分利用烦?br />例:表stuff?00000行,id_no上有非群集烦引,L下面q个SQLQ?br />select count(*) from stuff where id_no in(???? Q?3U)

where条g中的′in′在逻辑上相当于′orԌ所以语法分析器会将in (????转化为id_no =??or id_no=?′来执行。我们期望它会根据每个or子句分别查找Q再结果相加,q样可以利用id_no上的索引Q但实际?它却采用?OR{略"Q即先取出满x个or子句的行Q存入时数据库的工作表中,再徏立唯一索引以去掉重复行Q最后从q个临时表中计算l果。因此,实际q程没有利用id_no上烦引,q且完成旉q要受tempdb数据库性能的媄响?
实践证明Q表的行数越多,工作表的性能p差,当stuff?20000行时Q执行时间会非常长!如果定不同的条件不会生大量重复|q不如将or子句分开Q?br />select count(*) from stuff where id_no=??
select count(*) from stuff where id_no=??br />得到两个l果Q再用union作一ơ加法合。因为每句都使用了烦引,执行旉会比较短Q?
select count(*) from stuff where id_no=??
union
select count(*) from stuff where id_no=??br />从实跉|果来看,使用union在通常情况下比用or的效率要高的多,而exist关键字和in关键字在用法上类?/font>Q性能上也cMQ都会生全表扫描,效率比较低下Q根据未l验证的说法Qexist可能比in要快些?br />
8?使用变通的Ҏ提高查询效率
  like关键字支持通配W匹配,但这U匹配特别耗时。例如:select * from customer where zipcode like ?1_ _ _”,即在zipcode字段上已建立了烦引,在这U情况下也可能还是采用全表扫描方式。如果把语句改ؓQselect * from customer where zipcode >?1000”,在执行查询时׃利用索引Q大大提高速度。但q种变通是有限制的Q不应引起业务意义上的损失,对于邮政~码而言Qzipcode like ?1_ _ _??zipcode >?1000?意义是完全一致的?br />9?l合索引的高效?/font>
假设已在dateQplaceQamount三个字段上徏立了l合索引
select count(*) from record
where date > ?9991201?and date < ?9991214?and amount > 2000
(< 1U?

select date,sum(amount) from record group by date
Q?1U)

select count(*) from record
where date > ?9990901?and place in (′BJ?′SH?
Q?lt; 1U)
q是一个设|较合理的组合烦引。它date作ؓ前导列,使每个SQL都可以利用烦引,q且在第一和第三个SQL中Ş成了索引覆盖Q因而性能辑ֈ了最优。如果烦引不便于更改Q修正SQL中的条g序以配合烦引顺序也是可行的?br />10?order by按聚集烦引列排序效率最?/font>
排序是较耗时的操作,应尽量简化或避免对大型表q行排序Q如~小排序的列的范_只在有烦引的列上排序{等?br />我们来看Q(gid是主键,fariqi是聚合烦引列Q?br />select top 10000 gid,fariqi,reader,title from tgongwen
用时Q?96 毫秒?扫描计数 1Q逻辑?289 ơ,物理?1 ơ,预读 1527 ơ?br />select top 10000 gid,fariqi,reader,title from tgongwen order by gid asc
用时Q?720毫秒?扫描计数 1Q逻辑?41956 ơ,物理?0 ơ,预读 1287 ơ?br />select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc
用时Q?736毫秒?扫描计数 1Q逻辑?55350 ơ,物理?10 ơ,预读 775 ơ?br />select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi asc
用时Q?73毫秒?扫描计数 1Q逻辑?290 ơ,物理?0 ơ,预读 0 ơ?br />select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi desc
用时Q?56毫秒?扫描计数 1Q逻辑?289 ơ,物理?0 ơ,预读 0 ơ?br />从以上我们可以看出,不排序的速度以及逻辑L数都是和“order by 聚集索引列?的速度是相当的Q但q些都比“order by 非聚集烦引列”的查询速度是快得多的?br />同时Q按照某个字D进行排序的时候,无论是正序还是倒序Q速度是基本相当的?br />三?关于节省数据查询pȝ开销斚w的措?br />1?使用TOP量减少取出的数据量
TOP是SQL SERVER中用来提取前几条或前某个癑ֈ比数据的关键词?br />select top 20 gid,fariqi,reader,title from tgongwen order by gid desc
select top 60 percent gid,fariqi,reader,title from tgongwen order by gid desc
在实际的应用中,应该l常利用top 剔除掉不必要的数据,只保留必ȝ数据集合。这样不仅可以减数据库逻辑ȝơ数Q还能避免不必要的内存浪费,对系l性能的提升都是有好处的?br />
2?字段提取要按照“需多少、提多少”的原则Q避免“select *?br />q个举个例子Q?br />select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc
用时Q?673毫秒
select top 10000 gid,fariqi,title from tgongwen order by gid desc
用时Q?376毫秒
select top 10000 gid,fariqi from tgongwen order by gid desc
用时Q?0毫秒
由此看来Q字D大越大,数目多Qselect所耗费的资源就多Q?font color="#0000ff">比如取intcd的字D就会比取char的快很多。我们每提取一个字D,数据的提取速度׃有相应的提升。提升的q度Ҏ舍弃的字D늚大小来判断?/font>
3?count(*) ?count(字段) Ҏ比较
我们来看一些实验例子(gid为Tgongwen的主键)Q?br />select count(*) from Tgongwen
用时Q?500毫秒
select count(gid) from Tgongwen
用时Q?483毫秒
select count(fariqi) from Tgongwen
用时Q?140毫秒
select count(title) from Tgongwen
用时Q?2050毫秒
从以上可以看出,用count(*)和用count(主键)的速度是相当的Q而count(*)却比其他M除主键以外的字段汇总速度要快Q而且字段长Q汇总速度p慢。如果用count(*)Q?SQL SERVER会自动查找最字D|汇怅R当Ӟ如果您直接写count(主键)会来的更直接些?/font>
4?有嵌套查询时Q尽可能在内层过滤掉数据
如果一个列同时在主查询和where子句中出玎ͼ很可能当L询中的列值改变之后,子查询必重新查询一ơ。而且查询嵌套层次多Q效率越低,因此应当量避免子查询。如果子查询不可避免Q那么要在子查询中过滤掉可能多的行?
5?多表兌查询Ӟ需注意表顺序,q尽可能早的qo掉数?br />在用Joinq行多表兌查询时候,应该使用pȝ开销最的Ҏ。连接条件要充䆾考虑带有索引的表、行数多的表Qƈ注意优化表顺序;说的单一点,是可能早的将之后要做兌的数据量降下来?br />一般情况下Qsqlserver 会对表的q接作出自动优化。例如:
select name,no from A
join B on A. id=B.id
join C on C.id=A.id
where name='wang'
管A表在From中先列出Q然后才是B,最后才是C。但sql server可能会首先用c表。它的选择原则是相对于该查询限制ؓ单行或少数几行,可以减在其他表中查找的L据量。绝大多数情况下Qsql server 会作出最优的选择Q但如果你发觉某个复杂的联结查询速度比预计的要慢Q就可以使用SET FORCEPLAN语句强制sql server按照表出现顺序用表。如上例加上QSET FORCEPLAN ON…?SET FORCEPLAN OFF 表的执行序会按照你所写的序执行。在查询分析器中查看2U执行效率,从而选择表的q接序。SET FORCEPLAN的缺Ҏ只能在存储过E中使用?br />
结Q?br />?聚集索引比较宝贵Q应该用在查询频率最高的地方Q?br />?在数据ؓ“既不是l大多数相同Q也不是极少数相同”状态时Q?br />最能发挥聚集烦引的潜力Q?br />?复合索引的设|和使用要注意保持顺序一_
?条g子句的表辑ּ最好符合SARG规范Q是可利用烦引的Q?br />?M对列的操作都D全表扫描Q如数据库函数、计表辑ּ{,
查询时应可能将操作U至{号的某一边;
?要注意含有null值时Q是不能充分利用索引的;
?exist, in、or{子句常会索引失效Q?br />如果不生大量重复|可以考虑把子句拆开Q再用union拼合Q?br />?排序时应充分利用带烦引的字段Q?br />?可能早Q快的过滤掉无用的数据,只将必须的数据带到后l的操作中去
从前面讲叙的内容可以看出QSQL语句优化的实质就是在l果正确的前提下Q用分析优化器可以识别的SARG规范语句Q充份利用烦引,减少数据的I/Oơ数Q尽量避免全表扫描的发生?br />以上内容有些是指导性的理论原则Q有些是实际摸烦的经验,大家在用时应灵zd理,Ҏ实际情况Q选择合适的Ҏ。本文中列D的实验数据仅作比对用Q不具备普遍意义。大家在实际目中,应充分利用性能监测和分析工P如SQLSERVER带的相关工具Q来验自q优化效果?br />此外Q还有很重要的一点要提醒大家Q同样复杂的数据操作Q在SQLSERVER数据库别完成的代h要远q小于在应用端用E序代码完成的代P所以徏议大家全面,深入的学习SQL语法中重要关键字的应用,如:Group By QHaving{,量把数据操作Q务放在数据库pȝ中完?/font> 。数据库应用pȝ的性能优化是一个复杂的q程Q上q这些只是在SQL语句层次的一U体玎ͼ深入研究q会涉及数据库层的资源配|、网l层的流量控制以及操作系l层的M设计{等Q这些将在以后的文章中详l论q?/p>

]]>
SQL语句性能优化--LECCO SQL Experthttp://m.tkk7.com/ASONG/articles/86833.html汪松?/dc:creator>汪松?/author>Mon, 11 Dec 2006 03:21:00 GMThttp://m.tkk7.com/ASONG/articles/86833.htmlhttp://m.tkk7.com/ASONG/comments/86833.htmlhttp://m.tkk7.com/ASONG/articles/86833.html#Feedback0http://m.tkk7.com/ASONG/comments/commentRss/86833.htmlhttp://m.tkk7.com/ASONG/services/trackbacks/86833.html  人工自动SQL优化是使用人工技术,自动对SQL语句q行重写Q从而找到性能最好的{效SQL语句?/p>

  数据库性能的优?/p>

  一个数据库pȝ的生命周期可以分成:设计、开发和成品三个阶段。在设计阶段q行数据库性能优化的成本最低,收益最大。在成品阶段q行数据库性能优化的成本最高,收益最?/p>

  数据库的优化通常可以通过对网l、硬件?a class="Channel_KeyLink" >操作pȝ、数据库参数?a class="Channel_KeyLink" >应用E序的优化来q行。最常见的优化手D就是对g的升U。根据统计,对网l、硬件?a class="Channel_KeyLink" >操作pȝ、数据库参数q行优化所获得的性能提升Q全部加h只占数据库系l性能提升?0%左右Q其余的60%pȝ性能提升来自?a class="Channel_KeyLink" >应用E序的优化。许多优化专家认为,?a class="Channel_KeyLink" >应用E序的优化可以得?0%的系l性能的提升?/p>

  应用E序的优?/p>

  应用E序的优化通常可分Z个方面:源代码和SQL语句。由于涉及到对程序逻辑的改变,源代码的优化在时间成本和风险上代价很高,而对数据库系l性能的提升收效有限?/p>

  Z么要优化SQL语句

  . SQL语句是对数据库进行操作的惟一途径Q对数据库系l的性能L军_性的作用?/p>

  . SQL语句消耗了70%?0%的数据库资源?/p>

  . SQL语句独立于程序设计逻辑Q对SQL语句q行优化不会影响E序逻辑?/p>

  . SQL语句有不同的写法Q在性能上的差异非常大?/p>

  . SQL语句易学Q但隄通?/p>

  优化SQL语句的传l方法是通过手工重写来对SQL语句q行优化。DBA或资q序员通过对SQL语句执行计划的分析,依靠l验Q尝试重写SQL语句Q然后对l果和性能q行比较Q以试图扑ֈ性能较佳的SQL语句。这U传l上的作法无法找出SQL语句的所有可能写法,且依赖于人的l验Q非常耗费旉?/p>

  SQL优化技术的发展历程

  W一代SQL优化工具是执行计划分析工兗这cd具针对输入的SQL语句Q从数据库提取执行计划,q解释执行计划中关键字的含义?

  W二代SQL优化工具只能提供增加索引的徏议,它通过对输入的SQL语句的执行计划的分析Q来产生是否要增加烦引的?/p>

  W三代SQL优化工具不仅分析输入SQL语句的执行计划,q对输入的SQL语句本nq行语法分析Q经q分析生写法上的改q徏议?/p>

  人工自动SQL优化


? 人工自动SQL优化C意?/p>

  人工自动SQL优化出现?0q代末。目前在商用数据库领域,LECCO Technology Limited(灵高U研有限公司)拥有该技术,q提供用该技术的自动优化产品LECCO SQL ExpertQ它支持Oracle、Sybase、MS SQL Server和IBM DB2数据库^台。该产品针对数据?a class="Channel_KeyLink" >应用的开发和l护阶段提供的模块有QSQL语法优化器、PL/SQL集成化开发调试环?IDE)、扫描器、数据库监视器等。其核心模块SQL 语法优化器的工作原理为:①输入一条源SQL语句Q②“h工智能反馈式搜烦引擎”对输入的SQL语句Q结合检到的数据库l构和烦引进行重写,产生N条等效的SQL语句输出Q③产生的N条等效SQL语句再送入“h工智能反馈式搜烦引擎”进行重写,直至无法产生新的输出或搜索限额满Q④对输出的SQL语句q行qoQ选出h不同执行计划的SQL语句Q⑤对得到的SQL语句q行扚w试Q找出性能最好的SQL语句?br />LECCO SQL Expert自动优化实例

  假设我们从源代码中抽取出q条SQL语句(也可以通过内带的扫描器或监视器获得SQL语句)Q?/p>

  SELECT COUNT(*)

   FROM EMPLOYEE

  swheresEXISTS (SELECT 'X'

   FROM DEPARTMENT

  swheresEMP_DEPT=DPT_ID

   AND DPT_NAME LIKE 'AC%')

  AND EMP_ID IN (SELECT SAL_EMP_ID

   FROM EMP_SAL_HIST B

  swheresSAL_SALARY Q?70000)

  按下“优化”按钮后Q经q?0几秒QSQL Expert完成了优化的过E,q在q?0几秒的时间里重写产生?267 条等LSQL语句Q其?36条SQL语句有不同的执行计划?/p>

  接下来,我们可以对自动重写生的136条SQL语句q行批运行测试,以选出性能最佳的{效SQL语句。按下“批q行?按钮Q在“终止条件?选择“最佌行时间SQL语句”,按“确定”?/p>

  l过几分钟的试q行后,我们可以发现SQL124的运行时间和反应旉最短。运行速度U有22.75倍的提升(源SQL语句q行旉?.73U,SQL124q行旉?.12U?。现在我们就可以把SQL124攑օ源代码中Q结束一条SQL语句的优化工作了?/p>

  “边做边学式训练”提升SQL开发水q?/p>

  LECCO SQL Expert不仅能够扑ֈ最佳的SQL语句Q它所提供的“边做边学式训练”还能够教开发h员和数据库管理员如何写出性能最好的SQL语句。LECCO SQL Expert的“SQL比较器”可以标明源SQL和待选SQL间的不同之处?/p>

  以上面优化的l果ZQؓ了查看源SQL语句和SQL124在写法上有什么不同,我们可以按下“比较器?按钮Q对SQL124和源SQL语句q行比较。“SQL 比较器”将SQL124相对于源SQL语句的不同之处以蓝颜色表CZ出来。如果选择“双向比较”复选框Q“SQL 比较器”可以将两条SQL语句的不同之处以蓝色表示。当Ӟ我们也可以从源语句和重写后的SQL 语句中Q选两条进行比较?/p>

  从比较的l果可以看到Q重写后的SQL124把第一个Exists改写成了InQ在字段DPT_ID上进行了合ƈI字W串的操作,以诱导数据库先执行子查询中的

  (SELECT DPT_ID||''

  FROM DEPARTMENT

  WHERE DPT_NAME LIKE 'AC%')

  在子查询完成后,再与EMPLOYEE表进行嵌套@环连?Nested Loop Join)?/p>

  如果觉得对写法的改变难以理解Q还可以点中“执行计划”复选框Q通过比较两条SQL语句的执行计划的不同Q来了解其中的差异。在查看执行计划q程中,如果有什么不明白的地方,可以点中“SQL信息按钮”,再点L行计划看不明白的地方QLECCO SQL Expert的上下文敏感帮助pȝ提供执行计划该处的解释?/p>

  在“SQL比较器”中Q选中“统计信息”复选框后,可得到详l的两条SQL语句q行时的l计信息比较Q这对于学习不同的SQL写法Ҏ据库资源的消耗很有帮助?/p>

  LECCO SQL Expert优化模块的特?br />LECCO SQL Expert优化模块的特点主要表CؓQ自动优化SQL语句Q以独家的h工智能知识库“反馈式搜烦引擎”来重写性能优异的SQL语句Q找出所有等效的SQL语句及可能的执行计划Q保证生相同的l果Q先q的SQL语法分析器能处理最复杂的SQL语句Q可以重写SELECT、SELECT INTO、UPDATE、INSERT和DELETE语句Q通过试q行Qؓ应用E序和数据库自动扑ֈ性能最好的SQL语句Q提供微U的计Ӟ能够优化Web应用E序和有大量用户的在U事务处理中q行旉很短的SQL语句Qؓ开发h员提供“边做边学式训练”,q速提高开发h员的SQL~程技能;提供上下文敏感的执行计划帮助pȝ和SQLq行状态帮助;不是猜测或徏议,而是独一无二的SQL重写解决Ҏ?

  写出专家U的SQL语句

  LECCO SQL Expert的出玎ͼ使SQL的优化变得极其简单,只要能够写出SQL语句Q它p帮用h到最好性能的写法。LECCO SQL Expert不仅能在很短的时间内扑ֈ所有可能的优化ҎQ而且能够通过实际试Q确定最有效的优化方案。同以往的数据库优化手段相比较,LECCO SQL Expert数据库优化技术带C一个崭新的技术高度,依赖人的l验、耗费大量旉、受人的思维束缚的数据库优化手段已经被高效、省时且准确的自动优化Y件所取代了。通过内徏的“LECCO助手”的帮助Q即使是SQL的开发新手,也能快速且单地写出专家U的SQL语句?/p>

]]>
Oracle10g EMq之快速解?/title><link>http://m.tkk7.com/ASONG/articles/85856.html</link><dc:creator>汪松?/dc:creator><author>汪松?/author><pubDate>Wed, 06 Dec 2006 07:20:00 GMT</pubDate><guid>http://m.tkk7.com/ASONG/articles/85856.html</guid><wfw:comment>http://m.tkk7.com/ASONG/comments/85856.html</wfw:comment><comments>http://m.tkk7.com/ASONG/articles/85856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/ASONG/comments/commentRss/85856.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/ASONG/services/trackbacks/85856.html</trackback:ping><description><![CDATA[ <p>一直没怎么?0g的EM工具,今天打开来看?发现也有怼已久的ؕ码问?|上也流传着NU解x?仔细看一?其实q个问题很好解决.</p> <p>如果安装?我们pȝ环境变量讄的是中文环境,那么׃会有q个问题.q个问题Ҏ原因在于安装?JDK/JRE字符集的自动选择.</p> <p>?$ORACLE_HOME/jdk/jre/lib ?$ORACLE_HOME/jre/1.4.2/lib/ 目录下都有多U字W集字体配置文g:</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文g卛_.然后重新启动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昄可以正常显CZ文了.<br /><img alt="" src="http://www.stcore.com/images/oracle/h000/h19/img200606130707410909.jpg" height="187" width="440" /></p> <img src ="http://m.tkk7.com/ASONG/aggbug/85856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/ASONG/" target="_blank">汪松?/a> 2006-12-06 15:20 <a href="http://m.tkk7.com/ASONG/articles/85856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Linux x86上安装Oracle数据?10g (3)http://m.tkk7.com/ASONG/articles/85853.html汪松?/dc:creator>汪松?/author>Wed, 06 Dec 2006 07:19:00 GMThttp://m.tkk7.com/ASONG/articles/85853.htmlhttp://m.tkk7.com/ASONG/comments/85853.htmlhttp://m.tkk7.com/ASONG/articles/85853.html#Feedback0http://m.tkk7.com/ASONG/comments/commentRss/85853.htmlhttp://m.tkk7.com/ASONG/services/trackbacks/85853.html指定备䆾和恢复选项

选择 Do not enable Automated backups?

指定数据库模式口?

选择 Use the same password for all the accounts?

选择一个口令,然后输入两次q行认?

摘要

昄已安装品的摘要?

单击 Install?

安装

此屏q历l安装和链接 Oracle 软g的几个阶Dc?

安装q程l束时弹Z个窗口显C配|信息。记?Enterprise Manager URLQ然后单?OK 关闭该窗口?

弹出一个“Setup Privileges”窗口,提示需要以 root 用户w䆾q行配置脚本。以 root 用户w䆾dQ切换到该窗口中指示的目录,然后执行 root.sh 脚本。该脚本提示输入本地 bin 目录的位|。按 Enter 键接受默认倹{当脚本完成Ӟq回?Setup Privileges H口q单?OK。(如下所C。)

 

 

 

安装l束

C摘要中显C的 URLQƈ在准备好时单?Exit?

恭喜Q您的新 Oracle 10g 数据库已l启动ƈ可以使用?

 

--------------------------------------------------------------------------------

 

W?4 部分Q配|存?

 

我们在第 3 部分中创建的数据库用单一文gpȝ (/u02/oradata) q行盘存储。但?Oracle 数据库配|存储的方式有多U?

 

W?4 部分介绍了ؓ此数据库配置盘存储的其他方法。尤其是Q它描述了如何创建其他文件系l以及如何用自动存储管?(ASM)。如何用原始设备和 Oracle 集群文gpȝ (OCFS) 在本系列的另一文章中介绍Q该文章介l了如何使用 Oracle 真正应用集群 (RAC) 创徏集群数据库?

 

文gpȝ

 

文gpȝ是ؓ Oracle 数据库存储数据文件、重做日志和控制文g最常用的方法。文件系l易于实施,q且无需W三方Y件来理?

 

大多数情况下Q文件系l在 Linux 的初始安装过E中创徏。但有时必须在初始安装后Q如安装新磁盘驱动器后)创徏新文件系l?

 

本部分介l了如何构徏新文件系l以及如何在 Oracle 数据库中使用它。除非另有说明,否则必须?root 用户w䆾q行所有命令?

 

对磁盘进行分?

 

必须使用I磁盘分区来创徏文gpȝ。如果已l有一个空的可用磁盘分区,则蟩C一步?

 

以下是一个ؓ Linux 文gpȝ创徏新分区的CZ。(警告Q对盘q行错误分区是删除硬盘上所有内容的最可靠、最快捷的方法之一。如果不定如何分区Q请先停下来Q找人帮帮您Q否则您冒丢失数据的危险。)

 

此示例?/dev/sdbQ一个没有分区的I?SCSI 盘Qؓ整个盘 (36 GB) 创徏单个分区?

 

例如Q?

 

																
																# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel.Changes will remain in memory only,
until you decide to write them.After that, of course, the previous
content won't be recoverable.


The number of cylinders for this disk is set to 4427.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)

Command (m for help):p

Disk /dev/sdb:255 heads, 63 sectors, 4427 cylinders
Units = cylinders of 16065 * 512 bytes

Device Boot Start End Blocks Id System

Command (m for help):n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-4427, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-4427, default 4427):
Using default value 4427

Command (m for help):w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING:If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
Syncing disks.

现在验证新分区:









 

例如Q?

 

														
														# fdisk /dev/sdb

The number of cylinders for this disk is set to 4427.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)

Command (m for help):p

Disk /dev/sdb:255 heads, 63 sectors, 4427 cylinders
Units = cylinders of 16065 * 512 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 4427 35559846 83 Linux

 

 

Command (m for help):q

 

创徏文gpȝ

 

使用 ext3 创徏q个新的文gpȝ。也可以使用其他文gpȝQ但 ext3 在系l崩溃时可提供最快的恢复?

 

例如Q?

 

														
														# mke2fs -j /dev/sdb1
mke2fs 1.26 (3-Feb-2002)
Filesystem label=
OS type:Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
4447744 inodes, 8889961 blocks
444498 blocks (5.00%) reserved for the super user
First data block=0
272 block groups
32768 blocks per group, 32768 fragments per group
16352 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632,
2654208, 4096000, 7962624

Writing inode tables:done
Creating journal (8192 blocks):done
Writing superblocks and filesystem accounting information:done

This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first.Use tune2fs -c or -i to override.

创徏挂蝲?

 

文gpȝ必须有一个挂载点Q它只是一个空的目录,新文件系l在q里与系l目录树“相q”。挂载点的命名应遵@ Oracle 灉|l构 (OFA) 标准。有?OFA 标准的更多信息,请参?Oracle 10g 数据库安装指?的附?D?

 

׃您已l在W?1 部分中用了 /u01 ?/u02 目录名称Q因此在本示例中使用 /u03?

 

例如Q?

# mkdir /u03

 

新文gpȝd?/etc/fstab

 

因此新文件系l将在系l启动时自动挂蝲Q您需要向描述新文件系l及其安装位|的 /etc/fstab 文g中添加一行。用文本编辑器?/etc/fstab 中添加如下所C的一行?

 

/dev/sdb1 /u03 ext3 defaults 1 1

 

挂蝲新文件系l?

 

文gpȝ挂蝲后就可以使用了。只有挂载了文gpȝQ才能在其中存储文g。用以下命令挂载文件系lƈ验证它是否可用?

 

														
														mount /u03
df -h /u03

 

 

 

例如Q?

 

														
														# mount /u03
# df -h /u03
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 33G 33M 31G 1% /u03

 

 

创徏 Oracle 目录q设|权?

 

现在Q创Z个用于存?Oracle 文g的目录。该CZ中用的目录名遵循数据库?OFA 标准命名惯例Q即 ORACLE_SID=demo1?

 

														
														mkdir -p /u03/oradata/demo1
chown -R oracle:oinstall /u03/oradata
chmod -R 775 /u03/oradata

 

 

 

在新文gpȝ中创Z个新表空?

 

新文件系l已可以使用。接下来Q在文gpȝ中创Z个用于存储数据库对象的新表空间。以 SYSTEM 用户w䆾q接到数据库Q然后执?CREATE TABLESPACE 语句Qƈ在新文gpȝ中指定数据文件?

 

例如Q?

 

														
														$ sqlplus

SQL*Plus:Release 10.1.0.2.0 - Production on Sun Jun 13 15:01:08 2004

Copyright (c) 1982, 2004, Oracle.All rights reserved.

Enter user-name:system
Enter password:

Connected to:
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> create tablespace data1
2 datafile '/u03/oradata/demo1/data1_01.dbf' size 100M
3 extent management local
4 segment space management auto;

Tablespace created.

 

 

现在Q可以用此新表I间存储数据库对象,如表和烦引?

 

 

例如Q?

 

														
														SQL> create table demotab (id number(5) not null primary key,
2 name varchar2(50) not null,
3 amount number(9,2))
4 tablespace data1;

Table created.

自动存储理 (ASM)

 

我把最重要的内容留在了最后。ASM ?Oracle 数据?10g 中一个非常出色的新特性,它以q_无关的方式提供了文gpȝ、逻辑L理器以及软g RAID {服务。ASM 可以条带化和镜像盘Q从而实C在数据库被加载的情况下添加或U除盘以及自动q I/O 以删除“热点”。它q支持直接和异步?I/O q? Oracle9i 中引入的 Oracle 数据理?APIQ简化的 I/O pȝ调用接口Q?

 

ASM 不是一个通用的文件系l,q只能用?Oracle 数据文g、重做日志以及控制文件。ASM 中的文g既可以由数据库自动创建和命名Q通过使用 Oracle 理文gҎ)Q也可以?DBA 手动创徏和命名。由于操作系l无法访?ASM 中存储的文gQ因此对使用 ASM 文g的数据库执行备䆾和恢复操作的唯一途径是通过恢复理? (RMAN)?

 

ASM 作ؓ单独?Oracle 实例实施Q只有它在运行时其他数据库才能访问它。在 Linux 上,只有q行 OCSSD 服务Q由 Oracle 通用安装E序默认安装Q才能?ASM。ASM 需要的内存不多Q对大多数系l,只需 64 MB?

 

安装 ASM 

?Linux q_上,ASM 可以使用原始讑֤Q或通过 ASMLib 接口理的设备。出于易于用和性能斚w的原因,Oracle 在原始设备上使用 ASMLib。ASMLib 现在可以?OTN 免费下蝲。本部分逐步讲解使用 ASMLib 配置一个简?ASM 实例和构Z个?ASM q行盘存储的数据库的全q程?

定所需?ASMLib 版本

 

ASMLib 以三?Linux E序包组成的E序包集提供Q?

 

oracleasmlib - ASM ?

oracleasm-support - 用于理 ASMLib 的实用程?

oracleasm - ASM 库的内核模块

每个 Linux 发行套g都有其自q ASMLib E序包集。在每个发行套g中,每个内核版本都有一个相应的 oracleasm E序包。以下部分介l如何确定所需的程序包集?

首先Q以 root 用户w䆾dq运行以下命令来定所使用的内核:

 

uname -rm

 

例如Q?

# uname -rm

2.4.9-e.27smp i686

 

该示例表明,q是一个?Intel i686 CPU ?SMPQ多处理器)pȝ?2.4.9 内核?/p>

 

使用此信息在 OTN 上查扄应的 ASMLib E序包:

 

?Web 览器指?http://www.oracle.com/global/cn/technology/tech/linux/asmlib

选择适用于您?Linux 版本的链接?

下蝲适用于您?Linux 版本?oracleasmlib ?oracleasm-support E序?

下蝲与您的内核相对应?oracleasm E序包。对于以上示例,下蝲 oracleasm-2.4.9-e-smp-1.0.0-1.i686.rpm E序包?

接下来,通过?root 用户w䆾执行以下命o来安装程序包Q?

														
														rpm -Uvh oracleasm-kernel_version-asmlib_version.cpu_type.rpm \
oracleasmlib-asmlib_version.cpu_type.rpm \
oracleasm-support-asmlib_version.cpu_type.rpm

 

例如Q ?/p>

														
														# rpm -Uvh \
> oracleasm-2.4.9-e-smp-1.0.0-1.i686.rpm \
> oracleasmlib-1.0.0-1.i386.rpm \
> oracleasm-support-1.0.0-1.i386.rpm
Preparing... #################################### [100%]
1:oracleasm-support #################################### [ 33%]
2:oracleasm-2.4.9-e-smp #################################### [ 66%]
Linking module oracleasm.o into the module path [ OK ]
3:oracleasmlib #################################### [100%]

 配置 ASMLib

使用 ASMLib 之前Q必运行配|脚本以准备驱动E序。以 root 用户w䆾q行以下命oQƈ响应如下CZ中所昄的提C?

														
														# /etc/init.d/oracleasm configure
Configuring the Oracle ASM library driver.

This will configure the on-boot properties of the Oracle ASM library
driver.The following questions will determine whether the driver is
loaded on boot and what permissions it will have.The current values
will be shown in brackets ('[]').Hitting <ENTER> without typing an
answer will keep that current value.Ctrl-C will abort.

Default user to own the driver interface []:oracle
Default group to own the driver interface []:dba
Start Oracle ASM library driver on boot (y/n) [n]:y
Fix permissions of Oracle ASM disks on boot (y/n) [y]:y
Writing Oracle ASM library driver configuration [ OK ]
Creating /dev/oracleasm mount point [ OK ]
Loading module "oracleasm" [ OK ]
Mounting ASMlib driver filesystem [ OK ]
Scanning system for ASM disks [ OK ]

现在Q如下所C启?ASMLib 驱动E序?

														
														# /etc/init.d/oracleasm enable
Writing Oracle ASM library driver configuration [ OK ]
Scanning system for ASM disks [ OK ]

?ASM 配置盘

接下来,告诉 ASM 驱动E序您要使用的磁盘。请注意Q这些磁盘是不包含Q何内容(甚至不包含分区)的空盘。可以将盘分区用于 ASMQ但您不要这样做?

通过?root 用户w䆾q行以下命o来标记由 ASMLib 使用的磁盘:

/etc/init.d/oracleasm createdisk DISK_NAME device_name

Q提C:DISK_NAME 应由大写字母l成。当前版本有一个错误,卛_果用小写字母,ASM 实例无法识别磁盘。)

例如Q?

														
														# /etc/init.d/oracleasm createdisk VOL1 /dev/sdb
Marking disk "/dev/sdb" as an ASM disk [ OK ]
# /etc/init.d/oracleasm createdisk VOL2 /dev/sdc
Marking disk "/dev/sdc" as an ASM disk [ OK ]
# /etc/init.d/oracleasm createdisk VOL3 /dev/sdd
Marking disk "/dev/sdd" as an ASM disk [ OK ]
# /etc/init.d/oracleasm createdisk VOL4 /dev/sdf
Marking disk "/dev/sdf" as an ASM disk [ OK ]
# /etc/init.d/oracleasm createdisk VOL5 /dev/sdg
Marking disk "/dev/sdg" as an ASM disk [ OK ]
# /etc/init.d/oracleasm createdisk VOL6 /dev/sdh
Marking disk "/dev/sdh" as an ASM disk [ OK ]

以下CZ演示了如何列出标Cؓ?ASMLib 使用的所有磁盘?

 

														
														# /etc/init.d/oracleasm listdisks
VOL1
VOL2
VOL3
VOL4
VOL5
VOL6

既然已经安装?ASMLibQ且已将盘标记为可用,下面Q您便可以创Z?ASM 实例Qƈ构徏一个?ASM q行盘存储的数据库。最Ҏ的方法就是用数据库配置助手 (DBCA) 来完成此操作?

?oracle w䆾dq启?DBCAQ?

$ dbca

Ƣ迎

单击 Next?

操作

选择 Create a Database?

数据库模?

选择 General Purpose?

数据库标?

输入全局数据库名U?

理选项

选择 Configure the Database with Enterprise Manager?

选择 Use Database Control for Database Management?

数据库证?

选择 Use Same Password for All Accounts?

输入口oq确认?

存储选项

选择 Automatic Storage Management (ASM)?

创徏 ASM 实例

输入 ASM 实例的口令ƈ认?

弹出一个窗口,提示 DBCA 立卛_建ƈ启动 ASM 实例?

单击 OK?

创徏 ASM 实例时弹Z个带齿轮q口?

ASM 盘l?

׃q是?ASM 实例且您未创徏M ASM 实例Q因此该H口未显C可用磁盘组?

单击 Create New?

创徏盘l?

盘l名U?

- 输入盘l名Uͼ?DATA1?

冗余

- High 镜像数据两次?

- Normal 镜像数据一ơ?

- External 不镜?ASM 中的数据。如果外?RAID 阵列提供冗余Q则通常使用此选项?

选择成员盘

- 您必L动指C?ASM C么地Ҏ?ASMLib 盘Q因此,单击 Change Disk Discovery Path

- 弹出一个窗口,提示输入盘发现路径。如下所C将盘发现路径更改为“ORCL:*”?

- 单击 OK l箋?

您将q回?Select Member Disks H口。您的所?ASMLib 盘现在应显C在此窗口中?

单击该行开头的框,选择加入盘l的盘。完成后单击 OK?

ASM 盘l?

您将q回?ASM Disk Groups H口。此Ӟ出现在上一步中创徏的磁盘组?

单击该行开头的框选择此磁盘组。(在此实例中用单个磁盘组。)

单击 Next?

数据库文件位|?

选择 Use Oracle-Managed Files?

保已将 Database Area 讄为您创徏的磁盘组。它包含一个前导加??例如Q?DATA1?

恢复配置

选择 Specify Flash Recovery Area?

- 快速恢复区 ?输入要用于快速恢复的 ASM 盘l?

- 快速恢复区大小 ?接受默认?2048?

如果要用归档日志模式,则选中 Enable Archiving。对于评估数据库Q可以不选该V?

数据库内?

选择 Sample Schemas?

我们不用定制脚本,因此单击 Next?

初始化参?

接受默认|然后单击 Next?

数据库存?

接受默认|然后单击 Next?

创徏选项

选择 Create DatabaseQ默认|q单?Finish?

查完数据库详l信息后单击 OK?

DBCA 昄一个操作列表和一个进度条。根据硬件的不同Q数据库创徏可能需要几分钟到几时的时间?

当数据库创徏完成Ӟ显CZ个显C摘要窗口。记?Enterprise Manager URLQ然后单?Exit。 ?/p>

--------------------------------------------------------------------------------



]]>
在Linux x86上安装Oracle数据?10g (4)http://m.tkk7.com/ASONG/articles/85855.html汪松?/dc:creator>汪松?/author>Wed, 06 Dec 2006 07:19:00 GMThttp://m.tkk7.com/ASONG/articles/85855.htmlhttp://m.tkk7.com/ASONG/comments/85855.htmlhttp://m.tkk7.com/ASONG/articles/85855.html#Feedback0http://m.tkk7.com/ASONG/comments/commentRss/85855.htmlhttp://m.tkk7.com/ASONG/services/trackbacks/85855.htmll论 

现在Q您的数据库已经启动q运行,您可以开始?Oracle 10g 中提供的许多新特性。最好从 Oracle Enterprise Manager 开始用,q是因ؓ它是d地重新编写的Q采用了Z Web 的界面。如果不定从何处开始,Oracle 概念指南 ?DBA 两日速成指南 帮助您熟悉新数据库。OTN q提供了一些旨在帮助您充分利用 10g 的文章。我最喜欢的是?Arup Nanda ~写的系列文章“Oracle 数据?10gQؓ DBA 提供?20 个最重要的特性。”?/p>

在下一文章中Q我们将逐步讲解如何安装和配|一个功能齐全的双节?Oracle RAC 10g 数据库?

--------------------------------------------------------------------------------

附录

使用 SQL*Plus 讉K数据?

?oracle w䆾d?Linux。设|环境?

讄 Oracle 环境变量Q?

														
														$ export ORACLE_BASE=/u01/app/oracle
$ export ORACLE_SID=demo1
$ export ORACLE_HOME=$ORACLE_BASE/product/10.1.0/db_1
$ export PATH=$PATH:$ORACLE_HOME/bin

q行 SQL*PlusQ?

														
														$ sqlplus

SQL*Plus:Release 10.1.0.2.0 - Production on Sat Jun 5 16:59:21 2004

Copyright (c) 1982, 2004, Oracle.All rights reserved.

Enter user-name:/ as sysdba

Connected to:
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL>

 使用 Oracle Enterprise Manager 10g 数据库控?

?Web 览器中Q连接到安装q程中提供的 URL?

例如Q?

http://ds1.orademo.org:5500/emQ如果服务器不在 DNS 中,则必M?IP 地址代替L名。)

用户名:SYS

口oQ?lt;安装q程中选择的口?gt;

q接为:SYSDBA

单击

Ƣ迎走入 Oracle Enterprise Manager 10g 数据库控制的_ֽ世界Q?

启动和停?Oracle Enterprise Manager 数据库控Ӟ

														
														$ emctl start dbconsole
$ emctl stop dbconsole

 使用 iSQL*Plus 讉K数据?

iSQL*Plus 是历史悠久的 SQL*Plus 交互式工LZ Web 的版本,用于讉K数据库。要使用 iSQL*PlusQ请单击 OEM 控制?Related Links 部分中的 iSQL*Plus 链接Q或浏览器指向安装q程中提供的 iSQL*Plus URL?

例如Q?

http://ds1.orademo.org:5560/isqlplusQ如果数据库服务器不?DNS 中,则必M?IP 地址代替L名。)

 用户名:SYSTEM

口oQ?lt;安装q程中选择的口?gt;

单击 ?

?Workspace 框中输入 SQL 命oQ然后单?Execute。 ?/p>

启动和停?iSQL*PlusQ?

														
														$ isqlplusctl start
$ isqlplusctl stop

启动和停止监听器Q?

监听器接受客L的连接请求,q在验证证书后创建数据库q接。要使用 OEM ?iSQL*PlusQ必d启动监听器?

														
														$ lsnrctl start
$ lsnrctl stop

启动和停止数据库Q?

启动和停止数据库的最单方法是?OEM 控制台启动和停止。要从命令行执行此操作,请在?oracle w䆾d后?SQL*PlusQ如下所C:

启动Q?

														
														$ sqlplus

SQL*Plus:Release 10.1.0.2.0 - Production on Sun Jun 13 22:27:48 2004

Copyright (c) 1982, 2004, Oracle.All rights reserved.

Enter user-name:/ as sysdba
Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area 188743680 bytes
Fixed Size 778036 bytes
Variable Size 162275532 bytes
Database Buffers 25165824 bytes
Redo Buffers 524288 bytes
Database mounted.
Database opened.
SQL> exit

Shutdown:

$ sqlplus

SQL*Plus:Release 10.1.0.2.0 - Production on Sun Jun 13 22:25:55 2004

Copyright (c) 1982, 2004, Oracle.All rights reserved.

Enter user-name:/ as sysdba

Connected to:
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit

列出 Oracle q程Q?

														
														$ ps a€“fuoracle

什么是 ocssd.bin q程Q?

Oracle 集群同步服务 (OCSSD) ?Oracle 集群qA服务 (CRS) 的一个组Ӟ用于 RAC 和?ASM 的单个实例数据库。它在默认情况下安装Q用很的pȝ资源Qƈ?/etc/inittab 中进行配|。这些进E在pȝ每次启动时自动启动。Oracle 不要用 OCSSDQ即使您未运?ASM。 ?/p>

--------------------------------------------------------------------------------

John Smiley (smileyj@tusc.com) ?TUSC Inc 的一位技术管理顾问。作?DBA、开发h员和目l理Q他h 18 q的 Oracle pȝ使用l验。他专门从事高性能调整、Oracle 真正应用集群、PL/SQL ~程、容量规划以及与 UNIX 有关的逻辑和物理数据库设计?




]]>
在Linux x86上安装Oracle数据?10g (2)http://m.tkk7.com/ASONG/articles/85852.html汪松?/dc:creator>汪松?/author>Wed, 06 Dec 2006 07:18:00 GMThttp://m.tkk7.com/ASONG/articles/85852.htmlhttp://m.tkk7.com/ASONG/comments/85852.htmlhttp://m.tkk7.com/ASONG/articles/85852.html#Feedback0http://m.tkk7.com/ASONG/comments/commentRss/85852.htmlhttp://m.tkk7.com/ASONG/services/trackbacks/85852.html选择 Shutdown?

选择 Restart computer?

输入 root 口o?

单击 OK?

恭喜Q您?Linux 软g现已安装完毕?

验证您的安装

如果完成了以上步骤,您应该具?Oracle 10g 所需的所有程序包和更新。您可以执行以下步骤验证您的安装?







所需内核版本Q?.4.21-138Q或更高版本Q?

 

通过q行以下命o查内核版本:

 

														
														uname -r

 

 

 

例如Q?

 

														
														# uname -r
k_smp-2.4.21-138

 

 

其他所需E序包的版本Q或更高版本Q:

 

														
														gcc-3.2.2-38 
make-3.79
binutils-2.12
openmotif-2.2.2-124

要查看系l上安装了这些程序包的哪些版本,?root 用户w䆾q行以下命oQ?

 

														
														rpm -q gcc make binutils openmotif

 

例如Q?

 

														
														# rpm rpm -q gcc make binutils openmotif
gcc-3.2.2-38
make-3.79.1-407
binutils-2.12.90.0.15-50
openmotif-2.2.2-124

 

 

如果pȝ上缺Q何程序包版本Q或版本比以上指定的版本旧,则可以从 SUSE Linux Portal 下蝲和安装更新?

--------------------------------------------------------------------------------

 

W?2 部分Q针?Oracle 配置 Linux

 

Linux 软g现已安装完毕Q您需要针?Oracle 对其q行配置。本部分逐步讲解针对 Oracle 数据?10g 配置 Linux 的过E?

 

验证pȝ要求

 

要验证系l是否满?Oracle 10g 数据库的最低要求,?root 用户w䆾dq运行以下命令?

 

 

要查看可?RAM 和交换空间大,q行以下命oQ?

 

														
														grep MemTotal /proc/meminfo
grep SwapTotal /proc/meminfo

 

 

例如Q?

 

														
														# grep MemTotal /proc/meminfo
MemTotal:512236 kB
# grep SwapTotal /proc/meminfo
SwapTotal:1574360 kB

 

 

所需最?RAM ?512MBQ而所需最交换空间ؓ 1GB。对?RAM 于或等?2GB 的系l,交换I间应ؓ RAM 数量的两倍;对于 RAM 大于 2GB 的系l,交换I间应ؓ RAM 数量的一C倍?

 

Oracle 10g 软gq需?2.5GB 的可用磁盘空_而数据库则另需 1.2GB 的可用磁盘空间?tmp 目录臛_需?400MB 的可用空间。要查系l上的可用磁盘空_q行以下命oQ?

 

														
														df -h

 

 

 

例如Q?

 

														
														# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 6.8G 1.3G 5.2G 20% /
/dev/sda1 99M 17M 77M 18% /boot

 

 

该示例表明,/tmp 目录没有自己的文件系l。(Ҏ指南而言Q它是根文gpȝ的一部分。)Ҏ件系l可用空间ؓ 5.2 GBQ除了满_?(2.5 + 1.2 + 0.4 = 4.1GB) 外还有富余?

创徏 Oracle l和用户帐户

 

接下来,创徏用于安装和维?Oracle 10g 软g?Linux l和用户帐户。用户帐户将UCؓ oracleQ而组称?oinstall ?dba。以 root 用户w䆾执行以下命oQ?br />





 

														
														/usr/sbin/groupadd oinstall
/usr/sbin/groupadd dba
/usr/sbin/useradd -m -g oinstall -G dba oracle
id oracle

 

 

 

例如Q?

 

														
														# /usr/sbin/groupadd oinstall
# /usr/sbin/groupadd dba
# /usr/sbin/useradd -m -g oinstall -G dba oracle
# id oracle
uid=501(oracle) gid=501(oinstall) groups=501(oinstall),502(dba)

 

 

讄 oracle 帐户的口令:

 

 

														
														passwd oracle

 

 

例如Q?

 

														
														# passwd oracle
Changing password for user oracle.
New password:
Retype new password:
passwd:all authentication tokens updated successfully.

 

 

创徏目录

 

现在Q创建存?Oracle 10g 软g和数据库文g的目录。本指南在创建目录结构时所用的命名惯例W合最佳灵zȝ?(OFA) 规范。有?OFA 标准的更多信息,请参阅针?UNIX pȝ?Oracle 数据?10g 安装指南 的附?D?

 

以下假设在根文gpȝ中创建目录。这样做是ؓ了简便v见,不徏议将其作为通用做法。这些目录通常被创Zؓ单独的文件系l?

 

?root 用户w䆾执行以下命oQ?

 

														
														mkdir -p /u01/app/oracle
mkdir -p /u02/oradata
chown -R oracle:oinstall /u01/app/oracle /u02/oradata
chmod -R 775 /u01/app/oracle /u02/oradata

 

 

 

例如Q?

 

														
														# mkdir -p /u01/app/oracle
# mkdir -p /u02/oradata
# chown -R oracle:oinstall /u01/app/oracle /u02/oradata
# chmod -R 775 /u01/app/oracle /u02/oradata

配置 Linux 内核参数

 

Linux 内核非常。与大多数其?*NIX pȝ不同QLinux 允许在系l启动和q行时修改大多数内核参数。完成内核参数更改后不必重新启动pȝ。Oracle 数据?10g 需要以下所C的内核参数讄。其中给出的是最|因此如果您的pȝ使用的D大,则不要更改它?br />

 

 

														
														kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000

 

 

如果您按照以上说明安装了 LinuxQ且内核参数全部采用默认|则只需在以 root 用户w䆾d后执行下命o?

 

 

														
														cat >> /etc/sysctl.conf <<EOF
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
EOF
/sbin/sysctl -p

 

 

例如Q?

 

														
														# cat >> /etc/sysctl.conf <<EOF
> kernel.shmall = 2097152
> kernel.shmmax = 2147483648
> kernel.shmmni = 4096
> kernel.sem = 250 32000 100 128
> fs.file-max = 65536
> net.ipv4.ip_local_port_range = 1024 65000
> EOF
# /sbin/sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
kernel.sysrq = 0
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000

 

 

?root 用户w䆾q行以下命o来验证您的设|:

 

														
														/sbin/sysctl -a | grep shm
/sbin/sysctl -a | grep sem
/sbin/sysctl -a | grep file-max
/sbin/sysctl -a | grep ip_local_port_range

 

 

 

例如Q?

 

														
														# /sbin/sysctl -a | grep shm
kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shm-use-bigpages = 0
# /sbin/sysctl -a | grep sem
kernel.sem = 250 32000 100 128
# /sbin/sysctl -a | grep file-max
fs.file-max = 65536
# /sbin/sysctl -a | grep ip_local_port_range
net.ipv4.ip_local_port_range = 1024 65000

 

 

如果pȝ的参数设|的比上q参数值小Q则~辑 /etc/sysctl.conf 文gQ添加或更改q些参数。完成后Q运行以下命令激zL改:

 

														
														/sbin/sysctl -p

 

 

 

对于 SLES 8Q在完成以上步骤后运行以下命令?

 

														
														/sbin/chkconfig boot.sysctl on

?oracle 用户讄 Shell 限制

 

Oracle Ҏ?Linux 帐户可以使用的进E数和打开的文件数讄限制。要q行q些更改Q以 root 用户的n份执行下列命令:




 

														
														cat >> /etc/security/limits.conf <<EOF
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
EOF

cat >> /etc/pam.d/login <<EOF
session required /lib/security/pam_limits.so
EOF

 

 

 

对于 RHEL 2.1 ?RHEL 3Q用以下命令:

 

														
														cat >> /etc/profile <<EOF
if [ \$USER = "oracle" ]; then
if [ \$SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
umask 022
fi
EOF

cat >> /etc/csh.login <<EOF
if ( \$USER == "oracle" ) then
limit maxproc 16384
limit descriptors 65536
umask 022
endif
EOF

 

 

 

对于 SLES 8Q用以下命令:

 

														
														cat >> /etc/profile.local <<EOF
if [ \$USER = "oracle" ]; then
if [ \$SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
umask 022
fi
EOF

cat >> /etc/csh.login.local <<EOF
if ( \$USER == "oracle" ) then
limit maxproc 16384
limit descriptors 65536
umask 022
endif
EOF

避免错误Q(仅限 SLES 8Q?

 

?SLES 8 上安?Oracle Enterprise Manager 10g 时存在一个错??׃所需端口以ؓ /etc/services 所保留而导致安装失败。OEM DBConsole 需要端?1830Q而在 SLES8 环境中,此端口已lؓ /etc/services 所保留。此错误?MetaLink 上的错误号ؓ 3513603?

 

要避免安装过E中出现问题Q以 root 用户w䆾dQƈ在安?Oracle 10g 软g之前?/etc/services 文g中的端口 1830 ?1849 对应的行注释掉。(注意Q此Ӟ您最好重新启动服务器以确保以上更改生效。)

 

oracle 用户的环境变?

 

要?Oracle 产品Q应该或必须讄几个环境变量。对于数据库服务器,讄以下环境变量Q?

 

														
														ORACLE_BASE
ORACLE_HOME
ORACLE_SID
PATH

 

 

 

如果您在同一服务器上安装了多?Oracle 产品或数据库Q则 ORACLE_HOME、ORACLE_SID ?PATH 变量可能会更攏VORACLE_BASE 变量不应更改Qƈ可以在需要时在您的登录配|文件中讄它。Oracle 提供了一个称?oraenv 的实用程序来讄其他变量?

 

?oracle w䆾dQƈ通过?.bash_profile ?.profileQbash ?kshQ中d以下行,?ORACLE_BASE d到登录配|文Ӟ

 

 

														
														ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE

 

 

或在 .login (csh) 中添加以下行Q?

 

														
														setenv ORACLE_BASE /u01/app/oracle

 

 

此更改将在您下次d?oracle 帐户时生效。要使更改对当前会话为活动状态,只需从命令行q行此命令?

--------------------------------------------------------------------------------

 

W?3 部分Q安?Oracle

 

可以?OTN 下蝲 Oracle 数据?10g。Oracle 提供了一个免费的开发和试许可。但不提供支持,且该许可不允许用于生产目的。OTN 提供了完整的许可协议?

 

要 Oracle 10g 发行套g介质可以在服务器上用,最单的Ҏ是将其直接下载到服务器?

 

使用囑Şd?oracle w䆾d?

 

创徏一个目录以存放 Oracle 10g 发行套gQ?

 

mkdir 10g_db

 

要从 OTN 下蝲 Oracle 数据?10gQ请浏览器QMozilla 比较好用Q指? http://www.oracle.com/technology/software/products/database/oracle10g/htdocs/linuxsoft.html? 填写 Eligibility Export Restrictions 面Qƈ阅读 OTN 许可协议。如果您接受限制和许可协议,则单?I Accept?

 

单击 ship.db.cpio.gz 链接Qƈ该文g保存在ؓ此目的创建的目录 (10g_db) ??如果未d?OTNQ则此时可能提示您登录?

 

解压~此文gQ?

 

														
														cd 10g_db
gunzip ship.db.cpio.gz
cpio -idmv < ship.db.cpio

 

 

安装软g

 

使用 oracle 帐户d?

 

指定数据库名U?(ORACLE_SID)。该名称通常不多于五个字W。对此安装?demo1?

 

讄环境变量Q?

 

														
														Borne shell ?Korn shell

ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_SID=demo1; export ORACLE_SID

C shell

setenv ORACLE_BASE /u01/app/oracle
setenv ORACLE_SID demo1

 

 

目录更改ؓ Oracle 10g 软g解压~到的位|?

 

例如Q?

 

														
														$ cd $HOME/10g_db

 

 

目录更改ؓ Disk1?

 

例如Q?

 

														
														$ cd Disk1

 

 

启动 Oracle 通用安装E序?

 

 

														
														$ ./runInstaller

Ƣ迎

单击 Next?

指定清单目录和证?

如果您一直在依@本指南中的步骤,则用默认值即可。否则,~辑清单目录的\径,以指向正目录?

操作pȝl名U应?oinstall?

如果q是首次在此机器上安?OracleQ则您将收到一个弹出窗口,提示需要以 root 用户w䆾q行 orainstRoot.sh 脚本。以 root 用户w䆾dQ更改到H口中指定的目录Q执行该脚本Q然后l操作?

指定文g位置

如果您一直在依@本指南中的步骤,则用默认值即可。否则,在l操作前保源\径和目标路径正确?

选择安装cd

接受默认?Enterprise Edition?

与特定品相关的先决条g的检?

如果您一直在依@本指南中的步骤,则所有检查都应顺利通过。如果一个或多个查失败,则在l箋操作前纠正该问题?

选择数据库配|?

接受默认?Create a starter database ?General Purpose?

指定数据库配|选项

输入数据库的全局数据库名U。该名称应包?ORACLE_SID 和服务器域名Q例如,demo1.orademo.orgQ其?demo1 ?ORACLE_SIDQorademo.org 是域名)?

输入全局数据库名U时QSID 框将自动填充?

接受默认的数据库字符集?

选择 Create database with sample schemas?

选择数据库管理选项

选择 Use Database Control for Database Management?

指定数据库文件存储选项

选择 File SystemQ然后输入数据库文g要用的路径名(在本例中?/u02/oradataQ?/p>

]]>
在Linux x86上安装Oracle数据?10g (1)http://m.tkk7.com/ASONG/articles/85851.html汪松?/dc:creator>汪松?/author>Wed, 06 Dec 2006 07:17:00 GMThttp://m.tkk7.com/ASONG/articles/85851.htmlhttp://m.tkk7.com/ASONG/comments/85851.htmlhttp://m.tkk7.com/ASONG/articles/85851.html#Feedback0http://m.tkk7.com/ASONG/comments/commentRss/85851.htmlhttp://m.tkk7.com/ASONG/services/trackbacks/85851.html概述 

q是?Linux 上安?Oracle 10g 软g主要lg指南pd的第一部分。这些文章详l介l了 Linux 的所有三个已认证的英语发行套Ӟ未介l?AsianuxQ,q假设用廉L Intel x86 g。同Ӟq逐步演示了ؓ评估主要 Oracle 10g 产品而在常见g上进行安装和配置的过E。 ?/p>

该系列的Ҏ目标是逐步演示如何安装和配|?10g |格的所有组件。通过q个pdQ您了解如何安装和配置单实?Oracle 10g 数据库(本文Q、双节点 Oracle RAC 10g 数据库、Oracle 应用服务?10g ?Oracle Enterprise Manager 10g |格控制的所有主要组件?

该系列提供的Ҏ采用最单的途径Q步骤数最)来完成Q务。该Ҏ通常意味着所选择的配|将只适用于评估。因此,该系列既不适用于构建生产品质的环境Q也不反映最佛_c ?/p>

以下是这些文章所介绍的获?Oracle 10g 认证的三?Linux 发行套gQ ?/p>

Red Hat Enterprise Linux 2.1

Red Hat Enterprise Linux 3

Novell SUSE Linux Enterprise Server 8

如果您是初次接触 Linux ??OracleQ那q第一文章特适合您。它首先介绍基础知识Q然后逐步演示如何从头安装 Oracle 数据?10g?

本文由四部分l成Q第 1 部分介绍了如何安?Linux 操作pȝQ第 2 部分介绍了如何针?Oracle 配置 LinuxQ第 3 部分介绍?Oracle 数据库安装的要点Q第 4 部分介绍了如何创建其他文件系lƈ介绍了自动存储管?(ASM)QOracle 数据?10g 中一个出色的新特性,它显著简化了存储理Q。附录提供了帮助您了解新数据库用法的信息Q其中包括如何交互地讉K该数据库、如何停止和启动数据库及相关?/p>

--------------------------------------------------------------------------------

W?1 部分Q安?Linux

本指南采用具有以下硬仉|的服务器:

两个 800MHz Pentium III CPU

512MB RAM

两个 SCSI L适配?(Ultra SCSI 160)

八个 SCSI 盘驱动?(2 x 9GB + 6 x 36GB)

一?100Base-T 以太|适配?

一?1000Base-T 以太|适配?

对磁盘进行配|,使每?SCSI L适配器连接到一?9GB 盘和三?36GB 盘?

h意,管q根本算不上是一个“强大”的讄Q但即便是用再低的讄也可以完成本指南介绍的大部分d。基本数据库安装只需要一?CPU?12MB 内存和一个可用空间至ؓ 6.5GB 的磁盘驱动器QIDE、SCSI ?FireWireQ?

现在Q我们将逐步演示在服务器上安?Linux 操作pȝ的过E。本文假设进?Linux pȝ全新安装Q有别于升Q,q假设服务器?Oracle 所专用Q且服务器上没有其他操作pȝ或数据?

Red Hat Enterprise Linux 2.1

Oracle 10g l认证可以在 Red Hat Enterprise Linux 2.1QAdvanced Server ?Enterprise ServerQ?Update 3) 或更高版本上q行。Red Hat Network (RHN) 提供更新Q这些更新可以作为用于创?CD ?ISO 文g或作为单个程序包更新下蝲?

要对全新 Linux 安装应用更新Q最单、最快速的Ҏ是用更?CD 执行安装。如?Linux 已经安装?CD 上没有更斎ͼ则可以通过 RHN 应用q些更新。由于本指南针对的是全新 Linux 安装Q因此您用更?CD?

使用更新 CD 集中的第一?CD 启动服务器?

您可能需要更?BIOS 讄Q以允许?CD 启动?

启动屏幕上出现时在底部显C?boot:?

选择 EnterQ从控制C执行囑Ş安装。(对于其他安装Ҏ和选项Q请参阅 Red Hat 安装指南。)

安装E序扫描gQ短暂显C?Red Hat 闪屏Q然后开始显CZpd屏幕提示?

选择语言

接受默认倹{?

配置键盘

接受默认倹{?

配置鼠标

接受默认倹{?

安装cd

接受默认倹{?

讄盘分区

本文不介l磁盘分区的详细ҎQ而是假设您熟悉磁盘分区方法?

Q警告:对磁盘进行错误分区是删除盘上所有内容的最可靠、最快捷的方法之一。如果不定如何分区Q请先停下来Q找人帮帮您Q否则您冒丢失数据的危险!Q?

本文使用以下分区ҎQ文件系l均?ext3Q:

W一个控制器 (/dev/sda) 上的 9GB 盘包含以下分区Q用于存放所?Linux ?Oracle 软gQ?

- 100MB /boot 分区Q对?RHEL 2.1Q最ؓ 50MBQ?

-1,500MB 交换分区 ?此分区大小臛_讄为系l?RAM 的两倍,但不要超q?2GBQ?2 位系l不支持大于 2GB 的交换文Ӟ。如果需要大?2GB 的交换空_则创建多个交换分区?

-7,150MB 根分??该分区将用于所有目录,包括 /usr?tmp?var?opt?home {。这样做Ua是ؓ了讲解本指南而简化安装。更可靠的分区方案是这些目录划分到单独的文件系l?

配置启动加蝲E序

接受默认倹{?

配置启动加蝲E序口o

如果要ؓ GRUB 讄口oQ请在此处输入。对于评估系l,无需讄该项?

配置|络

通常情况下,最好用静?IP 地址配置数据库服务器。ؓ此,取消选中 Configure using DHCP q输入服务器的网l配|。确保输入了L名且已选中 Activate on boot?

配置防火?

Z本演C的需要,不配置防火墙。选择 No firewallQ安全管理员Q请不要生气Q?

其他语言支持

接受默认倹{?

选择时区

选择适合您区域的旉讄。将pȝ旉讄?UTC Ҏ务器而言通常是一个很好的做法。ؓ此,单击 System clock uses UTC?

配置帐户

?root 用户选择一个口令,q将其输入所l的域中。ؓ自己创徏一个帐戗(不要在此时创?oracle 帐户Q我们将在稍后创建它。)

选择E序包组

选择 Gnome ?KDEQ或两者都选择Q图形用L面(默认? GnomeQ。注意:q两?GUI 都非常受Ƣ迎Q其?Gnome 在美国用更普遍。我个h偏爱 KDEQ这是因为它的终端模拟器可轻村֮现剪切和_脓Q从而可输入复制到多个q接Q例如,当您在多个节点上配置 RAC Ӟq将节省键入操作Q?

选择 Software Development

未解决的相关?

如果看到此屏q,只需选择 Install packages to satisfy dependenciesQ默认|ql操作?

配置囑Ş界面 (X)

接受默认|除非安装E序无法识别您的视频卡。如果您的视频卡无法被识别,则将无法l箋操作?

准备安装

单击 Next

安装E序?

软g被复制到硬盘ƈ被安装。根据提C更改磁盘,然后在安装完成时单击 Next?

创徏启动盘

如果需要,创徏一张启动磁盘,或选择 Skip boot disk creation?

配置监视?

如果安装E序正确识别了您的监视器Q则接受默认倹{否则,从列表中选择一个兼容的监视器?

恭喜

从系l中取出安装介质Q然后单?Next?

pȝ自动重新启动Qƈ昄一个图形登录屏q。如果您是用基本?CD 而非更新 CD 执行的安装,则在l箋操作前必通过 RHN 应用更新?

验证您的安装

如果完成了以上步骤,您应该具?Oracle 10g 所需的所有程序包和更新。您可以执行以下步骤验证您的安装?

  所需内核版本Q?.4.9-e.25Q或更高版本Q ?/p>

通过q行以下命o查内核版本:

 

														
														uname -r

例如Q?

 

														
														# uname -r
2.4.9-e.27smp

其他所需E序包的版本Q或更高版本Q:

 

														
														gcc-2.96-124 
make-3.79
binutils-2.11
openmotif-2.1.30-11
glibc-2.2.4-31

要查看系l上安装了这些程序包的哪些版本,q行以下命oQ?

 

														
														rpm -q gcc make binutils openmotif glibc

例如Q?

														
														# rpm -q gcc make binutils openmotif glibc
gcc-2.96-118.7.2
make-3.79.1-8
binutils-2.11.90.0.8-12
openmotif-2.1.30-11
glibc-2.2.4-32.8

如果pȝ上缺Q何程序包版本Q或版本比以上指定的版本旧,则可以从 Red Hat Network 下蝲q安装更新?

Red Hat Enterprise Linux 3

Oracle 10g l认证可以在不需要更新的情况下运?Red Hat Enterprise Linux 3QAdvanced Server ?Enterprise ServerQ的基本版本。如果拥有更? CDQ则可以使用更新版本中的启动 CD 而非基本版本中的启动 CD 在安装过E中自动应用所有更新。Oracle 支持 Red Hat 的所有更新?

使用W一?CD 启动服务器?

您可能需要更?BIOS 讄Q以允许?CD 启动?

启动屏幕上出现时在底部显C?boot:?

选择 EnterQ从控制C执行囑Ş安装。(对于其他安装Ҏ和选项Q请参阅 Red Hat 安装指南。)

安装E序扫描gQ短暂显C?Red Hat 闪屏Q然后开始显CZpd屏幕提示?

选择语言

接受默认倹{?

配置键盘

接受默认倹{?

Ƣ迎屏幕

单击 Next?

配置鼠标

接受默认倹{?

安装cd

选择 Custom?

讄盘分区

本文不介l磁盘分区的详细ҎQ而是假设您熟悉磁盘分区方法?

Q警告:对磁盘进行错误分区是删除盘上所有内容的最可靠、最快捷的方法之一。如果不定如何分区Q请先停下来Q找人帮帮您Q否则您冒丢失数据的危险!Q?

本文使用以下分区ҎQ文件系l均?ext3Q:

W一个控制器 (/dev/sda) 上的 9GB 盘包含以下分区Q用于存放所?Linux ?Oracle 软gQ?

- 100MB /boot 分区

-1,500MB 交换分区 ?此分区大小臛_讄为系l?RAM 的两倍,但不要超q?2GBQ?2 位系l不支持大于 2GB 的交换文Ӟ。如果需要大?2GB 的交换空_则创建多个交换分区?

-7,150MB 根分??该分区将用于所有目录,包括 /usr?tmp?var?opt?home {。这样做Ua是ؓ了讲解本指南而简化安装。更可靠的分区方案是这些目录划分到单独的文件系l。?/p>

配置启动加蝲E序

接受默认倹{?

配置|络

通常情况下,最好用静?IP 地址配置数据库服务器。ؓ此,单击 Edit?

出现一个弹出窗口。取消选中 Configure using DHCP 复选框Qƈ输入服务器的 IP 地址和网l掩码。确保选中 Activate on bootQ然后单?OK?

?Hostname 框中Q选择 manually q输入主机名?

?Miscellaneous Settings 框中Q输入其他网l设|?

配置防火?

Z本演C的需要,不配置防火墙。选择 No firewall?

其他语言支持

接受默认倹{?

选择时区

选择适合您区域的旉讄。将pȝ旉讄?UTC Ҏ务器而言通常是一个很好的做法。ؓ此,单击 System clock uses UTC?

讄 Root 口o

输入 root 的口令,q再ơ输入以q行认?

选择E序包组

只选择此处昄的程序包集,其他选项不要选?

桌面

- X Window pȝ

- Gnome

- KDE

- 请参阅我?RHES 2.1 部分中提供的有关 GUI 选择的意见?

应用E序

- ~辑?

- 囑Ş因特|?

服务?

- 不要选择该组中的M选项?

开?

- 开发工?

- 理工具

Red Hat Enterprise Linux

- 不要选择该组中的M选项?

杂项

- 原有软g开?

单击 Next l箋操作?

准备安装

单击 Next?

安装E序?

软g被复制到硬盘ƈ被安装。根据提C更改磁盘,然后在安装完成时单击 Next?

配置囑Ş界面 (X)

接受默认|除非安装E序无法识别您的视频卡。如果您的视频卡无法被识别,则将无法l箋操作?

配置监视?

如果安装E序正确识别了您的监视器Q则接受默认倹{否则,从列表中选择一个兼容的监视器?

定制囑Ş配置

接受默认倹{?

恭喜

从系l中取出安装介质Q然后单?Next?

pȝ自动重新启动q显CZ个新的欢q屏q?

单击 Next?

许可协议

阅读许可协议。如果同意其中的条款Q则选择 Yes, I agree to the License Agreement q单?Next?

日期和时?

讄日期和时间?

如果要?NTP 服务器(推荐Q,则选择 Enable Network Time Protocol q输?NTP 服务器的名称?

用户帐户

己创Z个帐戗?

此时不要?oracle 创徏帐户。本部分E后介l如何创?oracle 帐户?

Red Hat Network

如果要立即用或Ȁz?Red Hat Network 帐户Q则接受默认|单击 Next q?Red Hat 产品附带的品激z说明?

其他 CD

单击 Next?

完成讄

单击 Next?

出现一个图形登录屏q?

恭喜Q您?Linux 软g现已安装完毕?

验证您的安装

如果完成了以上步骤,您应该具?Oracle 10g 所需的所有程序包和更新。您可以执行以下步骤验证您的安装?

所需内核版本Q?.4.21-4.ELQ这?RHEL 3 的基本版本附带的内核版本。此内核或更C提供的Q何版本的内核均适用?Oracle 10g。)

 通过q行以下命o查内核版本:

														
														uname -r

例如Q?

														
														# uname -r
2.4.21-4.0.1.ELsmp

其他所需E序包的版本Q或更高版本Q:

														
														gcc-3.2.3-2 
make-3.79
binutils-2.11
openmotif-2.2.2-16
setarch-1.3-1
compat-gcc-7.3-2.96.122
compat-gcc-c++-7.3-2.96.122
compat-libstdc++-7.3-2.96.122
compat-libstdc++-devel-7.3-2.96.122

compat-db-4.0.14.5QOracle 10g 数据库安装指?中将其列为是必需的,但此处ƈ不需要)

要查看系l上安装了这些程序包的哪些版本,?root 用户w䆾q行以下命oQ?

														
														rpm -q gcc make binutils openmotif setarch compat-db compat-gcc \
compat-gcc-c++ compat-libstdc++ compat-libstdc++-devel

例如Q?

														
														# rpm -q gcc make binutils openmotif setarch compat-db compat-gcc \
> openmotif compat-gcc-c++ compat-libstdc++ compat-libstdc++-devel
gcc-3.2.3-20
make-3.79.1-17
binutils-2.14.90.0.4-26
openmotif-2.2.2-16
setarch-1.3-1
package compat-db is not installed
compat-gcc-7.3-2.96.122
compat-gcc-c++-7.3-2.96.122
compat-libstdc++-7.3-2.96.122
compat-libstdc++-devel-7.3-2.96.122

h意,未安装 compat-db E序包。安装过E中可用的Q何程序包l均不包含此E序包,因此必须在单独的步骤中安装。如果系l上~少M其他E序包版本,或版本比以上指定的版本旧 Qcompat-db 除外Q,则可以从 Red Hat Network 下蝲q安装更新?

安装 compat-db

插入原始 Red Hat Enterprise Linux 介质的第二张 CD。(Update 2 中未包含该程序包Q它仅存在于原始介质中。)

 ?CD 自动挂蝲?

 ?root 用户w䆾q行以下命oQ?

														
														rpm -ivh /mnt/cdrom/RedHat/RPMS/compat-db-4.0.14-5.i386.rpm

 例如Q?

														
														# rpm -ivh /mnt/cdrom/RedHat/RPMS/compat-db-4.0.14-5.i386.rpm
Preparing... ########################################### [100%]
1:compat-db ########################################### [100%]

SUSE Linux Enterprise Server 8  

Oracle 10g l认证可以在 Novell SUSE Linux Enterprise Server (SLES) 8 上运行。Novell 通过 CD 或通过其支持门户在U提?Service Pack 和程序包更新。在本指南中Q我们将?CD 安装 SLES 8 (Service Pack 3)?

使用 SLES 8 CD 启动服务器?

您可能需要更?BIOS 讄Q以允许?CD 启动?

出现 SUSE Linux Enterprise Server 安装屏幕?

选择 Installation?

安装E序扫描您的gq显C?YaST 界面?

选择语言

接受许可协议?

接受默认?English (US)?

安装讄

选择 New Installation?

分区

本文不介l磁盘分区的详细ҎQ而是假设您熟悉磁盘分区方法?

Q警告:对磁盘进行错误分区是删除盘上所有内容的最可靠、最快捷的方法之一。如果不定如何分区Q请先停下来Q找人帮帮您Q否则您冒丢失数据的危险!Q?

 

本文使用以下分区ҎQ文件系l均?ext3Q:

 

W一个控制器 (/dev/sda) 上的 9GB 盘包含以下分区Q用于存放所?Linux ?Oracle 软gQ?

- 100MB /boot 分区

-1,500MB 交换分区 ?此分区大小臛_讄为系l?RAM 的两倍,但不要超q?2GBQ?2 位系l不支持大于 2GB 的交换文Ӟ。如果需要大?2GB 的交换空_则创建多个交换分区?

-7,150MB 根分??该分区将用于所有目录,包括 /usr?tmp?var?opt?home {。这样做Ua是ؓ了讲解本指南而简化安装。更可靠的分区方案是这些目录划分到单独的文件系l?

 

软g

单击 Software 的链接?

出现 Software Selection 屏幕?

单击 Detailed Selection?

左侧H口昄软g选择列表。单L个选项旁的复选框以将光中/取消选中?

选择以下软gQ这是推荐的软g集;不要选中其他软gQ:

- C/C++ ~译器和工具

- KDEQ或 GnomeQ?

- LSB q行时环?

- 帮助与支持文?

- 囑Ş基本pȝ

- YaST2 配置模块

- SLES 理工具

不要安装以下,因ؓ它们可能与提供相同服务的 Oracle 产品冲突Q?

- ?Web 服务?

- w䆾验证服务器(NIS、LDAP、KerberosQ?

时区

讄您的时区?

单击 Accept?

出现一个警告对话框。准备好l箋操作Ӟ单击 Yes, install?

Ҏ安装E序的提C更?CD?

安装此Y件后Q将昄一个窗口,提示基本pȝ已经安装成功?

取出安装 CDQ然后单?OK?

pȝ重新启动?

输入 root 用户的口令,q再ơ输入以q行认?

己创Z个帐戗不要在此时创徏 oracle 帐户Q我们将在稍后创建它?

桌面讄

接受默认倹{?

出现一个有兌动检本地打印机的警告窗口?

单击 Skip detection?

配置|络接口Qƈ在准备好l箋操作后单?Next?

为服务器讄静?IP 地址?

构徏数据库无需配置打印机、调制解调器、ISDN 适配器或声卡?

出现一个图形登录屏q?

现在Q您需要安?Service Pack 3。以您自qw䆾d?

插入更新 CDQ然后单?Patch CD Update?

启动 YaST2QSUSE 的系l管理工P?

选择 SUSE > System > YaST2。(SUSE 是位于屏q左下部带微W蜥蜴侧脸的l色圆按钮。它相当于“开始”。)

出现一个窗口,提示输入 root 用户口o。输入口令,然后单击 OK?

出现 YaST Control Center?

出现 YaST Online Update H口?

接受默认|然后单击 Next?

出现一个窗口,昄一个补丁更新列表?

YaST 在更新系l其他部分之前需要先对自w进行更新。所需E序包已被选中。此时不要选择M其他E序包?

单击 Accept?

出现一个窗口,提示重新启动在线更新?

单击 OK?

出现一个窗口,提示安装已成功?

单击 OK?

?YaST Online Update H口中,单击 Finish?

?YaST Control Center H口中,单击 Close?

重复步骤 21 ?22?

出现一个窗口,昄一个补丁更新列表?

单击 Accept 接受默认倹{?

可能出现包含各种提示Q如“Make sure you update sendmail”)的小弹出H口。单?OK 关闭它们?

此步骤需要一些时间。将光标悬停?Next 按钮上。如果更C在运行,则显CZ个时钟图标?

出现一个窗口,提示安装已成功?

单击 OK?

?YaST Online Update 屏幕上,单击 Next?

安装E序写系l配|?

?YaST Control Center 中,单击 Close?

注销?

SUSE > Logout?

取出更新 CD?

重新启动pȝ?

在图形登录屏q上Q单?Menu?



]]>
SQL大全http://m.tkk7.com/ASONG/articles/55264.html汪松?/dc:creator>汪松?/author>Tue, 27 Jun 2006 01:57:00 GMThttp://m.tkk7.com/ASONG/articles/55264.htmlhttp://m.tkk7.com/ASONG/comments/55264.htmlhttp://m.tkk7.com/ASONG/articles/55264.html#Feedback0http://m.tkk7.com/ASONG/comments/commentRss/55264.htmlhttp://m.tkk7.com/ASONG/services/trackbacks/55264.html 一?b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQLPLUS?
1引a?

SQL命o?
以下17个是作ؓ语句开头的关键字:?
alterdroprevoke?
auditgrantrollback*?
commit*insertselect?
commentlockupdate?
createnoauditvalidate?
deleterename?
q些命o必须以?”结
?命o句尾不必加分Pq且不存?b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL~存区。

SQL中没有的SQL*PLUS命o?
q些命o不存?b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL~存区
@definepause?
#delquit?
$describeremark?
/disconnectrun?
acceptdocumentsave?
appendeditset?
breakexitshow?
btitlegetspool?
changehelp?b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">sqlplus?
clearhoststart?
columninputtiming?
computelistttitle?
connectnewpageundefine?
copy?

---------?
2数据库查询?

数据字典?
TAB用户创建的所有基表、视囑֒同义词清单

DTAB构成数据字典的所有表?

COL用户创建的的所有列定义的清单

CATALOG用户可存取的所有基表清单

select?fromtab;?

describe命o描q基表的l构信息?
describedept?

select??
fromemp;?

selectempno,ename,job?
fromemp;?

select?fromdept?
orderbydeptnodesc;?

逻辑q算W
=?=?lt;>?gt;?gt;=?lt;?lt;=?
in?
betweenvalue1andvalue2?
like?
%?
_?
innull?
not?
noin,isnotnull?

谓词in和notin?
有哪些职员和分析员
selectename,job?
fromemp?
wherejobin?'clerk','analyst');?

selectename,job?
fromemp?
wherejobnotin?'clerk','analyst');?

谓词between和notbetween?
哪些雇员的工资在2000?000之间?
selectename,job,salfromemp?
wheresalbetween?000and?000;?

selectename,job,salfromemp?
wheresalnotbetween?000and?000;?

谓词like,notlike?
selectename,deptnofromemp?
whereenamelike?S%';?
(以字母S开??
selectename,deptnofromemp?
whereenamelike?%K';?
(以Kl尾)?
selectename,deptnofromemp?
whereenamelike?W___';?
(以W开_后面仅有三个字母)?
selectename,jobfromemp?
wherejobnotlike?sales%';?
(哪些雇员的工U名不以sales开??

谓词isnull,isnotnull?
没有奖金的雇员(即commision为nullQ
selectename,jobfromemp?
wherecommisnull;?

selectename,jobfromemp?
wherecommisnotnull;?

多条件查询
selectename,job?
fromemp?
wheredeptno=20?
andjob!='clerk';?

表达式
+????

术表达式
选择奖金高于其工资的5%的雇员
selectename,sal,comm,comm/salfromemp?
wherecomm>.05*sal?
orderbycomm/saldesc;?

日期型数据的q算?
addtwodaysto?-Mar-87?
6-Mar-87????-Mar-87?
addtwohoursto?-Mar-87?
6-Mar-87??/24??-Mar-87and?hrs?
add?5secondsto?-Mar-87?
6-Mar-87??5/(24*60*60)??-Mar-87and?5secs?

列名的别名
selectenameemployeefromemp?
wheredeptno=10;?
Q别名:employeeQ
selectename,sal,comm,comm/sal?C/SRATIO"fromemp?
wherecomm>.05*sal?
orderbycomm/saldesc;?

SQL命o的编辑
listorl显C缓冲区的内Ԏ
list?显C当?b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL命o的第4行,q把W?行作为当前行Q在该行号后面有?。
changeorc用新的内容替换原来在一行中W一ơ出现内Ԏ
SQL>c/(...)/('analyst')/?
inputori增加一行或多行?
appendora在一行后q加内容?
del删除当前行删?b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL~冲Z的当前行?
run显Cƈq行SQL~冲Z的命令
/运?b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL~冲Z的命令
edit把SQL~冲Z的命令写到操作系l下的文本文Ӟ?
q调用操作系l提供的~辑器执行修攏V

-------------?
3数据操U
数据的插入
insertintodept?
values?10,'accounting','newyork');?

insertintodept?dname,deptno)?
values?'accounting',10);?

从其它表中选择插入数据?
insertintoemp?empno,ename,deptno)?
selectid,name,department?
fromold_emp?
wheredepartmentin(10,20,30,40);?

使用参数?
insertintodept?
values(&deptno,&dname,&loc);?
执行ӞSQL/PLUSҎ个参数将有提C用戯入

参数对应日期型或字符型数据时Q可在参C加引P输入时就可不用引号
insertintodept?
values(&deptno,'&dname','&loc');?

插入I|NULLQ
insertintodept?
values(50,'education',null);?

插入日期型数据
日期型数据缺省格式:DD-MON-YY?
insertintoemp?
(empno,ename,hiredate)?
values(7963,'stone','07-APR-87');?

pȝ旉QSYSDATE?
insertintoemp?
(empno,ename,hiredate)?
values(7600,'kohn',SYSDATE);?

数据更新?
updateemp?
setjob='manager'?
whereename='martin';?

updateemp?
setjob='marketrep'?
whereename='salesman';?

updateemp?
setdeptno=40,job='marketrep'?
wherejob='salesman';?

数据删除?
deleteemp?
whereempno=765;?

更新的提交
commit?

自动提交方式?
setautocommiton?
如果状态设为开Q则使用inesrt,update,delete会立x交。

更新取消?
rollback?

两次q箋成功的commit之间的操作,UCؓ一个事务

---------------?
4创建基表、视国
创徏?
createtabledept?
(deptnonumber(2),?
dnamechar(14),?
locchar(13));?

数据字典会自动更新。
一个基表最?54列。

表名列名命名规则Q
限制?
W一个字W必L字母Q后面可LQ包括$?_但不能是逗号Q。
名字不得过30个字W。

唯一?
某一用户的基表名必须唯一Q不能是ORACLE的保留字Q同一的列名互不相同。

使用双引号
如果表名用双引号括v来,则可不满上q规则;?
只有使用双引P才能区别大、小写;?
命名时用了双引P在以后的操作也必M用双引号。

数据cdQ
char(n)(不得过240字符Q
number(n,d)?
date?
long(最?5536字符Q
raw(二进制原始数据)?

I值处理
有时要求列g能ؓI
createtabledept?
(deptnonumber(2)notnull,?
dnamechar(14),?
locchar(13));?

在基表中增加一列
altertabledept?
add?headcntnumber(3));?

修改已有列属性
altertabledept?
modifydnamechar(20);?
注:只有当某列所有值都为空Ӟ才能减小其列值宽度。
只有当某列所有值都为空Ӟ才能改变其列值类型。
只有当某列所有值都ZI时Q才能定义该列ؓnotnull。
例:?
altertabledeptmodify?locchar(12));?
altertabledeptmodifylocchar(12);?
altertabledeptmodify?dnamechar(13),locchar(12));?

创徏视图?
createviewmanagersas?
selectename,job,sal?
fromemp?
wherejob='manager';?

囑ֈ名取别名?
createviewmydept?
(person,title,salary)?
asselectename,job,sal?
fromemp?
wheredeptno=10;?

withcheckoption选项?
使用withcheckoptionQ保证当对视图插入或更新数据Ӟ?
该数据必L囑֮义中select命o所指定的条件。
createviewdept20as?
selectename,job,sal,deptno?
fromemp?
wheredeptno=20?
withcheckoption;?
在做下述操作Ӟ会发生错误
updatedept20?
setdeptno=30?
whereename='ward';?

、视囄拯?
createtableemp2?
asselect?fromemp;?

、视囄删除?
droptable表名
dropview视囑֐?

------------?
5?b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL*PLUS报表功能?
SQL*PLUS的一些基本格式命令
columndeptnoheadingdepartment?

columnenameheadingname?

columnsalheadingsalary?

columnsalformat?99,999.00?

ttitlesamplereportfor|hitechcorp?

btitlestrictlyconfidential?

breakondeptno?

computesumofsalondeptno?

run?

表头和表
ttitlesamplereportfor|hitechcorp?
btitlerightstrictlyconfidential?

“|”表C换行,l尾不必加分号
选项有三U:leftrightcenter?

使用TTITLEQ系l将自动地在每页的顶部显C日期和号。
TTITLET和BTITLE命o有效Q直至重新设|表头或表尾Q或退?b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL*PLUS。

下面命o使标题语句失效
TTITLEOFF?
BTITLEOFF?

列名?
column命o定义用于昄列名?
若名字ؓ一个单词,不必加引号
columnenameheadingemployee?

columnenameheading?employee|name'?
Q|为换行)?

取消栏定义
columnenameclear?

列的格式?
columnenameformatA15?

columnsalformat?9,999.99?

columncommlikesal?

like子句Q得某一列的格式参照另一列格式,它拷贝列名及其格式

控制记录昄分组序?
breakondeptno?
Q不昄重复|?

selectdeptno,ename?
fromemp?
orderbydeptno;?
QORDERBY子句用于控制BREAKQ

昄为
10clark?
niller?
20smith?
scott?
30allen?
blake?

每次只有一个BREAK命o起作用,但一ơ可以在多个列上使用BREAK命o?
breakon列?on列??

记录分组?
breakondeptnoskip??
selectdeptno,ename?
fromemp?
orderbydeptno;?

每个deptno之间IZ行
clearbreakQ取消BREAK命oQ
breakonpageQ每ơ从一新页开始)?
breakonreportQ每ơ从一新报表开始)?
breakonpageonreportQ联合用)?

分组计算?
breakondeptnoskip??
computesumofsalondeptno?
计算每个部门的工资d?
skip子句佉K门之间的信息分隔开?

其他计算命o?
computeavgofsalondeptnoQ^均|?
count非I值的L?
MAX最大倉A
MIN最倉A
STD标准偏差
VAR协方差?
NUMBER行数

使compute命o失效?
一旦定义了COMPUTEQ则一直有效,直到?
关闭COMPUTEQclearcomputeQ

SQL/PLUS环境命o?
show选项?
Q显C当前参数设|情况)?

showallQ显C全部参敎ͼ?

讄参数?
set选项值或开关

setautocommiton?

SET命o包括?
setautocommit{off|on|immediate}?
Q自动提交,OFF~省Q

setecho{off|on}?
Q命令文件执行,是否在终端上昄命o本nQOFF~省Q

setfeedback{off|on}?
QONQ查询结束时Q给出结果,记录数的信息Q缺省;?
OFFQ无查询l果Q记录数的信息)?

setheading{off|on}?
QONQ列的头标在报表上显C,~省QOFFQ不在报表上昄Q

setlinesize{n}?
一行显C的最大字W数Q缺省ؓ80?

setpagesize{n}?
每页的行敎ͼ~省?4?

setpause{off|on|text}?
QONQ当报表过一|Q每昄一屏就暂停昄Q等待用h回R键,再接着昄Q
OFFQ页与页不停,~省QtextQ页与页停顿Qƈ向用hCZ息)?

SETBUFFERbuffer?
讄当头的命令缓冲区Q通常情况下,SQL命o~冲区已为当前缓冲区。
׃SQL命o~冲区只能存放一?b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL命oQ
所以可用其它缓冲区来存?b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL命o?b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL*PLUS命o。

l常用到的设|可攑֜login.sql文g中。

SETNULL?
setnull?nodata'?

selectename,comm?
fromemp?
wheredeptno=30;?
把部?0中无佣金雇员的䄦金显CZؓ“NODATA”。

setnull?b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL*PLUS命oQ用它来标识I|NULLQ,可以讄ZQ意字W串。

存盘命oSAVE?
save文件名?

input?
1selectempno,ename,job?
2fromemp?
3wherejob='analyst'?

saveresearch?

目录中会增加一个research.sql文g。

~辑命oEDIT?
edit?

EDIT~辑当前~冲Z的内宏V

~辑一个文~
editresearch?

调入命oGET?
getresearch?
把磁盘上的文件内容调入缓冲区Qƈ昄在屏q上Q文件名不必加.sql。

START命o?
q行指定的文~
startresearch?

输出命oSPOOL?
spooltryfile?
不仅可以使查询结果在屏幕上显C,q可以ɾl果存入文g?

停止向文件输出
spooloff?

把查询结果在打印Z输出Q先把它们存入一个文件中Q
然后不必使用SPOOLOFFQ而用Q
spoolout?
SPOOLOUT关闭该文件ƈ在系l缺省的打印Z输出?

制作报表举例?
edittryfile?

setechooff?
setautocommiton?
setpagesize?5?
insertintoemp?empno,ename,hiredate)?
values(9999,'geiger',sysdate);?
insertintoemp?empno,ename,deptno)?
values(3333,'samson',20);?
spoolnew_emp?
select?fromemp?
wheredeptno=20?
ordeptnoisnull?
/?
spooloff?
setautocommitoff?

用start命o执行q个文g?

--------?
6函数
字符型函数
initcap(ename);ename中每个词的第一个字母改为大写。
如:jacksmith--JackSmith?

length(ename);计算字符串的长度。

substr(job,1,4);?

其它?
lower?
upper?
least取出字W串列表中按字母排序排在最前面的一个串?
greatest取出字W串列表中按字母排序排在最后的一个串?

日期函数?
add_month(hiredate,5)在雇䄦旉上加5个月?
month_between(sysdate,hiredate)计雇佣时间与pȝ旉之间相差的月数
next_day(hiredate,'FRIDAY')计受雇日期之后的W一个星期五的日期

例
selectename,sal,next_day(sysdate,'FRIDAY')as_of?
fromemp?
wheredeptno=20;?
Qas_of是别名)?

如果不用to_char函数Q日期在ORACLE中的~省格式?DD_MON_YY'?
to_char(date,datepicture)?

selectename,to_char(hiredate,'DyMondd,yyyy')hired?
fromemp?
wheredeptno=10;?

to_date(字符?格式)?

insertintoemp(empno,ename,hiredate)?
values(7999,'asms',to_date('070387083000','MMDDYYHHMISS'));?

日期型数据的格式?
dd?2?
dyfri?
dayfriday?
ddspthtwelfth?

mm?3?
monmar?
monthmarch?

yy?7?
yyyy?987?

例
Mar?2,1987?Mondd,yyyy'?
MAR?2,1987?MONdd,yyyy'?
ThursdayMARCH?2?DayMONTHdd'?
Mar?2?1:00am?Monddhh:miam'?
Thu,thetwelfth?Dy,"the"ddspth'?

术函数?
least(v1,v2)?

selectename,empno,mgr,least(empno,mgr)lownum?
fromemp?
whereempno0?

trunc(sal,0)?
取sal的近似|截断Q

I值函数
nvl(v1,v2)?
v1为列名,如果v1不是I|nvlq回其列倹{
v1为空|q回v2的倹{

聚组函数?
selectsum(comm)?
fromemp;?
Q返回一个汇M息)?
不能把sum用在select语句里除非用groupby?

字符型、日期型、数字型的聚l函数
minmaxcount可用于Q何数据类型

selectmin(ename)?
fromemp;?

selectmin(hiredate)?
fromemp;?

selectmin(sal)?
fromemp;?

有多h有工作??
selectcount(job)?
fromemp;?

有多种不同的工U??
selectcount(distinctjob)?
fromemp;?

countdistinct计某一字段中不同的值的个数?

其它聚组函数Q只用于数字型数据)?
avg计^均工资
selectavg(sal)?
fromemp;?

stddev计工资的q_差
selectstddev(sal)?
fromemp;?

sum计d资
selectsum(sal)?
fromemp;?

groupby子句?
selectdeptno,sum(sal),avg(sal)?
fromemp?
groupbydeptno;?

按多个条件分l
每个部门的雇员数?
selectdeptno,count(*)?
fromemp?
groupbydeptno;?

每个部门的每个工U的雇员数
selectdeptno,job,count(*)?
fromemp?
groupbydeptno,job;?

满条g的分l
Qwhere是针对select的,having是针对groupby的)?
哪些部门的工资d过?000?
selectdeptno,sum(sal)?
fromemp?
groupbydeptno?
havingsum(sal)>9000;?

select结?
除去职员Q哪些部门的工资d过?000?
selectdeptno,sum(sal)?
fromemp?
wherejob!='clerk'?
groupbydeptno?
havingsum(sal)>8000?
orderbysum(sal);?

---------?
7高U查询
{D接
selectempno,ename,job,emp.deptno,dname?
fromemp,dept?
whereemp.deptno=dept.deptno;?

外联接
selectename,dept.deptno,loc?
fromemp,dept?
whereemp.deptno(+)=dept.deptno;?
如果在dept.deptno中有的数|在emp.deptno中没有(如deptno=40Q,?
则作外联接时Q结果中会生一个空倉A

自联接:同一的不同行要做联接Q可使用自联接
指出每个雇员的经理名字
selectworker.ename,manager.enamemanager?
fromempworker,empmanager?
whereworker.mgr=manager.empno;?

非等D接
哪些雇员的工资属于第三别
selectename,sal?
fromemp,salgrade?
wheregrade=3?
andsalbetweenlosalandhisal;?
Q基表salgradeQgradelosalhisalQ

集合q算?
行的q接?
集合q算?个或多个查询l果合ƈZ个
union-setunion?
Rowsoffirstqueryplusofsecondquery,lessduplicaterows?

intersect-setintersection?
Rowsbothquerieshaveincommon?

minus-setdifference?
rowsuniquetothefirstquery?

介绍几个视图?
accountview?
enamesaljob?

salesview?
enamesaljob?

researchview?
enamesaljob?

unionq算?
q回一个查询结果中有但又不重要的行Q它基表或视图中的记录合ƈ在一起
所有部门中有哪些雇员工资超q?000?
对应列的数据cd必须相同?
selectename,sal?
fromaccount?
wheresal>2000?
union?
selectename,sal?
fromresearch?
wheresal>2000?
union?
selectename,sal?
fromsales?
wheresal>2000;?

intersectq算?
q回查询l果中相同的部分?
各个部门中有哪些相同的工U
selectjob?
fromaccount?
intersect?
selectjob?
fromresearch?
intersect?
selectjob?
fromsales;?

minusq算?
q回在第一个查询结果中与第二个查询l果不相同的那部分行记录。
有哪些工U在财会部中有,而在销售部中没有??
selectjobfromaccount?
minus?
selectjobfromsales;?

子查询
slectename,deptno?
fromemp?
wheredeptno=?
(selectdeptno?
fromemp?
whereename='smith');?

多子查询
selectename,job,sal?
fromemp?
wherejob=?
(selectjob?
fromemp?
whereename='clark')?
orsal>?
(selectsal?
fromemp?
whereename='clark');?

多个与子查询?
selectename,job,sal?
fromemp,dept?
whereloc='newyork'?
andemp.deptno=dept.deptno?
andsal>?
(selectsal?
fromemp?
whereename='scott');?

子查询中使用聚组函数?
selectename,hiredate?
fromemp?
wherehiredate=?
(selectmin(hiredate)?
fromemp);?

------------?
8授权
pȝ权限?
DBA所有权限
RESOURCE注册,创徏新的?
CONNECTQ注册,查询?

只有DBA才有权创建新的用户
grantconnecttoscott?
identifiedbytiger;?

DBA或用戯己可以改变用户口令
grantconnecttoscott?
identifiedbyleopard;?

权限1?
有两U方法获得对操作的权限

创徏自己的基表
获得创徏用户的许可
grantselect,insert?
onemp?
toscott;?

q些权限有
selectinsertupdatedeletealterindex?

把所有权限授于他人
grantallonemptoscott;?

同义词
select??
fromscott.emp?

创徏同义词
为用户allen的EMP创徏同义词employee?
createsynonymemployee?
forallen.emp?

权限2?
你可以其他用户有这L权力Q即其他用户可以把你的基表权限授予他人
grantall?
onemp?
toscott?
withgrantoption;?

收回权限?
pȝ权限只有被DBA收回?

权限随旉可以收回?

revokeinsert?
onemp?
fromscott;?

---------?
9烦引
建立索引?
createindexemp_ename?
onemp(ename);?

删除索引?
dropindexemp_ename;?

关于索引?
只对较大的基表徏立烦引(臛_50条记录)?
建立索引之前插入数据?
对一个基表可建立L多个索引?
一般是在作Z键的列上建立索引?
建立索引之后Q不影响SQL命o的执行
建立索引之后Q?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE自动l护和用烦引

保证数据唯一性
提高执行速度的同Ӟ索引q可以保证每个记录中的每个列值是不重复的。
createuniqueindexemp_empno?
onemp(empno);?

--------?
l习和答案

有没有工资比奖金多的雇员Q如果有Q按工资的降序排列。
如果有两个以上的雇员工资相同Q按他们的名字排序。
selectenameemployee,salsalary,commcommision?
fromemp?
wheresal>comm?
orderbysaldesc,ename;?

列出有关雇员姓名、奖金占收百分比的信息。
要求昄时列名意义明,按雇员姓名排序,不包括奖金未知的雇员。
selectenameemployee,(comm/(comm+sal))*100incentive?
fromemp?
wherecommisnotnull?
orderbyename;?

在chicagoQ部?0Q工作的所有雇员的工资上涨10%。
updateemp?
setsal=1.1*sal?
wheredeptno=30;?

updateemp?
setsal=1.1*sal?
wheredeptno=(selectdeptno?
fromdept?
whereloc='chicago');?

为hitech公司新徏一个部门,~号?0Q其它信息均不可知。
insertintodept(dname,deptno)?
values('faclities',50);?

创徏视图Q三个列名,其中不包括职员信息
createviewemployee("employeename",?
"employeenumber",?
"employeejob")?
asselectename,empno,job?
fromemp?
wherejob!='clerk';?

制作工资报表Q包括雇员姓名、受雇时_按星期计)Q工资和部门~号Q
一|CZ个部门的信息Q每尾Q显C늚工资之和以及受雇旉之和Q
报表l尾处,昄所有雇员的工资d以及受雇旉dQ
工资按美元计,受雇旉按星期计,每页的上方应有标题。
ttitle?service'?
breakondeptnoonpageonreport?
computesumofsalondeptno?
computesumofsalonreport?
computesumofservice_lengthondeptno?
computesumofservice_lengthonreport?
columnsalformat?99,999.00?
columnservice_lengthformat?999?
selectdeptno,enameemployee,(sysdate-hiredate)/7service_length,sal?
fromemp?
orderbydeptno;?

制作报表Q包括雇员姓名、L入和受䄦日期Q
且:姓名的第一个字母必d写,雇䄦日期格式为MM/DD/YYYYQ
L入包括没有奖金的雇员的L入,姓名按字母顺序排列。
col?hiredate"formatA12?
col?employee"formatA10?
col?compensation"format?99,999.00?
selectinitcap(ename)?employee",?
(sal+nvl(comm,0))?compensation",?
to_char(hiredate,'MM/DD/YYYY')?hiredate"?
fromemp?
orderbyename;?

列出有超q?个周边国家的国家名字和面U。
selectnation,area?
fromnation?
wherecodein?
(selectnation_code?
fromborder?
groupbynation_code?
havingcount(*)>7);?

列出所有面U大于等于日本的岛国的国名和人口。
selectnation,population?
fromnation,border?
wherecode=nation_code(+)?
andnation_codeisnull?
andarea>=?
(selectarea?
fromnation?
whereupper(nation)='JAPAN');?

列出所有边界在其它国家中的国名Qƈ且显C其边界国家名字。
breakonnation?
selectnation1.nation,?
nation2.nationborderin_country?
fromnationnation1,border,nationnation2?
wherenation1.code=border.nation_code?
andborder.border_code=nation2.code?
orderbynation1.nation;?

-----------?
-----------?
PL/SQL?

2PL/SQL的块l构和数据类型

块结构的特点?
嵌套?
begin?
......?
begin?
......?
exception?
......?
end;?
exception?
......?
end;?

标识W:?
不能过30个字W
W一个字W必Mؓ字母?
其余字符可以是字母,数字Q?Q_Q或#?
不区分大写形式?
如果用双引号括v来,则字W顺序可以Q意排列,q区分大写形式?
?b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL保留字

数据cd?
数字型:?
整数Q实敎ͼ以及指数?

字符Ԍ?
用单引号括v来
若在字符串表C单引号Q则使用两个单引号
字符串长度ؓӞ两个单引号之间没有字W)Q则表示NULL?

字符Q
长度?的字W串?

数据定义?
语法?
标识W[常数>数据类型[NOTNULL>[:=PL/SQL表达?gt;;?
':='表示l变量赋倉A

数据cd包括?
数字型number(7,2)?
字符型char(120)?
日期型date?
布尔型booleanQ取gؓtrue,false或nullQ不存贮在数据库中)?

日期型
anniversarydate:='05-JUL-95';?
project_completiondate;?

布尔型
over_budgetbooleannotnull:=false;?
availableboolean;?
Q初始gؓNULLQ

%typecd匚w?
books_printednumber(6);?
books_soldbook_printed%type;?
manager_nameemp.ename%type;?

变量赋倉A
变量?=PL/SQL表达式
numvar:=5;?
boolvar:=true;?
datevar:='11-JUN-87';?

字符型、数字型表达式中的空倉A
null+<数字>=nullQ空值加数字仍是I|?
null><数字>=nullQ空g数字q行比较Q结果仍是空|?
null||'字符?='字符?Qnull?'Q
Q空g字符串进行连接运,l果为原字符Ԍ?

变量作用范围?
标识W在宣言它的块中有效?
标识W如果不在子块中重新定义Q则在PL/SQL块的所有子块中同样有效?
重新定义后的标识W,作用范围仅在本子块中有效?

例
declare?
e_messchar(80);?
begin?
/*子块1*/?
declare?
v1number(4);?
begin?
selectempnointov1fromemp?
wherejob='president';?
exception?
whentoo_many_rowsthen?
insertintojob_errors?
values('morethanonepresident');?
end;?
/*子块2*/?
declare?
v1number(4);?
begin?
selectempnointov1fromemp?
wherejob='manager';?
exception?
whentoo_many_rowsthen?
insertintojob_errors?
values('morethanonemanager');?
end;?
exception?
whenothersthen?
e_mess:=substr(sqlerrm,1,80);?
insertintogeneralerrorsvalues(e_mess);?
end;?

---------?
3?b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL和PL/SQL?

插入?
declare?
my_salnumber(7,2):=3040.55;?
my_enamechar(25):='wanda';?
my_hiredatedate:='08-SEP-88';?
begin?
insertintoemp?
(empno,enmae,job,hiredate,sal,deptno)?
values(2741,my_ename,'cabdriver',my_hiredate,my_sal,20);?
end;?

删除?
declare?
bad_child_typechar(20):='naughty';?
begin?
deletefromsantas_gift_listwhere?
kid_rating=bad_child_type;?
end;?

事务处理?
commit[WORK>;?
rollback[WORK>;?
Q关键字WORK可选,但对命o执行无Q何媄响)?
savepoint标记名;Q保存当前点Q
在事务中标记当前Ԏ
rollback[WORK>to[SAVEPOINT>标记名;Q回退到当前保存点Q
取消savepoint命o之后的所有对数据库的修改?
关键字WORK和SAVEPOINT为可选项Q对命o执行无Q何媄响

函数?
PL/SQL块中可以使用SQL命o的所有函数
insertintophonebook(lastname)value(upper(my_lastname));?
selectavg(sal)intoavg_salfromemp;?

对于?b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL命oQ可使用大多C体函数
不能使用聚组函数和参CC定的函数Q如?
x:=sqrt(y);?
lastname:=upper(lastname);?
age_diff:=months_between(birthday1,birthday2)/12;?

赋值时的数据类型{换
4U赋值Ş??
变量?=表达式
insertinto基表名values(表达?,表达?,...);?
update基表名set列?表达??
select列名into变量名from?..;?

数据cd间能q行转换的有:?
char转成number?
number转成char?
char转成date?
date转成char?

例
char_var:=nm_var;?
数字型{换成字符型
date_var:='25-DEC-88';?
字符型{换成日期型
insertinto表?num_col)values('604badnumber');?
错误Q无法成功地转换数据cd?

---------?
4条件控~
例
declare?
num_jobsnumber(4);?
begin?
selectcount(*)intonum_jobsfromauditions?
whereactorid=&&actor_idandcalled_back='yes';?
ifnum_jobs>100then?
updateactorsetactor_rating='wordclass'?
whereactorid=&&actor_id;?
elsifnum_job=75then?
updateactorsetactor_rating='daytimesoaps'?
whereactorid=&&actor_id;?
else?
updateactorsetactor_rating='waiter'?
whereactorid=&&actor_id;?
endif;?
endif;?
commit;?
end;?

--------?
5@环
语法?
loop?
......?
endloop;?
exit;Q退出@环)?
exit[when>;Q退出@环,当满WHENӞ?
??
declare?
ctrnumber(3):=0;?
begin?
loop?
insertintotable1values('tastesgreat');?
insertintotable2values('lessfilling');?
ctr:=ctr+1;?
exitwhenctr=100;?
endloop;?
end;?
Q注Q如果ctr取ؓNULLQ@环无法结束)?

??
FOR语法?
for变?lt;范围>loop?
......?
endloop;?

declare?
my_indexchar(20):='fettucinialfredo';?
bowlchar(20);?
begin?
formy_indexinreverse?1..30loop?
insertintotemp(coll)values(my_index);?
/*循环ơ数?0?1*/?
endloop;?
bowl:=my_index;?
end;?
跟在inreverse后面的数字必L从小到大的顺序,必须是整敎ͼ不能是变量或表达式

----------?
6游标
昑ּ游标?

打开游标?
open?lt;游标?gt;?
例
opencolor_cur;?

游标属性
%notfound?
%found?
%rowcount?
%isopen?
例
fetchmy_curintomy_var;?
whilemy_cur?foundloop?
(处理数据)?
fetchmy_curintomy_var;?
exitwhenmy_cur?rowcount=10;?
endloop;?

%notfound属性
取值情况如下:?
fetch操作没有q回记录Q则取gؓtrue?
fetch操作q回一条记录,则取gؓfalse?
Ҏ标无fetch操作Ӟ取gؓnull?
<游标?gt;?notfound?
例
ifcolor_cur?notfoundthen...?
注:如果没有fetch操作Q则<游标?gt;?notfound导致出错,?
因ؓ%notfound的初始gؓNULL。

关闭游标?
close?lt;游标?gt;?
例
closecolor_cur;?

游标的FOR循环?
语法?
for?lt;记录?gt;in?lt;游标?gt;loop?
<一l命?gt;?
endloop;?
其中Q
索引是徏立在每条记录的g上的?
记录名不必声明
每个值对应的是记录名Q列名
初始化游标指打开游标?
zd集合中的记录自动完成FETCH操作?
退出@环,关闭游标?

隐式游标?
隐式游标是指SQL命o中用到的Q没有明定义的游标?
insert,update,delete,select语句中不必明定义游标
调用格式?b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL%?
存贮有关最C?b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL命o的处理信息

隐式游标的属性
隐式游标有四个属性
SQL%NOTFOUND?
SQL%FOUND?
SQL%ROWCOUNTQ隐式游标包括的记录数
例:?
deletefrombaseball_teamwherebatting_avg<100;?
if?b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">sql%rowcount>5thn?
insertintotemp?
values('yourteamneedshelp');?
endif;?

SQL%ISOPENQ取值MؓFALSE?b style="COLOR: black; BACKGROUND-COLOR: #a0ffff">SQL命o执行完毕QPL/SQL立即关闭隐式游标。

---------?
7标号
GOTO语句?
用法Q
gotoyou_are_here;?
其中you_are_here是要跌{的语句标号
标号必须在同一l命令,或是同一块中使用?

正确的用
<>Q标P?
x:=x+1?
ifa>bthen?
b:=b+c;?
gotodinner;?
endif;?

错误的用
gotojail;?
ifa>bthen?
b:=b+c;?
<>Q标P?
x:=x+1;?
endif;?

标号Q解x义模p
标号可用于定义列值的变量?
<>?
declare?
deptnonumber:=20;?
begin?
updateempsetsal=sal*1.1?
wheredeptno=sample.deptno;?
commit;?
endsample;?
如果不用标号和标号限制符Q这条命令将修改每条记录。

----------?
8异常处理
预定义的异常情况?
MORACLE错误都将自动产生一个异怿息
一些异常情况已命名Q如Q
no_data_found当SELECT语句无返回记录时产生?
too_many_rows没有定义游标,而SELECT语句q回多条记录时生
whenevernotfound无对应的记录

用户定义的异常情况
q戯p取
在DECLARE部分定义Q
declare?
xnumber;?
something_isnt_rightexception;?
用户定义的异常情况遵循一般的作用范围规则?
条g满Ӟ获取异常情况Qraisesomething_isnt_right?
注意Q同样可以获取预定义的异常情况

exception_init语句?
允许?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE错误命名?

调用格式Q
pragmaexception_init(<表达?gt;,);?
例
declare?
deadlock_detectedexception;?
pragmaexception_init(deadlock_detected,-60);?

raise语句?
单独使用RAISE命oQ可再一ơ获取当前的异常情况Q就象异常情况被重复处理了一P。
在异常处理中Q此语句只能单独使用。

异常处理标识W
一l用于处理异常情늚语句Q
exception?
when?lt;表达?gt;or[表达?..>then?
<一l语?gt;?
...?
whenothersthen--最后一个处理
<一l语?gt;?
end;既结束PL/SQL块部分,也结束异常处理部分

--------?
l习与答案
1:?
接收contract_no和item_no|在inventory表中查找Q如果品:?
已发货,在arrival_date中赋gؓ今天后的7天
已订货,在arrival_date中赋gؓ今天后的一个月?
既无订货又无发货Q则在arrival_date中赋gؓ今天后的两个月,?
q在order表中增加一条新的订单记录。

product_status的列gؓ'shipped'?ordered'?

inventory:?
product_idnumber(6)?
product_descriptionchar(30)?
product_statuschar(20)?
std_shipping_qtynumber(3)?

contract_item:?
contract_nonumber(12)?
item_nonumber(6)?
arrival_datedate?

order:?
order_idnumber(6)?
product_idnumber(6)?
qtynumber(3)?

{案Q
declare?
i_product_idinventory.product_id%type;?
i_product_descriptioninventory.product_description%type;?
i_product_statusinventory.product_status%type;?
i_std_shipping_qtyinventory.std_shipping_qty%type;?

begin?
selectproduct_id,product_description,product_status,std_shipping_qty?
intoi_product_id,i_product_description,?
i_product_status,i_std_shipping_qty?
frominventory?
whereproduct_id=(?
selectproduct_id?
fromcontract_item?
wherecontract_no=&&contractnoanditem_no=&&itemno);?
ifi_product_status='shipped'then?
updatecontract_item?
setarrival_date=sysdate+7?
whereitem_no=&&itemnoandcontract_no=&&contractno;?
elsifi_product_status='ordered'then?
updatecontract_item?
setarrival_date=add_months(sysdate,1)?
whereitem_no=&&itemnoandcontract_no=&&contractno;?
else?
updatecontract_item?
setarrival_date=add_months(sysdate,2)?
whereitem_no=&&itemnoandcontract_no=&&contractno;?
insertintoorders?
values(100,i_product_id,i_std_shipping_qty);?
endif;?
endif;?
commit;?
end;?


2:?
1.扑և指定部门中的所有雇员
2.用带'&'的变量提C用戯入部门编号
3.把雇员姓名及工资存入prnttable表中Q基l构为:?
createtableprnttable?
(seqnumber(7),linechar(80));?
4.异常情况为,部门中奖金不为空值的雇员信息才能存入prnttable表中。

{案Q
declare?
cursoremp_curis?
selectename,sal,comm?
fromempwheredeptno=&dno;?
emp_recemp_cur%rowtype;?
null_commissionexception;?
begin?
openemp_cur;?
fetchemp_curintoemp_rec;?
while?emp_cur%found)loop?
ifemp_rec.commisnullthen?
begin?
closeemp_cur;?
raisenull_commission;?
end;?
endif;?
fetchemp_curintoemp_rec;?
endloop;?
closeemp_sur;?
exception?
whennull_commissionthen?
openemp_cur;?
fetchemp_curintoemp_rec;?
while?emp_cur%found)loop?
ifemp_rec.commisnotnullthen?
insertintotempvalues(emp_rec.sal,emp_rec.ename);?
endif;?
fetchemp_curintoemp_rec;?
endloop;?
closeemp_cur;?
commit;?
end;?

?
?
Java研究l织?版权所有2002-2002




 

作者:UB旉Q?003-08-14 21:06:59[修改][回复][删除]

ORACLE数据库对象与用户理

一?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE数据库的模式对象的管理与l护

本节的主要内Ҏ关于ORACLE数据库的模式对象的管理与l护Q这些模式对象包括:表空间、表、视图、烦引、序列、同义词、聚集和完整性约束。对于每一个模式对象,首先描述了它的定义,说明了它的功能,最后以ZSQL语言的实例说明如何对它们q行理于维护?

1.1表I间

׃表空间是包含q些模式对象的逻辑I间Q有必要先对它进行维护?

创徏表空间
SQL>CREATETABLESPACEjxzy

>DATAFILE?usr/oracle/dbs/jxzy.dbf?

>ONLINE;

修改表空间
SQL>ALTERTABLESPACEjxzyOFFLINENORMAL;

SQL>ALTERTABLESPACEjxzy

>RENAMEDATAFILE?usr/oracle/dbs/jxzy.dbf?

>TO?usr/oracle/dbs/jxzynew.dbf?

>ONLINE

SQL>CREATETABLESPACEjxzyONLINE

删除表空间
SQL>DROPTABLESPACEjxzy

>INCLUDINGCONTENTS

1.?表l护

表是数据库中数据存储的基本单位,一个表包含若干列,每列h列名、类型、长度等?

表的建立?
SQL>CREATETABLEjxzy.switch(

>OFFICE_NUMNUMBER(3,0)NOTNULL,

>SWITCH_CODENUMBER(8,0)NOTNULL,

>SWITCH_NAMEVARCHAR2(20)NOTNULL);

表的修改?
SQL>ALTERTABLEjxzy.switch

>ADD?DESCVARCHAR2(30));

表的删除?
SQL>DROPTABLEjxzy.switch

>CASCADECONSTRAINTS

//删除引用该表的其它表的完整性约?

1.?视囄?

视图是由一个或若干产生的数据集合,但视图不占存储空间。徏立视囑֏以保护数据安全(仅让用户查询修改可以看见的一些行列)、简化查询操作、保护数据的独立性?

视图的徏立
SQL>CREATEVIEWjxzy.pole_well_viewAS

>(SELECTpole_path_numASpath,

poleASdevice_numFROMpole

>UNION

>SELECTpipe_path_numASpath,

>wellASdevice_numFROMwell);

视图的替换
SQL>REPLACEVIEWjxzy.pole_well_viewAS

>(SELECTpole_path_numASpath,

poleASsupport_deviceFROMpole?
>UNION

>SELECTpipe_path_numASpath,

wellASsupport_deviceFROMwell);?
视图的删除
SQL>DROPVIEWjxzy.pole_well_view;

1.4序列维?

序列是由序列发生器生成的唯一的整数?

序列的徏立
SQL>CREATESEQUENCEjxzy.sequence_cable

>STARTWITH?

>INCREMENTBY?

>NO_MAXVALUE;

建立了一个序列,jxzy.sequence_cable.currvalq回当前|jxzy.sequence_cable.nextval返回当前值加1后的新?

序列的修Ԏ
SQL>ALTERSEQUENCEjxzy.sequence_cable

>STARTWITH??/L不能修改Q若修改Q应先删除,然后重新定义

>INCTEMENTBY?

>MAXVALUE?000;

序列的删除
SQL>DROPSEQUENCEjxzy.sequence_cable

1.?烦引维?

索引是与表相关的一U结构,它是Z提高数据的检索速度而徏立的。因此,Z提高表上的烦引速度Q可在表上徏立一个或多个索引Q一个烦引可建立在一个或几个列上?

Ҏ询型的表Q徏立多个烦引会大大提高查询速度Q对更新型的表,如果索引q多Q会增大开销?

索引分唯一索引和非唯一索引

索引的徏立
SQL>CREATEINDEXjxzy.idx_switch

>ONswitch(switch_name)

>TABLESPACEjxzy;

索引的修Ԏ
SQL>ALTERINDEXjxzy.idx_switch

>ONswitch(office_num,switch_name)

>TABLESPACEjxzy;

索引的删除
SQL>DROPINDEXjxzy.idx_switch;

1.?完整性约束管?

数据库数据的完整性指数据的正性和相容性。数据完整型查防止数据库中存在不W合语义的数据?

完整性约束是对表的列定义一l规则说明方法?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE提供如下的完整性约?

a.NOTNULL非I?

b.UNIQUE唯一关键?

c.PRIMATYKEY主键一个表只能有一个,非空

d.FOREIGAKEY外?

e.CHECK表的每一行对指定条g必须是true或未知(对于I|

例如Q?

某列定义非空U束?
SQL>ALTERTABLEoffice_organization

>MODIFY(descVARCHAR2(20)

>CONSTRAINTnn_descNOTNULL)

某列定义唯一关键字
SQL>ALTERTABLEoffice_organization

>MODIFY(office_nameVATCHAR2(20)

>CONSTRAINTuq_officenameUNIQUE)

定义主键U束Q主键要求非I
SQL>CREATETABLEswitch(switch_codeNUMBER(8)

>CONSTRAINTpk_switchcodePRIMARYKEY,)

使主键约束无效
SQL>ALTERTABLEswitchDISABLEPRIMARYKEY

定义外键?
SQL>CREATETABLEPOLE(pole_codeNUMBER(8),

>office_numnumber(3)

>CONSTRAINTfk_officenum

>REFERENCESoffice_organization(office_num)

>ONDELETECASCADE);

定义查
SQL>CREATETABLEoffice_organization(

>office_numNUMBER(3),

>CONSTRAINTcheck_officenum

>CHECK?office_numBETWEEN?0AND?9);

二?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE数据库用户与权限理

ORACLE是多用户pȝQ它允许许多用户׃npȝ资源。ؓ了保证数据库pȝ的安全,数据库管理系l配|了良好的安全机制?

2.??b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLE数据库安全策?

建立pȝU的安全保证?
pȝU特权是通过授予用户pȝU的权利来实玎ͼpȝU的权利Q系l特权)包括Q徏立表I间、徏立用戗修改用L权利、删除用L。系l特权可授予用户Q也可以随时回收?b style="COLOR: black; BACKGROUND-COLOR: #ffff66">ORACLEpȝҎ?0多种?

建立对象U的安全保证?
对象U特权通过授予用户Ҏ据库中特定的表、视图、序列等q行操作Q查询、增、删改)的权利来实现?

建立用户U的安全保证?
用户U安全保障通过用户口o和角色机Ӟ一l权利)来实现。引入角色机制的目的是简化对用户的授权与理。做法是把用h照其功能分组Qؓ每个用户建立角色Q然后把角色分配l用Ph同样角色的用h相同的特权?

2.2用L?

ORACLE用户理的内容主要包括用L建立、修改和删除

用户的徏立
SQL>CREATEUSERjxzy

>IDENTIFIEDBYjxzy_password

>DEFAULTTABLESPACEsystem

>QUATA?MONsystem;?/供用户用的最大空间限?

用户的修Ԏ
SQL>CREATEUSERjxzy

>IDENTIFIEDBYjxzy_pw

>QUATA?0MONsystem;

删除用户及其所建对象
SQL>DROPUSERjxzyCASCADE;?/同时删除其徏立的实体

2.3pȝҎ理与控?

ORACLE提供了80多种pȝҎQ其中每一个系l特权允许用h行一个或一cL据库操作?

授予pȝҎ?
SQL>GRANTCREATEUSER,ALTERUSER,DROPUSER

>TOjxzy_new

>WITHADMINOPTION;

回收pȝҎ?
SQL>REVOKECREATEUSER,ALTERUSER,DROPUSER

>FROMjxzy_new

//但没有联回收功?

昄已被授予的系l特权(某用LpȝU特权)?
SQL>SELECT*FROMsys.dba_sys_privs

2.4对象特权管理与控制

ORACLE对象Ҏ指用户在指定的表上进行特D操作的权利。这些特D操作包括增、删、改、查看、执行(存储q程Q、引用(其它表字D作为外键)、烦引等?

授予对象Ҏ?
SQL>GRANTSELECT,INSERT(office_num,office_name),

>UPDATE(desc)ONoffice_organization

>TOnew_adminidtrator

>WITHGRANTOPTION;

//U联授权

SQL>GRANTALLONoffice_organization

>TOnew_administrator

回收对象Ҏ?
SQL>REVOKEUPDATEONoffice_orgaization

>FROMnew_administrator

//有联回收功?

SQL>REVOKEALLONoffice_organization

>FROMnew_administrator

昄已被授予的全部对象特权
SQL>SELECT*FROMsys.dba_tab_privs

2.5角色的理

ORACLE的角色是命名的相关特权组Q包括系l特权与对象ҎQ,ORACLE用它来简化特权管理,可把它授予用h其它角色?

ORACLE数据库系l预先定义了CONNECT、RESOURCE、DBA、EXP_FULL_DATABASE、IMP_FULL_DATABASE五个角色。CONNECTh创徏表、视图、序列等ҎQRESOURCEh创徏q程、触发器、表、序列等Ҏ、DBAh全部pȝҎQEXP_FULL_DATABASE、IMP_FULL_DATABASEh卸出与装入数据库的特权?

通过查询sys.dba_sys_privs可以了解每种角色拥有的权利?

授予用户角色?
SQL>GRANTDBATOnew_administractor

>WITHGRANTOPTION;
最大?br />select greatest(jjkxd_sysj,slkxd_sysj,sp_lgfstl_sysj) from wx_ysjcsj where jh_id=6
最?br />select least(jjkxd_sysj,slkxd_sysj,sp_lgfstl_sysj) from wx_ysjcsj where jh_id=6


]]>
վ֩ģ壺 Ƭ߹ۿѹۿӰ| ձvѷƵ| ѵɫƵ| ŮƷƵѹۿ| 㽶AVվ߹ۿ| Ļ޾Ʒ| ձһѸ| ƵƷһ| ձ˳ɻҳ߹ۿƵ| ޹a777| ŷպavҰ| Ƭѹۿ| Ů18ëƬëƬ| ɫƷaһ| Ļ޳AƬ| 97ƵѹƵ| ˽ӰԺƵվ| ޾Ʒ| ëƬ߹ۿ | պƷƬҹѹ| ëƬַ߹ۿĻ | ģ߹ۿ| ؼëƬaaaaѹۿ | 1000ֹ߽ѹۿƵ| ޹㽶ˬAVƬþ| ˾þô߽ڹ | 1000žžëƬѿ| ұͨӰƬ߲| Ʒ޾Ʒۿ| aëƬƵ| Ѹվ| Ѷ| ڵƵ߹ۿ | ߹ۿƵ| ݺɫۺϳ| ƷAV鶹| ȫӰѹۿȫ| 78˾ƷӰ߲պƷӰһ | ڳ߿| þerƷѹۿ2| Ļ˿Ʒһ|