﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-海鸥航际-文章分类-Java数据库技术 </title><link>http://www.blogjava.net/sgsoft/category/9.html</link><description>JAVA站</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 19:13:31 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 19:13:31 GMT</pubDate><ttl>60</ttl><item><title>在Oracle中如何利用Rowid查找和删除表中的重复记录 </title><link>http://www.blogjava.net/sgsoft/articles/1510.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Fri, 25 Feb 2005 09:51:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/1510.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/1510.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/1510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/1510.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/1510.html</trackback:ping><description><![CDATA[<TABLE height="100%" cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=storypost1 vAlign=top noWrap>在Oracle中如何利用Rowid查找和删除表中的重复记录</TD>
<TD class=storypost1 align=right>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=storypost1 vAlign=center align=right></TD>
<TD class=storypost1 vAlign=center><IMG height=1 width=2></TD>
<TD class=storypost1 vAlign=center align=right><A href="http://www.cybercorlin.net/forum/createtopic.php?method=postreply&amp;forum=2&amp;id=218&amp;quoteid=218"></A></TD>
<TD class=storypost1 vAlign=center><IMG height=1 width=1></TD></TR>
<TR>
<TD class=storypost1 vAlign=bottom align=right colSpan=4></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD class=storypost1 colSpan=2>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD colSpan=2><IMG height=2 width=1></TD></TR>
<TR>
<TD class=topicoutline colSpan=2><IMG height=1 width=10></TD></TR>
<TR>
<TD colSpan=2><IMG height=2 width=1></TD></TR></TBODY></TABLE></TD></TR>
<TR height="100%">
<TD class=storypost1 vAlign=top align=left colSpan=2 height="100%">
<TABLE height="100%" cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=storypost1 vAlign=top><BR>平时工作中可能会遇到当试图对库表中的某一列或几列创建唯一索引时，系统提示 ORA-01452 ：不能创建唯一索引，发现重复记录。 <BR><BR>下面总结一下几种查找和删除重复记录的方法（以表CZ为例）：<BR>表CZ的结构如下：<BR>SQL&gt; desc cz<BR>Name Null? Type<BR>----------------------------------------- -------- ------------------<BR><BR>C1 NUMBER(10)<BR>C10 NUMBER(5)<BR>C20 VARCHAR2(3)<BR><BR>删除重复记录的方法原理： <BR>(1).在Oracle中，每一条记录都有一个rowid，rowid在整个数据库中是唯一的，rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。<BR><BR>(2).在重复的记录中，可能所有列的内容都相同，但rowid不会相同，所以只要确定出重复记录中那些具有最大rowid的就可以了，其余全部删除。<BR><BR>重复记录判断的标准是：<BR>C1,C10和C20这三列的值都相同才算是重复记录。<BR><BR>经查看表CZ总共有16条记录：<BR>SQL&gt;set pagesize 100<BR>SQL&gt;select * from cz;<BR><BR>C1 C10 C20<BR>---------- ---------- ---<BR>1 2 dsf<BR>1 2 dsf<BR>1 2 dsf<BR>1 2 dsf<BR>2 3 che<BR>1 2 dsf<BR>1 2 dsf<BR>1 2 dsf<BR>1 2 dsf<BR>2 3 che<BR>2 3 che<BR>2 3 che<BR>2 3 che<BR>3 4 dff<BR>3 4 dff<BR>3 4 dff<BR>4 5 err<BR>5 3 dar<BR>6 1 wee<BR>7 2 zxc<BR><BR>20 rows selected.<BR><BR>1.查找重复记录的几种方法：<BR>(1).SQL&gt;select * from cz group by c1,c10,c20 having count(*) &gt;1;<BR>C1 C10 C20<BR>---------- ---------- ---<BR>1 2 dsf<BR>2 3 che<BR>3 4 dff<BR><BR>(2).SQL&gt;select distinct * from cz;<BR><BR>C1 C10 C20<BR>---------- ---------- ---<BR>1 2 dsf<BR>2 3 che<BR>3 4 dff<BR><BR>(3).SQL&gt;select * from cz a where rowid=(select max(rowid) from cz where c1=a.c1 and c10=a.c10 and c20=a.c20);<BR>C1 C10 C20<BR>---------- ---------- ---<BR>1 2 dsf<BR>2 3 che<BR>3 4 dff<BR><BR>2.删除重复记录的几种方法：<BR>(1).适用于有大量重复记录的情况(在C1,C10和C20列上建有索引的时候，用以下语句效率会很高)：<BR>SQL&gt;delete cz where (c1,c10,c20) in (select c1,c10,c20 from cz group by c1,c10,c20 having count(*)&gt;1) and rowid not in<BR>(select min(rowid) from cz group by c1,c10,c20 having count(*)&gt;1);<BR><BR>SQL&gt;delete cz where rowid not in(select min(rowid) from cz group by c1,c10,c20);<BR><BR>(2).适用于有少量重复记录的情况(注意，对于有大量重复记录的情况，用以下语句效率会很低)：<BR>SQL&gt;delete from cz a where a.rowid!=(select max(rowid) from cz b where a.c1=b.c1 and a.c10=b.c10 and a.c20=b.c20);<BR><BR>SQL&gt;delete from cz a where a.rowid&lt;(select max(rowid) from cz b where a.c1=b.c1 and a.c10=b.c10 and a.c20=b.c20);<BR><BR>SQL&gt;delete from cz a where rowid &lt;(select max(rowid) from cz where c1=a.c1 and c10=a.c10 and c20=a.c20);<BR><BR>(3).适用于有少量重复记录的情况(临时表法)：<BR>SQL&gt;create table test as select distinct * from cz; (建一个临时表test用来存放重复的记录）<BR><BR>SQL&gt;truncate table cz; (清空cz表的数据，但保留cz表的结构）<BR><BR>SQL&gt;insert into cz select * from test; (再将临时表test里的内容反插回来）<BR><BR>(4).适用于有大量重复记录的情况(Exception into 子句法)：<BR>采用alter table 命令中的 Exception into 子句也可以确定出库表中重复的记录。这种方法稍微麻烦一些，为了使用“excepeion into ”子句，必须首先创建 EXCEPTIONS 表。创建该表的 SQL 脚本文件为 utlexcpt.sql 。对于win2000系统和 UNIX 系统， Oracle 存放该文件的位置稍有不同，在win2000系统下，该脚本文件存放在$ORACLE_HOMEOra90rdbmsadmin 目录下；而对于 UNIX 系统，该脚本文件存放在$ORACLE_HOME/rdbms/admin 目录下。<BR><BR>具体步骤如下：<BR>SQL&gt;@?/rdbms/admin/utlexcpt.sql<BR><BR>Table created.<BR><BR>SQL&gt;desc exceptions<BR>Name Null? Type<BR>----------------------------------------- -------- --------------<BR><BR>ROW_ID ROWID<BR>OWNER VARCHAR2(30)<BR>TABLE_NAME VARCHAR2(30)<BR>CONSTRAINT VARCHAR2(30)<BR><BR>SQL&gt;alter table cz add constraint cz_unique unique(c1,c10,c20) exceptions into exceptions; <BR>*<BR>ERROR at line 1:<BR>ORA-02299: cannot validate (TEST.CZ_UNIQUE) - duplicate keys found<BR><BR>SQL&gt;create table dups as select * from cz where rowid in (select row_id from exceptions); <BR><BR>Table created.<BR><BR>SQL&gt;select * from dups; <BR><BR>C1 C10 C20<BR>---------- ---------- ---<BR>1 2 dsf<BR>1 2 dsf<BR>1 2 dsf<BR>1 2 dsf<BR>2 3 che<BR>1 2 dsf<BR>1 2 dsf<BR>1 2 dsf<BR>1 2 dsf<BR>2 3 che<BR>2 3 che<BR>2 3 che<BR>2 3 che<BR>3 4 dff<BR>3 4 dff<BR>3 4 dff<BR><BR>16 rows selected.<BR><BR>SQL&gt;select row_id from exceptions;<BR><BR>ROW_ID<BR>------------------<BR>AAAHD/AAIAAAADSAAA<BR>AAAHD/AAIAAAADSAAB<BR>AAAHD/AAIAAAADSAAC<BR>AAAHD/AAIAAAADSAAF<BR>AAAHD/AAIAAAADSAAH<BR>AAAHD/AAIAAAADSAAI<BR>AAAHD/AAIAAAADSAAG<BR>AAAHD/AAIAAAADSAAD<BR>AAAHD/AAIAAAADSAAE<BR>AAAHD/AAIAAAADSAAJ<BR>AAAHD/AAIAAAADSAAK<BR>AAAHD/AAIAAAADSAAL<BR>AAAHD/AAIAAAADSAAM<BR>AAAHD/AAIAAAADSAAN<BR>AAAHD/AAIAAAADSAAO<BR>AAAHD/AAIAAAADSAAP<BR><BR>16 rows selected.<BR><BR>SQL&gt;delete from cz where rowid in ( select row_id from exceptions);<BR><BR>16 rows deleted.<BR><BR>SQL&gt;insert into cz select distinct * from dups;<BR><BR>3 rows created.<BR><BR>SQL&gt;select *from cz;<BR><BR>C1 C10 C20<BR>---------- ---------- ---<BR>1 2 dsf<BR>2 3 che<BR>3 4 dff<BR>4 5 err<BR>5 3 dar<BR>6 1 wee<BR>7 2 zxc<BR><BR>7 rows selected.<BR><BR>从结果里可以看到重复记录已经删除。</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/sgsoft/aggbug/1510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-25 17:51 <a href="http://www.blogjava.net/sgsoft/articles/1510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle新手最常碰到的6个错误及解决方案</title><link>http://www.blogjava.net/sgsoft/articles/1474.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Thu, 24 Feb 2005 03:01:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/1474.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/1474.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/1474.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/1474.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/1474.html</trackback:ping><description><![CDATA[<SPAN id=ArticleContent1_ArticleContent1_lblContent>没有人会否认ORACLE是全球最有影响的数据库产品之一；不过好的东西似乎总不是那么好用（初看起来如此），甚至有些无情－－总会给layman们一个个无情的错误号。下面是我个人的总结，条条有用，希望能给初学者一点启示。 
<P>
<SCRIPT id=ad_text_pcjob src="http://www.pconline.com.cn/script/ad_text_pcjob.js" defer></SCRIPT>
　　关于“好的东西似乎总不是那么好用（初看起来如此）”的一个笑话：在参加 IBM DB2 512、513培训前，在校园网上下载到了安装程序，不过任凭我们几个同学研究个半天，也不知哪个文件是安装文件，竟没有安装成功。最后，一致认为：看来这个培训真是太有必要了！事后，才知道－－我们下载的是4linux的！</P>
<P>&nbsp;[以8.1.6为例]：</P>
<P>1、ORA－12541：TNS：没有监听器</P>
<P>　　原因：没有启动监听器或者监听器损坏。如果是前者，使用命令net start OracleOraHome81TNSListener（名字可能有出入）即可；如果是后者，则使用“Net8 Configuration Assistant”工具向导之“监听程序配置”增加一个监听器即可（基本不用写任何信息，一路OK。在添加之前可能需要把所有的监听器先删除！）</P>
<P>2、ORA－12500：TNS：监听程序无法启动专用服务器进程<BR>　　或<BR>　 ORA－12560：TNS：协议适配器错误</P>
<P>　　原因：ORACLE的数据库服务没有启动。使用命令net start ORACLESERVICEORADB（ORADB为数据库名字）即可。如果仍没有解决，请继续向下看。</P>
<P>3、如果数据库服务启动失败，则很有可能是其注册表项值损坏，最好的做法是以下两步：</P>
<P>　　1）ORADIM -DELETE -SID oradb 删除数据库服务项<BR>　　2）ORADIM -NEW -SID oradb 新增数据库服务项<BR>　　注：这个过程中如果出错，就重启计算机！</P>
<P>4、ORA－12154：TNS：能解析服务名</P>
<P>　　原因：ORACLE的网络服务名没有正确配置。请使用“Net8 Configuration Assistant”工具向导之“本地网络服务名配置”配置TNS即可。如果仍没有解决，请继续向下看。</P>
<P>5、ORA－1034 ：TNS：ORACLE不可用</P>
<P>　　原因：ORACLE的数据库服务正确启动，但是数据库没有打开！</P>
<P>　　使用命令：</P>
<P>　　1）svrmgrl&nbsp; 启动服务管理器<BR>　　2）connect internal 以internal身份登陆<BR>　　3）startup&nbsp; 打开数据库</P>
<P>6、ORA－12560：TNS：协议适配器错误（顽固性的）</P>
<P>　　原因：未知。</P>
<P>　　解决：必杀技－－打开“Windows任务管理器”，杀死ORACLE.exe及ORADIM.exe进程，书写自己的ora_startup.bat，执行之！</P>
<P>PS：</P>
<P>1、我的ora_startup.bat：</P>
<P>net start OracleOraHome81TNSListener<BR>net start ORACLESERVICEORADB<BR>svrmgrl 一般情况下不用，不过有时少不了它的，具体步骤见第5步。</P>
<P>2、我的ora_shutdown.bat：</P>
<P>net stop OracleOraHome81TNSListener<BR>net stop ORACLESERVICEORADB</P>
<P>3、ORACLE相关服务名请参见“管理工具”之“服务”中以ORACLE开头的服务名。</P></SPAN><img src ="http://www.blogjava.net/sgsoft/aggbug/1474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-24 11:01 <a href="http://www.blogjava.net/sgsoft/articles/1474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> ORACLE SQL性能优化系列 (十三)     选择自 black_snail 的 Blog </title><link>http://www.blogjava.net/sgsoft/articles/1190.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Mon, 14 Feb 2005 16:45:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/1190.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/1190.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/1190.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/1190.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/1190.html</trackback:ping><description><![CDATA[<SPAN id=ArticleContent1_ArticleContent1_lblContent>&nbsp;
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>43.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用</SPAN><SPAN lang=EN-US>WHERE</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">替代</SPAN><SPAN lang=EN-US>ORDER BY<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US>ORDER BY </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句只在两种严格的条件下使用索引</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US>ORDER BY</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中所有的列必须包含在相同的索引中并保持在索引中的排列顺序</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US>ORDER BY</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中所有的列必须定义为非空</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US>WHERE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句使用的索引和</SPAN><SPAN lang=EN-US>ORDER BY</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句中所使用的索引不能并列</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表</SPAN><SPAN lang=EN-US>DEPT</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包含以下列</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><st1:Street><st1:address><SPAN lang=EN-US>DEPT_CODE<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>PK</SPAN></st1:address></st1:Street><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>NOT NULL</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>DEPT_DESC<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>NOT NULL</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>DEPT_TYPE<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>NULL</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3>&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">非唯一性的索引</SPAN><SPAN lang=EN-US>(DEPT_TYPE)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">低效</SPAN><SPAN lang=EN-US>: (</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">索引不被使用</SPAN><SPAN lang=EN-US>)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT DEPT_CODE</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM DEPT</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>ORDER BY DEPT_TYPE</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>EXPLAIN PLAN:</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SORT ORDER BY </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>TABLE ACCESS FULL</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">高效</SPAN><SPAN lang=EN-US>: (</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用索引</SPAN><SPAN lang=EN-US>)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT DEPT_CODE</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM DEPT</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE DEPT_TYPE &gt; 0 </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3>&nbsp;&nbsp; </FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 31.5pt; TEXT-ALIGN: left; mso-char-indent-count: 3.0" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>EXPLAIN PLAN:</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 31.5pt; TEXT-ALIGN: left; mso-char-indent-count: 3.0" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>TABLE ACCESS BY ROWID ON EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 31.5pt; TEXT-ALIGN: left; mso-char-indent-count: 3.0" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>INDEX RANGE SCAN ON DEPT_IDX</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">译者按</SPAN><SPAN lang=EN-US style="COLOR: red">:<o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>ORDER BY </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也能使用索引</SPAN><SPAN lang=EN-US style="COLOR: red">! </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这的确是个容易被忽视的知识点</SPAN><SPAN lang=EN-US style="COLOR: red">. </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们来验证一下</SPAN><SPAN lang=EN-US style="COLOR: red">:<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>SQL&gt;<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>select * from emp order by empno;<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>Execution Plan<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>----------------------------------------------------------<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>0<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT STATEMENT Optimizer=CHOOSE<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>1<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>0<SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>TABLE ACCESS (BY INDEX ROWID) OF 'EMP'<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>2<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>1<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>INDEX (FULL SCAN) OF 'EMPNO' (UNIQUE)<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>44.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">避免改变索引列的类型</SPAN><SPAN lang=EN-US>.<o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当比较不同数据类型的数据时</SPAN><SPAN lang=EN-US>, ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自动对列进行简单的类型转换</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">假设</SPAN><SPAN lang=EN-US> EMPNO</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是一个数值类型的索引列</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT …</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE EMPNO = ‘123’</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实际上</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">经过</SPAN><SPAN lang=EN-US>ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类型转换</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句转化为</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT …</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE EMPNO = TO_NUMBER(‘123’)</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">幸运的是</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类型转换没有发生在索引列上</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">索引的用途没有被改变</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">现在</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">假设</SPAN><SPAN lang=EN-US>EMP_TYPE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是一个字符类型的索引列</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT …</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE EMP_TYPE = 123</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个语句被</SPAN><SPAN lang=EN-US>ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">转换为</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT …</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE TO_NUMBER(EMP_TYPE)=123</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因为内部发生的类型转换</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个索引将不会被用到</SPAN><SPAN lang=EN-US>! </SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">译者按</SPAN><SPAN lang=EN-US style="COLOR: red">:<o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为了避免</SPAN><SPAN lang=EN-US style="COLOR: red">ORACLE</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对你的</SPAN><SPAN lang=EN-US style="COLOR: red">SQL</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行隐式的类型转换</SPAN><SPAN lang=EN-US style="COLOR: red">, </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最好把类型转换用显式表现出来</SPAN><SPAN lang=EN-US style="COLOR: red">. </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注意当字符和数值比较时</SPAN><SPAN lang=EN-US style="COLOR: red">, ORACLE</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会优先转换数值类型到字符类型</SPAN><SPAN lang=EN-US style="COLOR: red">.<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>45.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需要当心的</SPAN><SPAN lang=EN-US>WHERE</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">某些</SPAN><SPAN lang=EN-US>SELECT </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句中的</SPAN><SPAN lang=EN-US>WHERE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句不使用索引</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里有一些例子</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在下面的例子里</SPAN><SPAN lang=EN-US>, ‘!=’ </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将不使用索引</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">记住</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">索引只能告诉你什么存在于表中</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而不能告诉你什么不存在于表中</SPAN><SPAN lang=EN-US>. </SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><FONT size=3><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不使用索引</SPAN><SPAN lang=EN-US style="COLOR: red">:<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: red"><FONT size=3>SELECT ACCOUNT_NAME<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: red"><FONT size=3>FROM TRANSACTION<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: red"><FONT size=3>WHERE AMOUNT !=0;<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><FONT size=3><SPAN style="COLOR: green; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用索引</SPAN><SPAN lang=EN-US style="COLOR: green">:<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: green"><FONT size=3>SELECT ACCOUNT_NAME<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: green"><FONT size=3>FROM TRANSACTION<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: green"><FONT size=3>WHERE AMOUNT &gt;0;<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面的例子中</SPAN><SPAN lang=EN-US>, ‘||’</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是字符连接函数</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就象其他函数那样</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">停用了索引</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><FONT size=3><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不使用索引</SPAN><SPAN lang=EN-US style="COLOR: red">:<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: red"><FONT size=3>SELECT ACCOUNT_NAME,AMOUNT<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: red"><FONT size=3>FROM TRANSACTION<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: red"><FONT size=3>WHERE ACCOUNT_NAME||ACCOUNT_TYPE=’AMEXA’;<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><FONT size=3><SPAN style="COLOR: green; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用索引</SPAN><SPAN lang=EN-US style="COLOR: green">:<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: green"><FONT size=3>SELECT ACCOUNT_NAME,AMOUNT<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: green"><FONT size=3>FROM TRANSACTION<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: green"><FONT size=3>WHERE ACCOUNT_NAME = ‘AMEX’<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: green"><FONT size=3>AND<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>ACCOUNT_TYPE=’ A’;<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面的例子中</SPAN><SPAN lang=EN-US>, ‘+’</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是数学函数</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就象其他数学函数那样</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">停用了索引</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><FONT size=3><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不使用索引</SPAN><SPAN lang=EN-US style="COLOR: red">:<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: red"><FONT size=3>SELECT ACCOUNT_NAME, AMOUNT<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: red"><FONT size=3>FROM TRANSACTION<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: red"><FONT size=3>WHERE AMOUNT + 3000 &gt;5000;<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><FONT size=3><SPAN style="COLOR: green; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用索引</SPAN><SPAN lang=EN-US style="COLOR: green">:<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: green"><FONT size=3>SELECT ACCOUNT_NAME, AMOUNT<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: green"><FONT size=3>FROM TRANSACTION<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: green"><FONT size=3>WHERE AMOUNT &gt; 2000 ;<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面的例子中</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">相同的索引列不能互相比较</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这将会启用全表扫描</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><FONT size=3><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不使用索引</SPAN><SPAN lang=EN-US style="COLOR: red">:<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: red"><FONT size=3>SELECT ACCOUNT_NAME, AMOUNT<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: red"><FONT size=3>FROM TRANSACTION<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: red"><FONT size=3>WHERE ACCOUNT_NAME = NVL(:ACC_NAME,ACCOUNT_NAME);<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><FONT size=3><SPAN style="COLOR: green; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用索引</SPAN><SPAN lang=EN-US style="COLOR: green">:<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: green"><FONT size=3>SELECT ACCOUNT_NAME, AMOUNT<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: green"><FONT size=3>FROM TRANSACTION<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US style="COLOR: green"><FONT size=3>WHERE ACCOUNT_NAME LIKE NVL(:ACC_NAME,’%’);<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">译者按</SPAN><SPAN lang=EN-US style="COLOR: red">:<o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果一定要对使用函数的列启用索引</SPAN><SPAN lang=EN-US style="COLOR: red">, ORACLE</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">新的功能</SPAN><SPAN lang=EN-US style="COLOR: red">: </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基于函数的索引</SPAN><SPAN lang=EN-US style="COLOR: red">(Function-Based Index) </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也许是一个较好的方案</SPAN><SPAN lang=EN-US style="COLOR: red">.<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>CREATE INDEX EMP_I ON EMP (UPPER(ename)); /*</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">建立基于函数的索引</SPAN><SPAN lang=EN-US style="COLOR: red">*/<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>SELECT * FROM emp WHERE UPPER(ename) = ‘BLACKSNAIL’; /*</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将使用索引</SPAN><SPAN lang=EN-US style="COLOR: red">*/<o:p></o:p></SPAN></B></FONT></P></SPAN><BR>
<DIV style="FONT-SIZE: 14px; LINE-HEIGHT: 25px"><STRONG>作者Blog：</STRONG><A id=ArticleContent1_ArticleContent1_AuthorBlogLink href="http://blog.csdn.net/black_snail/" target=_blank><FONT color=#002c99>http://blog.csdn.net/black_snail/</FONT></A></DIV><img src ="http://www.blogjava.net/sgsoft/aggbug/1190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-15 00:45 <a href="http://www.blogjava.net/sgsoft/articles/1190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化系列 (十二)     选择自 black_snail 的 Blog </title><link>http://www.blogjava.net/sgsoft/articles/1189.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Mon, 14 Feb 2005 16:44:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/1189.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/1189.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/1189.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/1189.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/1189.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;39.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总是使用索引的第一个列如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. &nbsp;译者按:这也是一条简单而重要的规则. 见以下实例.&nbsp;SQL&gt; create table multii...&nbsp;&nbsp;<a href='http://www.blogjava.net/sgsoft/articles/1189.html'>阅读全文</a><img src ="http://www.blogjava.net/sgsoft/aggbug/1189.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-15 00:44 <a href="http://www.blogjava.net/sgsoft/articles/1189.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> ORACLE SQL性能优化系列 (十一)     选择自 black_snail 的 Blog </title><link>http://www.blogjava.net/sgsoft/articles/1188.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Mon, 14 Feb 2005 16:43:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/1188.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/1188.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/1188.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/1188.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/1188.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;36.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用UNION替换OR (适用于索引列)通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低. &nbsp;&nbsp; 在下面的例...&nbsp;&nbsp;<a href='http://www.blogjava.net/sgsoft/articles/1188.html'>阅读全文</a><img src ="http://www.blogjava.net/sgsoft/aggbug/1188.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-15 00:43 <a href="http://www.blogjava.net/sgsoft/articles/1188.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> ORACLE SQL性能优化系列 (十)     选择自 black_snail 的 Blog </title><link>http://www.blogjava.net/sgsoft/articles/1187.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Mon, 14 Feb 2005 16:42:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/1187.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/1187.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/1187.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/1187.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/1187.html</trackback:ping><description><![CDATA[<SPAN id=ArticleContent1_ArticleContent1_lblContent>&nbsp;
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><STRONG><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>31.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><SPAN><FONT face=宋体>强制</FONT>索引失效</SPAN><SPAN lang=EN-US><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></FONT></STRONG></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN><o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果两个或以上索引具有相同的等级</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你可以强制命令</SPAN><SPAN lang=EN-US>ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">优化器使用其中的一个</SPAN><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过它</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">检索出的记录数量少</SPAN><SPAN lang=EN-US>) .</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">举例</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3>&nbsp;&nbsp; </FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT ENAME</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE EMPNO = 7935<SPAN style="mso-spacerun: yes">&nbsp; </SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US>AND DEPTNO + 0 = 10<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red">/*DEPTNO</SPAN></B></SPAN><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上的索引将失效</SPAN><SPAN lang=EN-US style="COLOR: red">*/</SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US>AND EMP_TYPE || ‘’ = ‘A’ <B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red"><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>/*EMP_TYPE</SPAN></B></SPAN><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上的索引将失效</SPAN><SPAN lang=EN-US style="COLOR: red">*/</SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这是一种相当直接的提高查询效率的办法</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但是你必须谨慎考虑这种策略</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一般来说</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只有在你希望单独优化几个</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时才能采用它</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里有一个例子关于何时采用这种策略</SPAN><SPAN lang=EN-US>, </SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">假设在</SPAN><SPAN lang=EN-US>EMP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表的</SPAN><SPAN lang=EN-US>EMP_TYPE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">列上有一个非唯一性的索引而</SPAN><SPAN lang=EN-US>EMP_CLASS</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上没有索引</SPAN><SPAN lang=EN-US>. </SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT ENAME</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE EMP_TYPE = ‘A’ </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>AND EMP_CLASS = ‘X’;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">优化器会注意到</SPAN><SPAN lang=EN-US>EMP_TYPE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上的索引并使用它</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这是目前唯一的选择</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一段时间以后</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">另一个非唯一性建立在</SPAN><SPAN lang=EN-US>EMP_CLASS</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">优化器必须对两个索引进行选择</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在通常情况下</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">优化器将使用两个索引并在他们的结果集合上执行排序及合并</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">然而</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果其中一个索引（</SPAN><SPAN lang=EN-US>EMP_TYPE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）接近于唯一性而另一个索引（</SPAN><SPAN lang=EN-US>EMP_CLASS</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）上有几千个重复的值</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">排序及合并就会成为一种不必要的负担</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在这种情况下</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你希望使优化器屏蔽掉</SPAN><SPAN lang=EN-US>EMP_CLASS</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">索引</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用下面的方案就可以解决问题</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT ENAME</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE EMP_TYPE = ‘A’ </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>AND EMP_CLASS<B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red">||’’</SPAN></B> = ‘X’;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>32.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">避免在索引列上使用计算．</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US>WHERE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句中，如果索引列是函数的一部分．优化器将不使用索引而使用全表扫描．</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">举例</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=3>低效：</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT …</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM DEPT</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE SAL * 12 &gt; 25000;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">高效</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT …</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM DEPT</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE SAL<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>&gt; 25000/12;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">译者按</SPAN><SPAN lang=EN-US style="COLOR: red">:<o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这是一个非常实用的规则，请务必牢记</SPAN><SPAN lang=EN-US style="COLOR: red"><o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>33.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自动选择索引</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=3>如果表中有两个以上（包括两个）索引，其中有一个唯一性索引，而其他是非唯一性．</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在这种情况下，</SPAN><SPAN lang=EN-US>ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将使用唯一性索引而完全忽略非唯一性索引．</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">举例</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT ENAME</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE EMPNO = 2326<SPAN style="mso-spacerun: yes">&nbsp; </SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0" align=left><SPAN lang=EN-US><FONT size=3>AND DEPTNO<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>= 20 ;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里，只有</SPAN><SPAN lang=EN-US>EMPNO</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上的索引是唯一性的，所以</SPAN><SPAN lang=EN-US>EMPNO</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">索引将用来检索记录．</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0" align=left><SPAN lang=EN-US><FONT size=3>TABLE ACCESS BY ROWID ON EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>INDEX UNIQUE SCAN ON EMP_NO_IDX</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0" align=left><SPAN lang=EN-US><FONT size=3></FONT></SPAN>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>34.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">避免在索引列上使用</SPAN><SPAN lang=EN-US>NOT<o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通常，　我们要避免在索引列上使用</SPAN><SPAN lang=EN-US>NOT, NOT</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会产生在和在索引列上使用函数相同的</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">影响</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当</SPAN><SPAN lang=EN-US>ORACLE”</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">遇到</SPAN><SPAN lang=EN-US>”NOT,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">他就会停止使用索引转而执行全表扫描</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">举例</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">低效</SPAN><SPAN lang=EN-US>: (</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不使用索引</SPAN><SPAN lang=EN-US>)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>SELECT …</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>FROM DEPT</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>WHERE DEPT_CODE NOT = 0;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3>&nbsp;&nbsp; </FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">高效</SPAN><SPAN lang=EN-US>: (</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用了索引</SPAN><SPAN lang=EN-US>)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; TEXT-ALIGN: left; mso-char-indent-count: .5" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>SELECT …</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>FROM DEPT</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>WHERE DEPT_CODE &gt; 0;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需要注意的是</SPAN><SPAN lang=EN-US>,</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在某些时候</SPAN><SPAN lang=EN-US>, ORACLE</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">优化器会自动将</SPAN><SPAN lang=EN-US>NOT</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">转化成相对应的关系操作符</SPAN></B><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>NOT &gt;<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>to<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>&lt;=</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>NOT &gt;=<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>to<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>&lt;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>NOT &lt;<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>to<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>&gt;=</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>NOT &lt;=<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>to<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>&gt;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3></FONT></SPAN></SPAN>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">译者按</SPAN><SPAN lang=EN-US style="COLOR: red">:<o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在这个例子中</SPAN><SPAN lang=EN-US style="COLOR: red">,</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作者犯了一些错误</SPAN><SPAN lang=EN-US style="COLOR: red">. </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例子中的低效率</SPAN><SPAN lang=EN-US style="COLOR: red">SQL</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是不能被执行的</SPAN><SPAN lang=EN-US style="COLOR: red">.<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我做了一些测试</SPAN><SPAN lang=EN-US style="COLOR: red">:<o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>SQL&gt; select * from emp where NOT empno &gt; 1;<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>no rows selected<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>Execution Plan<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>----------------------------------------------------------<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>0<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT STATEMENT Optimizer=CHOOSE<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>1<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>0<SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>TABLE ACCESS (BY INDEX ROWID) OF 'EMP'<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>2<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>1<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>INDEX (RANGE SCAN) OF 'EMPNO' (UNIQUE)<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>SQL&gt; select * from emp where empno &lt;= 1;<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>no rows selected<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>Execution Plan<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>----------------------------------------------------------<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>0<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT STATEMENT Optimizer=CHOOSE<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>1<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>0<SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>TABLE ACCESS (BY INDEX ROWID) OF 'EMP'<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>2<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>1 <SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN>INDEX (RANGE SCAN) OF 'EMPNO' (UNIQUE)<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;</SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">两者的效率完全一样，也许这符合作者关于</SPAN><SPAN lang=EN-US style="COLOR: red">” </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在某些时候</SPAN><SPAN lang=EN-US style="COLOR: red">, ORACLE</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">优化器会自动将</SPAN><SPAN lang=EN-US style="COLOR: red">NOT</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">转化成相对应的关系操作符</SPAN><SPAN lang=EN-US style="COLOR: red">” </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的观点．</SPAN><SPAN lang=EN-US style="COLOR: red"><o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>35.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用</SPAN><SPAN lang=EN-US>&gt;=</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">替代</SPAN><SPAN lang=EN-US>&gt;<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果</SPAN><SPAN lang=EN-US>DEPTNO</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上有一个索引</SPAN><SPAN lang=EN-US>, </SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">高效</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>SELECT *</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>FROM EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>WHERE DEPTNO &gt;=4</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3>&nbsp;&nbsp; </FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">低效</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>SELECT *</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>FROM EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>WHERE DEPTNO &gt;3</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">两者的区别在于</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">前者</SPAN><SPAN lang=EN-US>DBMS</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将直接跳到第一个</SPAN><SPAN lang=EN-US>DEPT</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等于</SPAN><SPAN lang=EN-US>4</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的记录而后者将首先定位到</SPAN><SPAN lang=EN-US>DEPTNO=3</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的记录并且向前扫描到第一个</SPAN><SPAN lang=EN-US>DEPT</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">大于</SPAN><SPAN lang=EN-US>3</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的记录</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P></SPAN><BR>
<DIV style="FONT-SIZE: 14px; LINE-HEIGHT: 25px"><STRONG>作者Blog：</STRONG><A id=ArticleContent1_ArticleContent1_AuthorBlogLink href="http://blog.csdn.net/black_snail/" target=_blank><FONT color=#002c99>http://blog.csdn.net/black_snail/</FONT></A></DIV><img src ="http://www.blogjava.net/sgsoft/aggbug/1187.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-15 00:42 <a href="http://www.blogjava.net/sgsoft/articles/1187.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化系列 (八)     选择自 black_snail 的 Blog </title><link>http://www.blogjava.net/sgsoft/articles/1185.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Mon, 14 Feb 2005 16:41:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/1185.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/1185.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/1185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/1185.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/1185.html</trackback:ping><description><![CDATA[<SPAN id=ArticleContent1_ArticleContent1_lblContent>&nbsp;
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>25.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用索引提高效率</SPAN><SPAN lang=EN-US><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 15.75pt; TEXT-ALIGN: left; mso-char-indent-count: 1.5" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">索引是表的一个概念部分</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用来提高检索数据的效率</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实际上</SPAN><SPAN lang=EN-US>,ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用了一个复杂的自平衡</SPAN><SPAN lang=EN-US>B-tree</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结构</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通常</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过索引查询数据比全表扫描要快</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当</SPAN><SPAN lang=EN-US>ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">找出执行查询和</SPAN><SPAN lang=EN-US>Update</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句的最佳路径时</SPAN><SPAN lang=EN-US>, ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">优化器将使用索引</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">同样在联结多个表时使用索引也可以提高效率</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">另一个使用索引的好处是</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">它提供了主键</SPAN><SPAN lang=EN-US>(primary key)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的唯一性验证</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 15.75pt; TEXT-ALIGN: left; mso-char-indent-count: 1.5" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">除了那些</SPAN><SPAN lang=EN-US>LONG</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</SPAN><SPAN lang=EN-US>LONG RAW</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据类型</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你可以索引几乎所有的列</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通常</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在大型表中使用索引特别有效</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当然</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你也会发现</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在扫描小表时</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用索引同样能提高效率</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 15.75pt; TEXT-ALIGN: left; mso-char-indent-count: 1.5" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">虽然使用索引能得到查询效率的提高</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但是我们也必须注意到它的代价</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">索引需要空间来</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">存储</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也需要定期维护</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">每当有记录在表中增减或索引列被修改时</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">索引本身也会被修改</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这意味着每条记录的</SPAN><SPAN lang=EN-US>INSERT , DELETE , UPDATE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将为此多付出</SPAN><SPAN lang=EN-US>4 , 5 </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次的磁盘</SPAN><SPAN lang=EN-US>I/O . </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因为索引需要额外的存储空间和处理</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">那些不必要的索引反而会使查询反应时间变慢</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">译者按</SPAN><SPAN lang=EN-US style="COLOR: red">: <o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">定期的重构索引是有必要的</SPAN><SPAN lang=EN-US style="COLOR: red">. <o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>ALTER INDEX &lt;INDEXNAME&gt; REBUILD &lt;TABLESPACENAME&gt;<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>26.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">索引的操作</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US>ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对索引有两种访问模式</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">索引唯一扫描</SPAN><SPAN lang=EN-US> ( INDEX UNIQUE SCAN)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">大多数情况下</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">优化器通过</SPAN><SPAN lang=EN-US>WHERE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句访问</SPAN><SPAN lang=EN-US>INDEX.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表</SPAN><SPAN lang=EN-US>LODGING</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有两个索引</SPAN><SPAN lang=EN-US> : </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">建立在</SPAN><SPAN lang=EN-US>LODGING</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">列上的唯一性索引</SPAN><SPAN lang=EN-US>LODGING_PK</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和建立在</SPAN><SPAN lang=EN-US>MANAGER</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">列上的非唯一性索引</SPAN><SPAN lang=EN-US>LODGING$MANAGER. </SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT * </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM LODGING</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE LODGING = ‘ROSE HILL’;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在内部</SPAN><SPAN lang=EN-US> , </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上述</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将被分成两步执行</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先</SPAN><SPAN lang=EN-US> , LODGING_PK </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">索引将通过索引唯一扫描的方式被访问</SPAN><SPAN lang=EN-US> , </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">获得相对应的</SPAN><SPAN lang=EN-US>ROWID, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过</SPAN><SPAN lang=EN-US>ROWID</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">访问表的方式</SPAN> <SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">执行下一步检索</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果被检索返回的列包括在</SPAN><SPAN lang=EN-US>INDEX</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">列中</SPAN><SPAN lang=EN-US>,ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将不执行第二步的处理</SPAN><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过</SPAN><SPAN lang=EN-US>ROWID</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">访问表</SPAN><SPAN lang=EN-US>). </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因为检索数据保存在索引中</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">单单访问索引就可以完全满足查询结果</SPAN><SPAN lang=EN-US>. </SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只需要</SPAN><SPAN lang=EN-US>INDEX UNIQUE SCAN </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT LODGING</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>LODGING<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE LODGING = ‘ROSE HILL’;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">索引范围查询</SPAN><SPAN lang=EN-US>(INDEX RANGE SCAN)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">适用于两种情况</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 50.25pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l1 level1 lfo2; tab-stops: list 50.25pt" align=left><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>1.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=3>基于一个范围的检索</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 50.25pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l1 level1 lfo2; tab-stops: list 50.25pt" align=left><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>2.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=3>基于非唯一性索引的检索</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;</SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例</SPAN><SPAN lang=EN-US>1:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT LODGING</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>LODGING<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 31.5pt; TEXT-ALIGN: left; mso-char-indent-count: 3.0" align=left><SPAN lang=EN-US><FONT size=3>WHERE LODGING LIKE ‘M%’;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 11.25pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US>WHERE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句条件包括一系列值</SPAN><SPAN lang=EN-US>, ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将通过索引范围查询的方式查询</SPAN><SPAN lang=EN-US>LODGING_PK . </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">由于索引范围查询将返回一组值</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">它的效率就要比索引唯一扫描</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">低一些</SPAN><SPAN lang=EN-US>. </SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例</SPAN><SPAN lang=EN-US>2:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT LODGING</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>LODGING<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 31.5pt; TEXT-ALIGN: left; mso-char-indent-count: 3.0" align=left><SPAN lang=EN-US><FONT size=3>WHERE MANAGER = ‘BILL GATES’;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 31.5pt; TEXT-ALIGN: left; mso-char-indent-count: 3.0" align=left><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3></FONT></SPAN></SPAN>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的执行分两步</SPAN><SPAN lang=EN-US>, LODGING$MANAGER</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的索引范围查询</SPAN><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">得到所有符合条件记录的</SPAN><SPAN lang=EN-US>ROWID) </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和下一步同过</SPAN><SPAN lang=EN-US>ROWID</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">访问表得到</SPAN><SPAN lang=EN-US>LODGING</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">列的值</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">由于</SPAN><SPAN lang=EN-US>LODGING$MANAGER</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是一个非唯一性的索引</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据库不能对它执行索引唯一扫描</SPAN><SPAN lang=EN-US>. </SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">由于</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回</SPAN><SPAN lang=EN-US>LODGING</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">列</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而它并不存在于</SPAN><SPAN lang=EN-US>LODGING$MANAGER</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">索引中</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所以在索引范围查询后会执行一个通过</SPAN><SPAN lang=EN-US>ROWID</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">访问表的操作</SPAN><SPAN lang=EN-US>. </SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>WHERE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句中</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果索引列所对应的值的第一个字符由通配符</SPAN><SPAN lang=EN-US>(WILDCARD)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开始</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">索引将不被采用</SPAN><SPAN lang=EN-US>.<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>SELECT LODGING</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>LODGING<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 31.5pt; TEXT-ALIGN: left; mso-char-indent-count: 3.0" align=left><FONT size=3><SPAN lang=EN-US>WHERE MANAGER LIKE <SPAN style="COLOR: red">‘</SPAN></SPAN><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">％</SPAN><SPAN lang=EN-US style="COLOR: red">HANMAN’;<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;</SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在这种情况下，</SPAN><SPAN lang=EN-US>ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将使用全表扫描</SPAN><SPAN lang=EN-US>.<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp; </SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes"></SPAN><o:p>(待续)</o:p></FONT></SPAN></P></SPAN><img src ="http://www.blogjava.net/sgsoft/aggbug/1185.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-15 00:41 <a href="http://www.blogjava.net/sgsoft/articles/1185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化系列 (九)     选择自 black_snail 的 Blog </title><link>http://www.blogjava.net/sgsoft/articles/1186.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Mon, 14 Feb 2005 16:41:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/1186.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/1186.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/1186.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/1186.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/1186.html</trackback:ping><description><![CDATA[<SPAN id=ArticleContent1_ArticleContent1_lblContent>&nbsp;
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>27.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基础表的选择</SPAN><SPAN lang=EN-US><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基础表</SPAN><SPAN lang=EN-US>(Driving Table)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是指被最先访问的表</SPAN><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通常以全表扫描的方式被访问</SPAN><SPAN lang=EN-US>). </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">根据优化器的不同</SPAN><SPAN lang=EN-US>, SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句中基础表的选择是不一样的</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果你使用的是</SPAN><SPAN lang=EN-US>CBO (COST BASED OPTIMIZER),</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">优化器会检查</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句中的每个表的物理大小</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">索引的状态</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">然后选用花费最低的执行路径</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果你用</SPAN><SPAN lang=EN-US>RBO (RULE BASED OPTIMIZER) , </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">并且所有的连接条件都有索引对应</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在这种情况下</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基础表就是</SPAN><SPAN lang=EN-US>FROM </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句中列在最后的那个表</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">举例</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT A.NAME , B.MANAGER</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">　</SPAN><SPAN lang=EN-US>WORKER A, </SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>LODGING B</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">　</SPAN><SPAN lang=EN-US>A.LODGING = B.LODING;</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">由于</SPAN><SPAN lang=EN-US>LODGING</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表的</SPAN><SPAN lang=EN-US>LODING</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">列上有一个索引</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而且</SPAN><SPAN lang=EN-US>WORKER</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表中没有相比较的索引</SPAN><SPAN lang=EN-US>, WORKER</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表将被作为查询中的基础表</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>28.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">多个平等的索引</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句的执行路径可以使用分布在多个表上的多个索引时</SPAN><SPAN lang=EN-US>, ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会同时使用多个索引并在运行时对它们的记录进行合并</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">检索出仅对全部索引有效的记录</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN><SPAN lang=EN-US>ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">选择执行路径时</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">唯一性索引的等级高于非唯一性索引</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">然而这个规则只有</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当</SPAN><SPAN lang=EN-US>WHERE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句中索引列和常量比较才有效</SPAN><SPAN lang=EN-US>.</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果索引列和其他表的索引类相比较</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这种子句在优化器中的等级是非常低的</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果不同表中两个想同等级的索引将被引用</SPAN><SPAN lang=EN-US>, FROM</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句中表的顺序将决定哪个会被率先使用</SPAN><SPAN lang=EN-US>. FROM</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句中最后的表的索引将有最高的优先级</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果相同表中两个想同等级的索引将被引用</SPAN><SPAN lang=EN-US>, WHERE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句中最先被引用的索引将有最高的优先级</SPAN><SPAN lang=EN-US>.<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">举例</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>DEPTNO</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上有一个非唯一性索引</SPAN><SPAN lang=EN-US>,EMP_CAT</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也有一个非唯一性索引</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT ENAME,</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE DEPT_NO = 20</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>AND EMP_CAT = ‘A’;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里</SPAN><SPAN lang=EN-US>,DEPTNO</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">索引将被最先检索</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">然后同</SPAN><SPAN lang=EN-US>EMP_CAT</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">索引检索出的记录进行合并</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">执行路径如下</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>TABLE ACCESS BY ROWID ON EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>AND-EQUAL</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>INDEX RANGE SCAN ON DEPT_IDX</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>INDEX RANGE SCAN ON CAT_IDX</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>29.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;</SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等式比较和范围比较</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当</SPAN><SPAN lang=EN-US>WHERE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句中有索引列</SPAN><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US>, </SPAN></B><SPAN lang=EN-US>ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不能合并它们</SPAN><SPAN lang=EN-US>,ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将用范围比较</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">举例</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>DEPTNO</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上有一个非唯一性索引</SPAN><SPAN lang=EN-US>,EMP_CAT</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也有一个非唯一性索引</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT ENAME</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE DEPTNO &gt; 20</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>AND EMP_CAT = ‘A’;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3>&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里只有</SPAN><SPAN lang=EN-US>EMP_CAT</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">索引被用到</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">然后所有的记录将逐条与</SPAN><SPAN lang=EN-US>DEPTNO</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">条件进行比较</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">执行路径如下</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>TABLE ACCESS BY ROWID ON EMP </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN>INDEX RANGE SCAN ON CAT_IDX</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>30.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不明确的索引等级</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当</SPAN><SPAN lang=EN-US>ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">无法判断索引的等级高低差别</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">优化器将只使用一个索引</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">它就是在</SPAN><SPAN lang=EN-US>WHERE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句中被列在最前面的</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">举例</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>DEPTNO</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上有一个非唯一性索引</SPAN><SPAN lang=EN-US>,EMP_CAT</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也有一个非唯一性索引</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT ENAME</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE DEPTNO &gt; 20</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>AND EMP_CAT &gt; ‘A’;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里</SPAN><SPAN lang=EN-US>, ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只用到了</SPAN><SPAN lang=EN-US>DEPT_NO</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">索引</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">执行路径如下</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>TABLE ACCESS BY ROWID ON EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>INDEX RANGE SCAN ON DEPT_IDX</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">译者按</SPAN><SPAN lang=EN-US style="COLOR: red">:<o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们来试一下以下这种情况</SPAN><SPAN lang=EN-US style="COLOR: red">:<o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>SQL&gt; select index_name, uniqueness from user_indexes where table_name = 'EMP';<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>INDEX_NAME<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>UNIQUENES<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>------------------------------ ---------<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>EMPNO<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>UNIQUE<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>EMPTYPE<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>NONUNIQUE<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>SQL&gt; select * from emp where empno &gt;= 2 and emp_type = 'A' ;<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>no rows selected<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>Execution Plan<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>----------------------------------------------------------<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>0<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT STATEMENT Optimizer=CHOOSE<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>1<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>0<SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>TABLE ACCESS (BY INDEX ROWID) OF 'EMP'<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>2<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>1<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>INDEX (RANGE SCAN) OF 'EMPTYPE' (NON-UNIQUE)<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3></FONT></SPAN></SPAN>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">虽然</SPAN><SPAN lang=EN-US style="COLOR: red">EMPNO</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是唯一性索引</SPAN><SPAN lang=EN-US style="COLOR: red">,</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但是由于它所做的是范围比较</SPAN><SPAN lang=EN-US style="COLOR: red">, </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等级要比非唯一性索引的等式比较低</SPAN><SPAN lang=EN-US style="COLOR: red">!<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P>&nbsp;</P></SPAN><BR>
<DIV style="FONT-SIZE: 14px; LINE-HEIGHT: 25px"><STRONG>作者Blog：</STRONG><A id=ArticleContent1_ArticleContent1_AuthorBlogLink href="http://blog.csdn.net/black_snail/" target=_blank><FONT color=#002c99>http://blog.csdn.net/black_snail/</FONT></A></DIV><img src ="http://www.blogjava.net/sgsoft/aggbug/1186.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-15 00:41 <a href="http://www.blogjava.net/sgsoft/articles/1186.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化系列 (七)     选择自 black_snail 的 Blog </title><link>http://www.blogjava.net/sgsoft/articles/1184.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Mon, 14 Feb 2005 16:40:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/1184.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/1184.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/1184.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/1184.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/1184.html</trackback:ping><description><![CDATA[<SPAN id=ArticleContent1_ArticleContent1_lblContent>&nbsp;
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>24.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用</SPAN><SPAN lang=EN-US>EXPLAIN PLAN </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">分析</SPAN><SPAN lang=EN-US>SQL</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句</SPAN><SPAN lang=EN-US><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 15.75pt; TEXT-ALIGN: left; mso-char-indent-count: 1.5" align=left><FONT size=3><SPAN lang=EN-US>EXPLAIN PLAN </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是一个很好的分析</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句的工具</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">它甚至可以在不执行</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的情况下分析语句</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过分析</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们就可以知道</SPAN><SPAN lang=EN-US>ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是怎么样连接表</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用什么方式扫描表</SPAN><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">索引扫描或全表扫描</SPAN><SPAN lang=EN-US>)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以及使用到的索引名称</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 15.75pt; TEXT-ALIGN: left; mso-char-indent-count: 1.5" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你需要按照从里到外</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从上到下的次序解读分析的结果</SPAN><SPAN lang=EN-US>. EXPLAIN PLAN</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">分析的结果是用缩进的格式排列的</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最内部的操作将被最先解读</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果两个操作处于同一层中</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">带有最小操作号的将被首先执行</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 15.75pt; TEXT-ALIGN: left; mso-char-indent-count: 1.5" align=left><FONT size=3><SPAN lang=EN-US>NESTED LOOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是少数不按照上述规则处理的操作</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">正确的执行路径是检查对</SPAN><SPAN lang=EN-US>NESTED LOOP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供数据的操作</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其中操作号最小的将被最先处理</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 15.75pt; TEXT-ALIGN: left; mso-char-indent-count: 1.5" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">译者按</SPAN><SPAN lang=EN-US style="COLOR: red">: <o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过实践</SPAN><SPAN lang=EN-US style="COLOR: red">, </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">感到还是用</SPAN><SPAN lang=EN-US style="COLOR: red">SQLPLUS</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</SPAN><SPAN lang=EN-US style="COLOR: red">SET TRACE </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">功能比较方便</SPAN><SPAN lang=EN-US style="COLOR: red">.<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">举例</SPAN><SPAN lang=EN-US style="COLOR: red">:<o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>SQL&gt; list<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>1<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>SELECT *<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>2<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>FROM dept, emp</FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red">&nbsp; </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red">3* WHERE emp.deptno = dept.deptno<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red">SQL&gt; set autotrace traceonly /*traceonly </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以不显示执行结果</SPAN><SPAN lang=EN-US style="COLOR: red">*/<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>SQL&gt; /<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>14 rows selected.<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>Execution Plan<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>----------------------------------------------------------<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>0<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT STATEMENT Optimizer=CHOOSE<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>1<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>0<SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>NESTED LOOPS<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>2<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>1<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>TABLE ACCESS (FULL) OF 'EMP' <o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>3<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>1<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>4<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>3<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>Statistics<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>----------------------------------------------------------<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>0<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>recursive calls<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>2<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>db block gets<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>30<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>consistent gets<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>0<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>physical reads<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>0<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>redo size<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>2598<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>bytes sent via SQL*Net to client<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>503<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>bytes received via SQL*Net from client<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>2<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>SQL*Net roundtrips to/from client<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>0<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>sorts (memory)<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>0<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>sorts (disk)<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>14<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>rows processed<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过以上分析</SPAN><SPAN lang=EN-US style="COLOR: red">,</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以得出实际的执行步骤是</SPAN><SPAN lang=EN-US style="COLOR: red">:<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 55.3pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l1 level2 lfo2; tab-stops: list 55.3pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>1.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>TABLE ACCESS (FULL) OF 'EMP' <o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 55.3pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l1 level2 lfo2; tab-stops: list 55.3pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>2.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 55.3pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l1 level2 lfo2; tab-stops: list 55.3pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>3.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 55.3pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l1 level2 lfo2; tab-stops: list 55.3pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>4.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><FONT size=3>NESTED LOOPS (JOINING 1 AND 3)<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注</SPAN><SPAN lang=EN-US style="COLOR: red">: </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目前许多第三方的工具如</SPAN><SPAN lang=EN-US style="COLOR: red">TOAD</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US style="COLOR: red">ORACLE</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本身提供的工具如</SPAN><SPAN lang=EN-US style="COLOR: red">OMS</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US style="COLOR: red">SQL Analyze</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都提供了极其方便的</SPAN><SPAN lang=EN-US style="COLOR: red">EXPLAIN PLAN</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工具</SPAN><SPAN lang=EN-US style="COLOR: red">.</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也许喜欢图形化界面的朋友们可以选用它们</SPAN><SPAN lang=EN-US style="COLOR: red">.<o:p></o:p></SPAN></B></FONT></P></SPAN><img src ="http://www.blogjava.net/sgsoft/aggbug/1184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-15 00:40 <a href="http://www.blogjava.net/sgsoft/articles/1184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化系列 (六)     选择自 black_snail 的 Blog </title><link>http://www.blogjava.net/sgsoft/articles/1183.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Mon, 14 Feb 2005 16:37:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/1183.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/1183.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/1183.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/1183.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/1183.html</trackback:ping><description><![CDATA[<P><SPAN id=ArticleContent1_ArticleContent1_lblContent> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>20.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用表连接替换</SPAN><SPAN lang=EN-US>EXISTS<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通常来说</SPAN><SPAN lang=EN-US> , </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">采用表连接的方式比</SPAN><SPAN lang=EN-US>EXISTS</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">更有效率</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT ENAME</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM EMP E</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE EXISTS (SELECT ‘X’ </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN>FROM DEPT</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE DEPT_NO = E.DEPT_NO</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>AND DEPT_CAT = ‘A’);</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">更高效</SPAN><SPAN lang=EN-US>)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT ENAME</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM DEPT D,EMP E</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE E.DEPT_NO = D.DEPT_NO</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>AND DEPT_CAT = ‘A’ ;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red">(</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">译者按</SPAN><SPAN lang=EN-US style="COLOR: red">: </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN><SPAN lang=EN-US style="COLOR: red">RBO</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的情况下</SPAN><SPAN lang=EN-US style="COLOR: red">,</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">前者的执行路径包括</SPAN><SPAN lang=EN-US style="COLOR: red">FILTER,</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">后者使用</SPAN><SPAN lang=EN-US style="COLOR: red">NESTED LOOP)<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>21.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用</SPAN><SPAN lang=EN-US>EXISTS</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">替换</SPAN><SPAN lang=EN-US>DISTINCT<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当提交一个包含一对多表信息</SPAN><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">比如部门表和雇员表</SPAN><SPAN lang=EN-US>)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的查询时</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">避免在</SPAN><SPAN lang=EN-US>SELECT</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句中使用</SPAN><SPAN lang=EN-US>DISTINCT. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一般可以考虑用</SPAN><SPAN lang=EN-US>EXIST</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">替换</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 11.25pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">低效</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 11.25pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>SELECT <B style="mso-bidi-font-weight: normal">DISTINCT</B> DEPT_NO,DEPT_NAME</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 11.25pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>FROM DEPT D,EMP E</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 11.25pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>WHERE D.DEPT_NO = E.DEPT_NO</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 11.25pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">高效</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 11.25pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>SELECT DEPT_NO,DEPT_NAME</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 11.25pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>FROM DEPT D</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 11.25pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;</SPAN><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>WHERE EXISTS ( SELECT ‘X’</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 11.25pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM EMP E</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 11.25pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE E.DEPT_NO = D.DEPT_NO);</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 11.25pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 11.25pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>EXISTS </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使查询更为迅速</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因为</SPAN><SPAN lang=EN-US>RDBMS</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">核心模块将在子查询的条件一旦满足后</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">立刻返回结果</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>22.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">识别</SPAN><SPAN lang=EN-US>’</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">低效执行</SPAN><SPAN lang=EN-US>’</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>SQL</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用下列</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工具找出低效</SPAN><SPAN lang=EN-US>SQL:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT EXECUTIONS , DISK_READS, BUFFER_GETS,</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SQL_TEXT</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM<SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>V$SQLAREA</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>EXECUTIONS&gt;0</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>AND<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>BUFFER_GETS &gt; 0 </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS &lt; 0.8 </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>ORDER BY 4 DESC;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red">(</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">译者按</SPAN><SPAN lang=EN-US style="COLOR: red">: </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">虽然目前各种关于</SPAN><SPAN lang=EN-US style="COLOR: red">SQL</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">优化的图形化工具层出不穷</SPAN><SPAN lang=EN-US style="COLOR: red">,</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但是写出自己的</SPAN><SPAN lang=EN-US style="COLOR: red">SQL</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工具来解决问题始终是一个最好的方法</SPAN><SPAN lang=EN-US style="COLOR: red">)<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>23.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</SPAN><SPAN lang=EN-US>TKPROF </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工具来查询</SPAN><SPAN lang=EN-US>SQL</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">性能状态</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0" align=left><FONT size=3><SPAN lang=EN-US>SQL trace </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工具收集正在执行的</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的性能状态数据并记录到一个跟踪文件中</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个跟踪文件提供了许多有用的信息</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如解析次数</SPAN><SPAN lang=EN-US>.</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">执行次数</SPAN><SPAN lang=EN-US>,CPU</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用时间等</SPAN><SPAN lang=EN-US>.</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这些数据将可以用来优化你的系统</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置</SPAN><SPAN lang=EN-US>SQL TRACE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在会话级别</SPAN><SPAN lang=EN-US>: </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有效</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>ALTER SESSION SET SQL_TRACE TRUE</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置</SPAN><SPAN lang=EN-US>SQL TRACE </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在整个数据库有效仿</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你必须将</SPAN><SPAN lang=EN-US>SQL_TRACE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参数在</SPAN><SPAN lang=EN-US>init.ora</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中设为</SPAN><SPAN lang=EN-US>TRUE, USER_DUMP_DEST</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参数说明了生成跟踪文件的目录</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red">(</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">译者按</SPAN><SPAN lang=EN-US style="COLOR: red">: </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这一节中</SPAN><SPAN lang=EN-US style="COLOR: red">,</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作者并没有提到</SPAN><SPAN lang=EN-US style="COLOR: red">TKPROF</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的用法</SPAN><SPAN lang=EN-US style="COLOR: red">, </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对</SPAN><SPAN lang=EN-US style="COLOR: red">SQL TRACE</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的用法也不够准确</SPAN><SPAN lang=EN-US style="COLOR: red">, </SPAN></B></FONT><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置</SPAN><SPAN lang=EN-US style="COLOR: red">SQL TRACE</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先要在</SPAN><SPAN lang=EN-US style="COLOR: red">init.ora</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中设定</SPAN><SPAN lang=EN-US style="COLOR: red">TIMED_STATISTICS, </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样才能得到那些重要的时间状态</SPAN><SPAN lang=EN-US style="COLOR: red">. </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">生成的</SPAN><SPAN lang=EN-US style="COLOR: red">trace</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件是不可读的</SPAN><SPAN lang=EN-US style="COLOR: red">,</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所以要用</SPAN><SPAN lang=EN-US style="COLOR: red">TKPROF</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工具对其进行转换</SPAN><SPAN lang=EN-US style="COLOR: red">,TKPROF</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有许多执行参数</SPAN><SPAN lang=EN-US style="COLOR: red">. </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">大家可以参考</SPAN><SPAN lang=EN-US style="COLOR: red">ORACLE</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">手册来了解具体的配置</SPAN><SPAN lang=EN-US style="COLOR: red">. )<o:p></o:p></SPAN></B></FONT></P></SPAN><img src ="http://www.blogjava.net/sgsoft/aggbug/1183.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-15 00:37 <a href="http://www.blogjava.net/sgsoft/articles/1183.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> ORACLE SQL性能优化系列 (五)     选择自 black_snail 的 Blog </title><link>http://www.blogjava.net/sgsoft/articles/1182.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Mon, 14 Feb 2005 16:34:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/1182.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/1182.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/1182.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/1182.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/1182.html</trackback:ping><description><![CDATA[<SPAN id=ArticleContent1_ArticleContent1_lblContent>&nbsp;
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>17.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用表的别名</SPAN><SPAN lang=EN-US>(Alias)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当在</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句中连接多个表时</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">请使用表的别名并把别名前缀于每个</SPAN><SPAN lang=EN-US>Column</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上</SPAN><SPAN lang=EN-US>.</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样一来</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就可以减少解析的时间并减少那些由</SPAN><SPAN lang=EN-US>Column</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">歧义引起的语法错误</SPAN><SPAN lang=EN-US>.<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red">(</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">译者注</SPAN><SPAN lang=EN-US style="COLOR: red">: Column</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">歧义指的是由于</SPAN><SPAN lang=EN-US style="COLOR: red">SQL</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中不同的表具有相同的</SPAN><SPAN lang=EN-US style="COLOR: red">Column</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">名</SPAN><SPAN lang=EN-US style="COLOR: red">,</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当</SPAN><SPAN lang=EN-US style="COLOR: red">SQL</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句中出现这个</SPAN><SPAN lang=EN-US style="COLOR: red">Column</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时</SPAN><SPAN lang=EN-US style="COLOR: red">,SQL</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">解析器无法判断这个</SPAN><SPAN lang=EN-US style="COLOR: red">Column</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的归属</SPAN><SPAN lang=EN-US style="COLOR: red">)<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>18.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用</SPAN><SPAN lang=EN-US>EXISTS</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">替代</SPAN><SPAN lang=EN-US>IN<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在许多基于基础表的查询中</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为了满足一个条件</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">往往需要对另一个表进行联接</SPAN><SPAN lang=EN-US>.</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在这种情况下</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</SPAN><SPAN lang=EN-US>EXISTS(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</SPAN><SPAN lang=EN-US>NOT EXISTS)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通常将提高查询的效率</SPAN><SPAN lang=EN-US>.<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">低效</SPAN><SPAN lang=EN-US>:<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT * </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US>FROM EMP (</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基础表</SPAN><SPAN lang=EN-US>)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE EMPNO &gt; 0</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>AND DEPTNO IN (SELECT DEPTNO </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 17.95pt; TEXT-INDENT: 105.75pt; TEXT-ALIGN: left; mso-char-indent-count: 10.07; mso-para-margin-left: 1.71gd" align=left><SPAN lang=EN-US><FONT size=3>FROM DEPT </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 17.95pt; TEXT-INDENT: 105.75pt; TEXT-ALIGN: left; mso-char-indent-count: 10.07; mso-para-margin-left: 1.71gd" align=left><SPAN lang=EN-US><FONT size=3>WHERE LOC = ‘MELB’)</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3>&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">高效</SPAN><SPAN lang=EN-US>:<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT * </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US>FROM EMP (</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基础表</SPAN><SPAN lang=EN-US>)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE EMPNO &gt; 0</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>AND EXISTS (SELECT ‘X’ </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 17.95pt; TEXT-INDENT: 105.75pt; TEXT-ALIGN: left; mso-char-indent-count: 10.07; mso-para-margin-left: 1.71gd" align=left><SPAN lang=EN-US><FONT size=3>FROM DEPT </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 17.95pt; TEXT-INDENT: 105.75pt; TEXT-ALIGN: left; mso-char-indent-count: 10.07; mso-para-margin-left: 1.71gd" align=left><SPAN lang=EN-US><FONT size=3>WHERE DEPT.DEPTNO = EMP.DEPTNO</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 17.95pt; TEXT-INDENT: 105.75pt; TEXT-ALIGN: left; mso-char-indent-count: 10.07; mso-para-margin-left: 1.71gd" align=left><SPAN lang=EN-US><FONT size=3>AND LOC = ‘MELB’)</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3></FONT></SPAN></SPAN>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;</SPAN><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red">(</SPAN></B></SPAN><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">译者按</SPAN><SPAN lang=EN-US style="COLOR: red">: </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">相对来说</SPAN><SPAN lang=EN-US style="COLOR: red">,</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用</SPAN><SPAN lang=EN-US style="COLOR: red">NOT EXISTS</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">替换</SPAN><SPAN lang=EN-US style="COLOR: red">NOT IN </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将更显著地提高效率</SPAN><SPAN lang=EN-US style="COLOR: red">,</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下一节中将指出</SPAN><SPAN lang=EN-US style="COLOR: red">)<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>19.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用</SPAN><SPAN lang=EN-US>NOT EXISTS</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">替代</SPAN><SPAN lang=EN-US>NOT IN<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在子查询中</SPAN><SPAN lang=EN-US>,NOT IN</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句将执行一个内部的排序和合并</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">无论在哪种情况下</SPAN><SPAN lang=EN-US>,NOT IN</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都是最低效的</SPAN><SPAN lang=EN-US> (</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因为它对子查询中的表执行了一个全表遍历</SPAN><SPAN lang=EN-US>).<SPAN style="mso-spacerun: yes">&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为了避免使用</SPAN><SPAN lang=EN-US>NOT IN ,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们可以把它改写成外连接</SPAN><SPAN lang=EN-US>(Outer Joins)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</SPAN><SPAN lang=EN-US>NOT EXISTS.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT …</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE DEPT_NO NOT IN (SELECT DEPT_NO </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN>FROM DEPT </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE DEPT_CAT=’A’);</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为了提高效率</SPAN><SPAN lang=EN-US>.</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">改写为</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法一</SPAN><SPAN lang=EN-US>: </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">高效</SPAN><SPAN lang=EN-US>)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT ….</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM EMP A,DEPT B</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE A.DEPT_NO = B.DEPT(+)</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>AND B.DEPT_NO IS NULL</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>AND B.DEPT_CAT(+) = ‘A’</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法二</SPAN><SPAN lang=EN-US>: </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最高效</SPAN><SPAN lang=EN-US>)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT ….</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM EMP E</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 42pt; TEXT-ALIGN: left; mso-char-indent-count: 4.0" align=left><SPAN lang=EN-US><FONT size=3>WHERE NOT EXISTS (SELECT ‘X’ </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 42pt; TEXT-ALIGN: left; mso-char-indent-count: 4.0" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM DEPT D</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 42pt; TEXT-ALIGN: left; mso-char-indent-count: 4.0" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE D.DEPT_NO = E.DEPT_NO</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 42pt; TEXT-ALIGN: left; mso-char-indent-count: 4.0" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>AND DEPT_CAT = ‘A’);<B style="mso-bidi-font-weight: normal"><o:p></o:p></B></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=3>(待续)</FONT></SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></P></SPAN><img src ="http://www.blogjava.net/sgsoft/aggbug/1182.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-15 00:34 <a href="http://www.blogjava.net/sgsoft/articles/1182.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> ORACLE SQL性能优化系列 (四)     选择自 black_snail 的 Blog </title><link>http://www.blogjava.net/sgsoft/articles/1180.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Mon, 14 Feb 2005 16:29:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/1180.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/1180.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/1180.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/1180.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/1180.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>13.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">计算记录条数</SPAN><SPAN lang=EN-US><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和一般的观点相反</SPAN><SPAN lang=EN-US>, count(*) </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">比</SPAN><SPAN lang=EN-US>count(1)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">稍快</SPAN><SPAN lang=EN-US> , </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当然如果可以通过索引检索</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对索引列的计数仍旧是最快的</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如</SPAN><SPAN lang=EN-US> COUNT(EMPNO)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red">(</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">译者按</SPAN><SPAN lang=EN-US style="COLOR: red">: </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN><SPAN lang=EN-US style="COLOR: red">CSDN</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">论坛中</SPAN><SPAN lang=EN-US style="COLOR: red">,</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">曾经对此有过相当热烈的讨论</SPAN><SPAN lang=EN-US style="COLOR: red">, </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作者的观点并不十分准确</SPAN><SPAN lang=EN-US style="COLOR: red">,</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过实际的测试</SPAN><SPAN lang=EN-US style="COLOR: red">,</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上述三种方法并没有显著的性能差别</SPAN><SPAN lang=EN-US style="COLOR: red">)<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>14.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用</SPAN><SPAN lang=EN-US>Where</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句替换</SPAN><SPAN lang=EN-US>HAVING</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">避免使用</SPAN><SPAN lang=EN-US>HAVING</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句</SPAN><SPAN lang=EN-US>, HAVING </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只会在检索出所有记录之后才对结果集进行过滤</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个处理需要排序</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">总计等操作</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果能通过</SPAN><SPAN lang=EN-US>WHERE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句限制记录的数目</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">那就能减少这方面的开销</SPAN><SPAN lang=EN-US>.<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">低效</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT REGION</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US>AVG(LOG_SIZE)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM LOCATION</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>GROUP BY REGION</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>HAVING REGION REGION != ‘</SPAN><?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><st1:City><st1:place><SPAN lang=EN-US>SYDNEY</SPAN></st1:place></st1:City><SPAN lang=EN-US>’</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>AND REGION != ‘</SPAN><st1:City><st1:place><SPAN lang=EN-US>PERTH</SPAN></st1:place></st1:City><SPAN lang=EN-US>’</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">高效</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT REGION</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US>AVG(LOG_SIZE)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM LOCATION</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE REGION REGION != ‘</SPAN></B><st1:City><st1:place><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US>SYDNEY</SPAN></B></st1:place></st1:City><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US>’<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>AND REGION != ‘</SPAN></B><st1:City><st1:place><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US>PERTH</SPAN></B></st1:place></st1:City><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US>’<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>GROUP BY REGION</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red">(</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">译者按</SPAN><SPAN lang=EN-US style="COLOR: red">: HAVING </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的条件一般用于对一些集合函数的比较</SPAN><SPAN lang=EN-US style="COLOR: red">,</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如</SPAN><SPAN lang=EN-US style="COLOR: red">COUNT() </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等等</SPAN><SPAN lang=EN-US style="COLOR: red">. </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">除此而外</SPAN><SPAN lang=EN-US style="COLOR: red">,</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一般的条件应该写在</SPAN><SPAN lang=EN-US style="COLOR: red">WHERE</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句中</SPAN><SPAN lang=EN-US style="COLOR: red">)<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>15.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">减少对表的查询</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在含有子查询的</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句中</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">要特别注意减少对表的查询</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3>&nbsp;&nbsp; </FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如</SPAN><SPAN lang=EN-US>: </SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">低效</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN>SELECT TAB_NAME</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM TABLES</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE TAB_NAME = ( SELECT TAB_NAME </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM TAB_COLUMNS</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN>WHERE VERSION = 604)</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>AND</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">　</SPAN><SPAN lang=EN-US>DB_VER= ( SELECT DB_VER </SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM TAB_COLUMNS</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE VERSION = 604)</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">高效</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT TAB_NAME</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM TABLES</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE <SPAN style="mso-spacerun: yes">&nbsp;</SPAN>(TAB_NAME,DB_VER)</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 89.25pt; TEXT-ALIGN: left; mso-char-indent-count: 8.5" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>= ( SELECT TAB_NAME,DB_VER) </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM TAB_COLUMNS</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE VERSION = 604)</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Update </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">多个</SPAN><SPAN lang=EN-US>Column </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例子</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">低效</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>UPDATE EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SET EMP_CAT = (SELECT MAX(CATEGORY) FROM EMP_CATEGORIES),</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SAL_RANGE = (SELECT MAX(SAL_RANGE) FROM EMP_CATEGORIES)</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE EMP_DEPT = 0020;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">高效</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>UPDATE EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 178.5pt; TEXT-INDENT: -178.5pt; TEXT-ALIGN: left; mso-char-indent-count: -17.0" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SET (EMP_CAT, SAL_RANGE)</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 178.5pt; TEXT-INDENT: -105pt; TEXT-ALIGN: left; mso-char-indent-count: -10.0; mso-para-margin-left: 7.0gd" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>= (SELECT MAX(CATEGORY) , MAX(SAL_RANGE)</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 178.5pt; TEXT-INDENT: -89.25pt; TEXT-ALIGN: left; mso-char-indent-count: -8.5; mso-para-margin-left: 8.5gd" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>FROM EMP_CATEGORIES)</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE EMP_DEPT = 0020;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><STRONG><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>16.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过内部函数提高</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">效率</SPAN><SPAN lang=EN-US>.</SPAN></FONT></STRONG></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><STRONG><FONT size=3><SPAN lang=EN-US></SPAN></FONT></STRONG>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC,COUNT(*)</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM HISTORY_TYPE T,EMP E,EMP_HISTORY H</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE H.EMPNO = E.EMPNO</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>AND H.HIST_TYPE = T.HIST_TYPE</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>GROUP BY H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过调用下面的函数可以提高效率</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FUNCTION LOOKUP_HIST_TYPE(TYP IN NUMBER) RETURN VARCHAR2</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>AS</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>TDESC VARCHAR2(30);</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>CURSOR C1 IS<SPAN style="mso-spacerun: yes">&nbsp; </SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT TYPE_DESC </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM HISTORY_TYPE</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE HIST_TYPE = TYP;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>BEGIN </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>OPEN C1;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>FETCH C1 INTO TDESC;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>CLOSE C1;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>RETURN (NVL(TDESC,’?’));</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>END;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FUNCTION LOOKUP_EMP(EMP IN NUMBER) RETURN VARCHAR2</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>AS</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>ENAME VARCHAR2(30);</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>CURSOR C1 IS<SPAN style="mso-spacerun: yes">&nbsp; </SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT ENAME</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE EMPNO=EMP;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>BEGIN </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>OPEN C1;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>FETCH C1 INTO ENAME;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>CLOSE C1;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>RETURN (NVL(ENAME,’?’));</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>END;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT H.EMPNO,<B style="mso-bidi-font-weight: normal">LOOKUP_EMP(H.EMPNO),<o:p></o:p></B></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>H.HIST_TYPE,<B style="mso-bidi-font-weight: normal">LOOKUP_HIST_TYPE(H.HIST_TYPE)</B>,COUNT(*)</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM EMP_HISTORY H</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>GROUP BY H.EMPNO , H.HIST_TYPE;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red">(</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">译者按</SPAN><SPAN lang=EN-US style="COLOR: red">: </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">经常在论坛中看到如</SPAN><SPAN style="COLOR: red"> <SPAN lang=EN-US>’</SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">能不能用一个</SPAN><SPAN lang=EN-US style="COLOR: red">SQL</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">写出</SPAN><SPAN lang=EN-US style="COLOR: red">….’ </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的贴子</SPAN><SPAN lang=EN-US style="COLOR: red">, </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">殊不知复杂的</SPAN><SPAN lang=EN-US style="COLOR: red">SQL</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">往往牺牲了执行效率</SPAN><SPAN lang=EN-US style="COLOR: red">. </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的</SPAN><SPAN lang=EN-US style="COLOR: red">)<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3></FONT></o:p></SPAN>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;(待续)</FONT></o:p></SPAN></P><BR>
<DIV style="FONT-SIZE: 14px; LINE-HEIGHT: 25px"><STRONG>作者Blog：</STRONG><A id=ArticleContent1_ArticleContent1_AuthorBlogLink href="http://blog.csdn.net/black_snail/" target=_blank><FONT color=#002c99>http://blog.csdn.net/black_snail/</FONT></A></DIV><img src ="http://www.blogjava.net/sgsoft/aggbug/1180.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-15 00:29 <a href="http://www.blogjava.net/sgsoft/articles/1180.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> ORACLE SQL性能优化系列 (三)     选择自 black_snail 的 Blog </title><link>http://www.blogjava.net/sgsoft/articles/1178.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Mon, 14 Feb 2005 16:27:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/1178.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/1178.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/1178.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/1178.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/1178.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=3 cellPadding=3 width="100%" bgColor=#eeeeee border=0>
<TBODY>
<TR>
<TD align=middle bgColor=#003399 height=16><FONT color=#ffffff>关键字</FONT></TD>
<TD width=500>&nbsp; <SPAN id=ArticleTitle1_ArticleTitle1_lblKeywords>ORACLE SQL PERFORMANCE TUNING</SPAN></TD></TR>
<TR>
<TD align=middle bgColor=#003399 height=16><FONT color=#ffffff>出处</FONT></TD>
<TD>&nbsp; <SPAN id=ArticleTitle1_ArticleTitle1_lblSource><A href="http://www.dbasupport.com">http://www.dbasupport.com</A></SPAN></TD></TR></TBODY></TABLE>
<P>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>8.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</SPAN><SPAN lang=EN-US>DECODE</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数来减少处理时间</SPAN><SPAN lang=EN-US><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;</SPAN><o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</SPAN><SPAN lang=EN-US>DECODE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数可以避免重复扫描相同记录或重复连接相同的表</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>SELECT COUNT(*)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US>SUM(SAL)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>FROM</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">　</SPAN><SPAN lang=EN-US>EMP</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>WHERE DEPT_NO = 0020</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>AND ENAME LIKE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">　</SPAN><SPAN lang=EN-US>‘SMITH%’;</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>SELECT COUNT(*)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US>SUM(SAL)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>FROM</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">　</SPAN><SPAN lang=EN-US>EMP</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>WHERE DEPT_NO = 0030</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>AND ENAME LIKE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">　</SPAN><SPAN lang=EN-US>‘SMITH%’;<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你可以用</SPAN><SPAN lang=EN-US>DECODE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数高效地得到相同结果</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT COUNT(DECODE(DEPT_NO,0020,’X’,NULL)) D0020_COUNT,</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>COUNT(DECODE(DEPT_NO,0030,’X’,NULL)) D0030_COUNT,</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL,</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM EMP WHERE ENAME LIKE ‘SMITH%’;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类似的</SPAN><SPAN lang=EN-US>,DECODE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数也可以运用于</SPAN><SPAN lang=EN-US>GROUP BY </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US>ORDER BY</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句中</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>9.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">整合简单</SPAN><SPAN lang=EN-US>,</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">无关联的数据库访问</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果你有几个简单的数据库查询语句</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你可以把它们整合到一个查询中</SPAN><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">即使它们之间没有关系</SPAN><SPAN lang=EN-US>)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT NAME </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM EMP </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE EMP_NO = 1234;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT NAME </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM DPT</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE DPT_NO = 10 ;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT NAME </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM CAT</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE CAT_TYPE = ‘RD’;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上面的</SPAN><SPAN lang=EN-US>3</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个查询可以被合并成一个</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT E.NAME , D.NAME , C.NAME</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM CAT C , DPT D , EMP E,DUAL X</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE NVL(‘X’,X.DUMMY) = NVL(‘X’,E.ROWID(+))</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>AND NVL(‘X’,X.DUMMY) = NVL(‘X’,D.ROWID(+))</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>AND NVL(‘X’,X.DUMMY) = NVL(‘X’,C.ROWID(+))</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>AND E.EMP_NO(+) = 1234</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>AND D.DEPT_NO(+) = 10</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>AND C.CAT_TYPE(+) = ‘RD’;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red">(</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">译者按</SPAN><SPAN lang=EN-US style="COLOR: red">: </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">虽然采取这种方法</SPAN><SPAN lang=EN-US style="COLOR: red">,</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">效率得到提高</SPAN><SPAN lang=EN-US style="COLOR: red">,</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但是程序的可读性大大降低</SPAN><SPAN lang=EN-US style="COLOR: red">,</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所以读者</SPAN></B></FONT><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><SPAN style="mso-spacerun: yes">&nbsp;</SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还是要权衡之间的利弊</SPAN><SPAN lang=EN-US style="COLOR: red">)<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>10.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">删除重复记录</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最高效的删除重复记录方法</SPAN><SPAN lang=EN-US> ( </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因为使用了</SPAN><SPAN lang=EN-US>ROWID)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>DELETE FROM EMP E</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE E.ROWID &gt; (SELECT MIN(X.ROWID) </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM EMP X</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE X.EMP_NO = E.EMP_NO);</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>11.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用</SPAN><SPAN lang=EN-US>TRUNCATE</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">替代</SPAN><SPAN lang=EN-US>DELETE<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当删除表中的记录时</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在通常情况下</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">回滚段</SPAN><SPAN lang=EN-US>(rollback segments ) </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用来存放可以被恢复的信息</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果你没有</SPAN><SPAN lang=EN-US>COMMIT</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">事务</SPAN><SPAN lang=EN-US>,ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会将数据恢复到删除之前的状态</SPAN><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">准确地说是</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">恢复到执行删除命令之前的状况</SPAN><SPAN lang=EN-US>)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而当运用</SPAN><SPAN lang=EN-US>TRUNCATE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">回滚段不再存放任何可被恢复的信息</SPAN><SPAN lang=EN-US>.</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当命令运行后</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据不能被恢复</SPAN><SPAN lang=EN-US>.</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因此很少的资源被调用</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">执行时间也会很短</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red">(</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">译者按</SPAN><SPAN lang=EN-US style="COLOR: red">: TRUNCATE</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只在删除全表适用</SPAN><SPAN lang=EN-US style="COLOR: red">,TRUNCATE</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</SPAN><SPAN lang=EN-US style="COLOR: red">DDL</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不是</SPAN><SPAN lang=EN-US style="COLOR: red">DML)<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red"><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>12.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">尽量多使用</SPAN><SPAN lang=EN-US>COMMIT<o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 10.3pt; TEXT-ALIGN: left; mso-char-indent-count: .98" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只要有可能</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在程序中尽量多使用</SPAN><SPAN lang=EN-US>COMMIT, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样程序的性能得到提高</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需求也会因为</SPAN><SPAN lang=EN-US>COMMIT</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所释放的资源而减少</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 10.3pt; TEXT-ALIGN: left; mso-char-indent-count: .98" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>COMMIT</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所释放的资源</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 34.3pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l1 level1 lfo2; tab-stops: list 34.3pt" align=left><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>a.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">回滚段上用于恢复数据的信息</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 34.3pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l1 level1 lfo2; tab-stops: list 34.3pt" align=left><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>b.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=3>被程序语句获得的锁</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 34.3pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l1 level1 lfo2; tab-stops: list 34.3pt" align=left><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>c.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><SPAN lang=EN-US>redo log buffer </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的空间</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 34.3pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l1 level1 lfo2; tab-stops: list 34.3pt" align=left><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>d.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><SPAN lang=EN-US>ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为管理上述</SPAN><SPAN lang=EN-US>3</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">种资源中的内部花费</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: red">(</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">译者按</SPAN><SPAN lang=EN-US style="COLOR: red">: </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在使用</SPAN><SPAN lang=EN-US style="COLOR: red">COMMIT</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时必须要注意到事务的完整性</SPAN><SPAN lang=EN-US style="COLOR: red">,</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">现实中效率和事务完整性往往是鱼和熊掌不可得兼</SPAN><SPAN lang=EN-US style="COLOR: red">)<o:p></o:p></SPAN></B></FONT></P><img src ="http://www.blogjava.net/sgsoft/aggbug/1178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-15 00:27 <a href="http://www.blogjava.net/sgsoft/articles/1178.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化系列 (二)     选择自 black_snail 的 Blog </title><link>http://www.blogjava.net/sgsoft/articles/1177.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Mon, 14 Feb 2005 16:26:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/1177.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/1177.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/1177.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/1177.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/1177.html</trackback:ping><description><![CDATA[<SPAN id=ArticleContent1_ArticleContent1_lblContent>&nbsp;
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US>4. </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">选择最有效率的表名顺序</SPAN><SPAN lang=EN-US>(</SPAN></B></FONT><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=3>只在基于规则的优化器中有效</FONT></SPAN><SPAN lang=EN-US><FONT size=3>)<BR style="mso-special-character: line-break"><BR style="mso-special-character: line-break"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US>ORACLE</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的解析器按照从右到左的顺序处理</SPAN><SPAN lang=EN-US>FROM</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句中的表名</SPAN></B><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因此</SPAN><SPAN lang=EN-US>FROM</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句中写在最后的表</SPAN><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基础表</SPAN><SPAN lang=EN-US> driving table)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将被最先处理</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN><SPAN lang=EN-US>FROM</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句中包含多个表的情况下</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你必须选择记录条数最少的表作为基础表</SPAN><SPAN lang=EN-US>.</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当</SPAN><SPAN lang=EN-US>ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">处理多个表时</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会运用排序及合并的方式连接它们</SPAN><SPAN lang=EN-US>.</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">扫描第一个表</SPAN><SPAN lang=EN-US>(FROM</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句中最后的那个表</SPAN><SPAN lang=EN-US>)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">并对记录进行派序</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">然后扫描第二个表</SPAN><SPAN lang=EN-US>(FROM</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句中最后第二个表</SPAN><SPAN lang=EN-US>),</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表</SPAN><SPAN lang=EN-US> TAB1 16,384 </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">条记录</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;</SPAN><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表</SPAN><SPAN lang=EN-US> TAB2 1<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">条记录</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;</SPAN><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">选择</SPAN><SPAN lang=EN-US>TAB2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作为基础表</SPAN><SPAN lang=EN-US> (</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最好的方法</SPAN><SPAN lang=EN-US>)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>select count(*) from tab1,tab2<SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">执行时间</SPAN><SPAN lang=EN-US>0.96</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">秒</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; TEXT-ALIGN: left; mso-char-indent-count: .5" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">选择</SPAN><SPAN lang=EN-US>TAB2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作为基础表</SPAN><SPAN lang=EN-US> (</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不佳的方法</SPAN><SPAN lang=EN-US>)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>select count(*) from tab2,tab1<SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">执行时间</SPAN><SPAN lang=EN-US>26.09</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">秒</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果有</SPAN><SPAN lang=EN-US>3</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个以上的表连接查询</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">那就需要选择交叉表</SPAN><SPAN lang=EN-US>(intersection table)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作为基础表</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">交叉表是指那个被其他表所引用的表</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>EMP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表描述了</SPAN><SPAN lang=EN-US>LOCATION</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表和</SPAN><SPAN lang=EN-US>CATEGORY</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表的交集</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>SELECT * </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; TEXT-ALIGN: left; mso-char-indent-count: .5" align=left><SPAN lang=EN-US><FONT size=3>FROM LOCATION L , </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; TEXT-ALIGN: left; mso-char-indent-count: .5" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>CATEGORY C,</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; TEXT-ALIGN: left; mso-char-indent-count: .5" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>EMP E <o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; TEXT-ALIGN: left; mso-char-indent-count: .5" align=left><SPAN lang=EN-US><FONT size=3>WHERE E.EMP_NO BETWEEN 1000 AND 2000</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; TEXT-ALIGN: left; mso-char-indent-count: .5" align=left><SPAN lang=EN-US><FONT size=3>AND E.CAT_NO = C.CAT_NO</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; TEXT-ALIGN: left; mso-char-indent-count: .5" align=left><SPAN lang=EN-US><FONT size=3>AND E.LOCN = L.LOCN</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; TEXT-ALIGN: left; mso-char-indent-count: .5" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; TEXT-ALIGN: left; mso-char-indent-count: .5" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将比下列</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">更有效率</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; TEXT-ALIGN: left; mso-char-indent-count: .5" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; TEXT-ALIGN: left; mso-char-indent-count: .5" align=left><SPAN lang=EN-US><FONT size=3>SELECT * </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; TEXT-ALIGN: left; mso-char-indent-count: .5" align=left><SPAN lang=EN-US><FONT size=3>FROM <B style="mso-bidi-font-weight: normal">EMP E ,<o:p></o:p></B></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 36.75pt; TEXT-ALIGN: left; mso-char-indent-count: 3.5" align=left><SPAN lang=EN-US><FONT size=3>LOCATION L , </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; TEXT-ALIGN: left; mso-char-indent-count: .5" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>CATEGORY C</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; TEXT-ALIGN: left; mso-char-indent-count: .5" align=left><SPAN lang=EN-US><FONT size=3>WHERE <SPAN style="mso-spacerun: yes">&nbsp;</SPAN>E.CAT_NO = C.CAT_NO</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; TEXT-ALIGN: left; mso-char-indent-count: .5" align=left><SPAN lang=EN-US><FONT size=3>AND E.LOCN = L.LOCN</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; TEXT-ALIGN: left; mso-char-indent-count: .5" align=left><SPAN lang=EN-US><FONT size=3>AND E.EMP_NO BETWEEN 1000 AND 2000</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; TEXT-ALIGN: left; mso-char-indent-count: .5" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 5.25pt; TEXT-ALIGN: left; mso-char-indent-count: .5" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><SPAN style="FONT: 7pt 'Times New Roman'"><STRONG><FONT size=3>5.</FONT></STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US>WHERE</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句中的连接顺序．</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US>ORACLE</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">采用自下而上的顺序解析</SPAN><SPAN lang=EN-US>WHERE</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句</SPAN></B><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">根据这个原理</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表之间的连接必须写在其他</SPAN><SPAN lang=EN-US>WHERE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">条件之前</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">那些可以过滤掉最大数量记录的条件必须写在</SPAN><SPAN lang=EN-US>WHERE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句的末尾</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">低效</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">执行时间</SPAN><SPAN lang=EN-US>156.3</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">秒</SPAN><SPAN lang=EN-US>)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT … </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM EMP E</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE<SPAN style="mso-spacerun: yes">&nbsp; </SPAN><B style="mso-bidi-font-weight: normal">SAL &gt; 50000<o:p></o:p></B></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><FONT size=3>AND<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>JOB = ‘MANAGER’<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>AND<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>25 &lt; (SELECT COUNT(*) FROM EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE MGR=E.EMPNO);</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">高效</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">执行时间</SPAN><SPAN lang=EN-US>10.6</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">秒</SPAN><SPAN lang=EN-US>)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>SELECT … </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>FROM EMP E</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3>WHERE 25 &lt; (SELECT COUNT(*) FROM EMP</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE MGR=E.EMPNO)</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><FONT size=3>AND<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>SAL &gt; 50000<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><FONT size=3>AND<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>JOB = ‘MANAGER’;<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>6.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US>SELECT</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句中避免使用</SPAN> <SPAN lang=EN-US>‘ * ‘<o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当你想在</SPAN><SPAN lang=EN-US>SELECT</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句中列出所有的</SPAN><SPAN lang=EN-US>COLUMN</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用动态</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">列引用</SPAN> <SPAN lang=EN-US>‘*’ </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是一个方便的方法</SPAN><SPAN lang=EN-US>.</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不幸的是</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这是一个非常低效的方法</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实际上</SPAN><SPAN lang=EN-US>,ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在解析的过程中</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会将</SPAN><SPAN lang=EN-US>’*’ </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">依次转换成所有的列名</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个工作是通过查询数据字典完成的</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这意味着将耗费更多的时间</SPAN><SPAN lang=EN-US>. <o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN><o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>7.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">减少访问数据库的次数</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当执行每条</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句时</SPAN><SPAN lang=EN-US>, ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在内部执行了许多工作</SPAN><SPAN lang=EN-US>: </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">解析</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">估算索引的利用率</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">绑定变量</SPAN><SPAN lang=EN-US> , </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">读数据块等等</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">由此可见</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">减少访问数据库的次数</SPAN><SPAN lang=EN-US> , </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就能实际上减少</SPAN><SPAN lang=EN-US>ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的工作量</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如</SPAN><SPAN lang=EN-US>,</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以下有三种方法可以检索出雇员号等于</SPAN><SPAN lang=EN-US>0342</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</SPAN><SPAN lang=EN-US>0291</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的职员</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法</SPAN><SPAN lang=EN-US>1 (</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最低效</SPAN><SPAN lang=EN-US>)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>SELECT EMP_NAME , SALARY , GRADE</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.35pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>FROM EMP <o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>WHERE EMP_NO = 342;<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>SELECT EMP_NAME , SALARY , GRADE</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.35pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>FROM EMP <o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>WHERE EMP_NO = 291;<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法</SPAN><SPAN lang=EN-US>2 (</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次低效</SPAN><SPAN lang=EN-US>)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3>&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>DECLARE </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>CURSOR C1 (E_NO NUMBER) IS </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT EMP_NAME,SALARY,GRADE</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM EMP </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>WHERE EMP_NO = E_NO;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>BEGIN </FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>OPEN C1(342);</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.35pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FETCH C1 INTO …,..,.. ;<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>…..<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>OPEN C1(291);</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.35pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>FETCH C1 INTO …,..,.. ;<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>CLOSE C1;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>END;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法</SPAN><SPAN lang=EN-US>3 (</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">高效</SPAN><SPAN lang=EN-US>)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>SELECT A.EMP_NAME , A.SALARY , A.GRADE,</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>B.EMP_NAME , B.SALARY , B.GRADE</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.35pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>FROM EMP A,EMP B<o:p></o:p></FONT></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>WHERE A.EMP_NO = 342</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="TEXT-TRANSFORM: uppercase">AND<SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>B.EMP_NO = 291;<o:p></o:p></SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; TEXT-ALIGN: left; mso-char-indent-count: 2.5" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><B style="mso-bidi-font-weight: normal"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注意</SPAN><SPAN lang=EN-US>:<o:p></o:p></SPAN></FONT></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN><SPAN lang=EN-US>SQL*Plus , SQL*Forms</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US>Pro*C</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中重新设置</SPAN><SPAN lang=EN-US>ARRAYSIZE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参数</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以增加每次数据库访问的检索数据量</SPAN> <SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">建议值为</SPAN><SPAN lang=EN-US>200</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US></SPAN></FONT>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-ALIGN: left" align=left><FONT size=3><SPAN lang=EN-US>(待续)<o:p></o:p></SPAN></FONT></P></SPAN><img src ="http://www.blogjava.net/sgsoft/aggbug/1177.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-15 00:26 <a href="http://www.blogjava.net/sgsoft/articles/1177.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化系列 (一)     选择自 black_snail 的 Blog </title><link>http://www.blogjava.net/sgsoft/articles/1176.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Mon, 14 Feb 2005 16:24:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/1176.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/1176.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/1176.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/1176.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/1176.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US>1. </SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">选用适合的</SPAN><SPAN lang=EN-US>ORACLE</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">优化器</SPAN><SPAN lang=EN-US><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的优化器共有</SPAN><SPAN lang=EN-US>3</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">种</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>a. <SPAN style="mso-spacerun: yes">&nbsp;</SPAN>RULE (</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基于规则</SPAN><SPAN lang=EN-US>)<SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN>b. COST (</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基于成本</SPAN><SPAN lang=EN-US>)<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>c. CHOOSE (</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">选择性</SPAN><SPAN lang=EN-US>)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置缺省的优化器</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以通过对</SPAN><SPAN lang=EN-US>init.ora</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件中</SPAN><SPAN lang=EN-US>OPTIMIZER_MODE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参数的各种声明</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如</SPAN><SPAN lang=EN-US>RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你当然也在</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">句级或是会话</SPAN><SPAN lang=EN-US>(session)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">级对其进行覆盖</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为了使用基于成本的优化器</SPAN><SPAN lang=EN-US>(CBO, Cost-Based Optimizer) , </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你必须经常运行</SPAN><SPAN lang=EN-US>analyze </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">命令</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以增加数据库中的对象统计信息</SPAN><SPAN lang=EN-US>(object statistics)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的准确性</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果数据库的优化器模式设置为选择性</SPAN><SPAN lang=EN-US>(CHOOSE),</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">那么实际的优化器模式将和是否运行过</SPAN><SPAN lang=EN-US>analyze</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">命令有关</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果</SPAN><SPAN lang=EN-US>table</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">已经被</SPAN><SPAN lang=EN-US>analyze</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">过</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">优化器模式将自动成为</SPAN><SPAN lang=EN-US>CBO , </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">反之</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据库将采用</SPAN><SPAN lang=EN-US>RULE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">形式的优化器</SPAN><SPAN lang=EN-US>.<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;</SPAN><SPAN style="mso-spacerun: yes">&nbsp; </SPAN></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在缺省情况下</SPAN><SPAN lang=EN-US>,ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">采用</SPAN><SPAN lang=EN-US>CHOOSE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">优化器</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为了避免那些不必要的全表扫描</SPAN><SPAN lang=EN-US>(full table scan) , </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你必须尽量避免使用</SPAN><SPAN lang=EN-US>CHOOSE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">优化器</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而直接采用基于规则或者基于成本的优化器</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3>&nbsp;&nbsp; </FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>2.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">访问</SPAN><SPAN lang=EN-US>Table</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的方式</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3>&nbsp;&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><FONT size=3><SPAN lang=EN-US>ORACLE </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">采用两种访问表中记录的方式</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3></FONT></SPAN></SPAN>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level2 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>a.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">全表扫描</SPAN><SPAN lang=EN-US> </SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">全表扫描就是顺序地访问表中每条记录</SPAN><SPAN lang=EN-US>. ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">采用一次读入多个数据块</SPAN><SPAN lang=EN-US>(database block)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的方式优化全表扫描</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3>&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level2 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>b.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过</SPAN><SPAN lang=EN-US>ROWID</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">访问表</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你可以采用基于</SPAN><SPAN lang=EN-US>ROWID</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的访问方式情况</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提高访问表的效率</SPAN><SPAN lang=EN-US>, , ROWID</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包含了表中记录的物理位置信息</SPAN><SPAN lang=EN-US>..ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">采用索引</SPAN><SPAN lang=EN-US>(INDEX)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现了数据和存放数据的物理位置</SPAN><SPAN lang=EN-US>(ROWID)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之间的联系</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通常索引提供了快速访问</SPAN><SPAN lang=EN-US>ROWID</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的方法</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因此那些基于索引列的查询就可以得到性能上的提高</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>3.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN></B><FONT size=3><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">共享</SPAN><SPAN lang=EN-US>SQL</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></B></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3>&nbsp;&nbsp;&nbsp; </FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为了不重复解析相同的</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在第一次解析之后</SPAN><SPAN lang=EN-US>, ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句存放在内存中</SPAN><SPAN lang=EN-US>.</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这块位于系统全局区域</SPAN><SPAN lang=EN-US>SGA(system global area)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的共享池</SPAN><SPAN lang=EN-US>(shared buffer pool)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的内存可以被所有的数据库用户共享</SPAN><SPAN lang=EN-US>. </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因此</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当你执行一个</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句</SPAN><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有时被称为一个游标</SPAN><SPAN lang=EN-US>)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果它</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和之前的执行过的语句完全相同</SPAN><SPAN lang=EN-US>, ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就能很快获得已经被解析的语句以及最好的</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">执行路径</SPAN><SPAN lang=EN-US>. ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的这个功能大大地提高了</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的执行性能并节省了内存的使用</SPAN><SPAN lang=EN-US>.<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可惜的是</SPAN><SPAN lang=EN-US>ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只对简单的表提供高速缓冲</SPAN><SPAN lang=EN-US>(cache buffering) ,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个功能并不适用于多表连接查询</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据库管理员必须在</SPAN><SPAN lang=EN-US>init.ora</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中为这个区域设置合适的参数</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当这个内存区域越大</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就可以保留更多的语句</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当然被共享的可能性也就越大了</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当你向</SPAN><SPAN lang=EN-US>ORACLE </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提交一个</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句</SPAN><SPAN lang=EN-US>,ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会首先在这块内存中查找相同的语句</SPAN><SPAN lang=EN-US>.<o:p></o:p></SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;</SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里需要注明的是</SPAN><SPAN lang=EN-US>,ORACLE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对两者采取的是一种严格匹配</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">要达成共享</SPAN><SPAN lang=EN-US>,SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句必须</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">完全相同</SPAN><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包括空格</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">换行等</SPAN><SPAN lang=EN-US>).</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">共享的语句必须满足三个条件</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 45.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>A.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字符级的比较</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当前被执行的语句和共享池中的语句必须完全相同</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT * FROM EMP;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和下列每一个都不同</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT * from EMP;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Select * From Emp;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>SELECT<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>*<SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>FROM EMP;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 45.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>B.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">两个语句所指的对象必须完全相同</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 31.5pt; mso-char-indent-count: 3.0"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例如</SPAN><SPAN lang=EN-US>:</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 31.5pt; mso-char-indent-count: 3.0"><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用户</SPAN><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象名</SPAN><SPAN lang=EN-US><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如何访问</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><SPAN lang=EN-US><FONT size=3>Jack<SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>sal_limit<SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>private synonym</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><SPAN lang=EN-US><FONT size=3><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Work_city<SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>public synonym</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><SPAN lang=EN-US><FONT size=3><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Plant_detail<SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>public synonym</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><SPAN lang=EN-US><FONT size=3>Jill<SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>sal_limit<SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>private synonym</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><SPAN lang=EN-US><FONT size=3><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Work_city<SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>public synonym</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><SPAN lang=EN-US><FONT size=3><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Plant_detail<SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>table owner<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><FONT size=3><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">考虑一下下列</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句能否在这两个用户之间共享</SPAN><SPAN lang=EN-US>.</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN></FONT></SPAN></P>
<TABLE class=MsoNormalTable style="MARGIN: auto auto auto 4.55pt; WIDTH: 466pt; BORDER-COLLAPSE: collapse; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt" cellSpacing=0 cellPadding=0 width=621 border=0>
<TBODY>
<TR style="HEIGHT: 14.25pt; mso-yfti-irow: 0">
<TD style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 233pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid windowtext 1.0pt; mso-border-left-alt: solid windowtext 1.0pt; mso-border-bottom-alt: solid windowtext .5pt" noWrap width=311>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><B><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">SQL<o:p></o:p></SPAN></B></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 68pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt" noWrap width=91>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">能否共享<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></B></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 165pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid windowtext 1.0pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext 1.0pt" noWrap width=220>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><B><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">原因<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></B></P></TD></TR>
<TR style="HEIGHT: 42.75pt; mso-yfti-irow: 1">
<TD style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 233pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; HEIGHT: 42.75pt; BACKGROUND-COLOR: transparent" width=311>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">select max(sal_cap) from sal_limit;<o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 68pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; HEIGHT: 42.75pt; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext .5pt" width=91>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">不能<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 165pt; PADDING-TOP: 0cm; BORDER-BOTTOM: #d4d0c8; HEIGHT: 42.75pt; BACKGROUND-COLOR: transparent" width=220>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">每个用户都有一个<SPAN lang=EN-US>private synonym - sal_limit , 它们是不同的对象<o:p></o:p></SPAN></SPAN></P></TD></TR>
<TR style="HEIGHT: 28.5pt; mso-yfti-irow: 2">
<TD style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 233pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 28.5pt; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext 1.0pt; mso-border-bottom-alt: solid windowtext .5pt" width=311>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">select count(*0 from work_city where sdesc like 'NEW%';<o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 68pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 28.5pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" width=91>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">能<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 165pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 28.5pt; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid windowtext .5pt; mso-border-bottom-alt: solid windowtext .5pt; mso-border-right-alt: solid windowtext 1.0pt" width=220>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">两个用户访问相同的对象<SPAN lang=EN-US>public synonym - work_city <o:p></o:p></SPAN></SPAN></P></TD></TR>
<TR style="HEIGHT: 57.75pt; mso-yfti-irow: 3; mso-yfti-lastrow: yes">
<TD style="BORDER-RIGHT: #d4d0c8; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 233pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 57.75pt; BACKGROUND-COLOR: transparent" width=311>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">select a.sdesc,b.location from work_city a , plant_detail b where a.city_id = b.city_id<o:p></o:p></SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 68pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 57.75pt; BACKGROUND-COLOR: transparent; mso-border-left-alt: solid windowtext .5pt; mso-border-bottom-alt: solid windowtext 1.0pt; mso-border-right-alt: solid windowtext .5pt" width=91>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">不能<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 165pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 57.75pt; BACKGROUND-COLOR: transparent" width=220>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">用户<SPAN lang=EN-US>jack 通过private synonym访问plant_detail 而jill 是表的所有者,对象不同.<o:p></o:p></SPAN></SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT size=3><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3>&nbsp; </FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 45.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore"><FONT size=3>C.</FONT><SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">两个</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句中必须使用相同的名字的绑定变量</SPAN><SPAN lang=EN-US>(bind variables)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=3>例如：</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第一组的两个</SPAN><SPAN lang=EN-US>SQL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句是相同的</SPAN><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以共享</SPAN><SPAN lang=EN-US>),</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而第二组中的两个语句是不同的</SPAN><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">即使在运行时</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">赋于不同的绑定变量相同的值</SPAN><SPAN lang=EN-US>)</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><SPAN lang=EN-US><FONT size=3>a.</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><SPAN lang=EN-US><FONT size=3>select pin , name from people where pin = :blk1.pin;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><SPAN lang=EN-US><FONT size=3>select pin , name from people where pin = :blk1.pin;<o:p></o:p></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3></FONT></SPAN></SPAN>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><SPAN lang=EN-US><FONT size=3>b.</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><SPAN lang=EN-US><FONT size=3>select pin , name from people where pin = <B style="mso-bidi-font-weight: normal">:blk1.ot_ind</B>;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><SPAN lang=EN-US><FONT size=3>select pin , name from people where pin = <B style="mso-bidi-font-weight: normal">:blk1.ov_ind</B>;</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=3>&nbsp;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"><FONT size=3>&nbsp;&nbsp; (待续)</FONT></SPAN></SPAN></P><img src ="http://www.blogjava.net/sgsoft/aggbug/1176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-15 00:24 <a href="http://www.blogjava.net/sgsoft/articles/1176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>优化Oracle停机时间及数据库恢复</title><link>http://www.blogjava.net/sgsoft/articles/996.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Thu, 03 Feb 2005 16:11:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/996.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/996.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/996.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/996.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/996.html</trackback:ping><description><![CDATA[<H2 align=center>优化Oracle停机时间及数据库恢复</H2>
<P>　　这里会讨论令Oracle停机时间最小化的步骤。各种形式的停机--计划的或者是非计划的--总是不断地发生，一个DBA应该有正确的备份策略，这样在数据库出现问题时就可以更快地恢复。 </P>
<P>　　以下是假定的备份策略和数据库的运作条件</P>
<P>　　　控制文件是镜像的<BR>　　　数据库运行在archivelog模式<BR>　　　每个星期都进行冷备份<BR>　　　每日都进行热备份<BR>　　　每日都进行一次全数据库导出</P>
<P>　　事件1：完整的数据库重构</P>
<P>　　在这种情形下，你可以使用全数据库导出或者冷热备份结合的方式来重构数据库。要注意的是无论你选择哪种方式，在线redo log中的事务都会丢失。</P>
<P>　　事件2：恢复部分的表空间</P>
<P>　　可以使用以下的步骤来恢复：</P>
<P>　　　1、以restrict模式启动数据库<BR>　　　2、重新创建表空间<BR>　　　3、使用最新的全数据库导出来导入，并且使用ignore=y的选项；<BR>　　　4.关闭并且重新以normal的模式启动数据库实例</P>
<P>　　事件3：丢失一般的数据文件</P>
<P>　　丢失一般数据文件的恢复步骤根据所丢失的数据文件包含的表空间类型而定；例如：回滚段，用户表空间，索引表空间或者是只读的表空间、你可能会遇到以下的错误：</P>
<P>　　　. 尝试启动数据库并且碰到错误的信息ORA-1157, ORA-1110，可能还有一个操作系统的错误<BR>　　　. 尝试以normal或者immediate的模式关闭数据库，可能会碰到ORA-1116, ORA-1110的错误信息，还有一个系统错误</P>
<P>　　以下的步骤可以用作恢复：</P>
<P>　　　1、关闭数据库<BR>　　　2、由热备份中恢复丢失的数据文件<BR>　　　3、Startup mount数据库<BR>　　　4、执行以下的查询来得到所有你的在线redo log文件和它们相应的次序和首次修改号：</P>
<P>SELECT X.GROUP#, MEMBER, SEQUENCE#, FIRST_CHANGE#<BR>FROM V$LOG X, V$LOGILE Y<BR>WHERE X.GROUP# = Y.GROUP#; </P>
<P>　　5、如果得到的CHANGE#比在线redo log最小的FIRST_CHANGE# 还小，那么该文件不能被完全恢复，你可以有两个选择：</P>
<P>　　　.　如果可以接受丢失最近一次冷备份以来的数据库修改，装入备份并且继续恢复<BR>　　　.　如果不能接受丢失数据库的修改，那么必须重新创建表空间</P>
<P>　　6、通过使用存档和在线的redo log来恢复数据文件<BR>　　7、打开数据库</P>
<P>　　事件4：恢复一个特别的表</P>
<P>　　可以采用以下的步骤恢复：<BR>　　　1、使用最近的一次全数据库导出来导入表，并且使用owner=和tables=的选项<BR>　　　2、考虑到性能的原因，可能需要重建表索引</P>
<P>　　事件5：丢失控制文件</P>
<P>　　在数据库起来并且运行时，通常都不能检测到控制文件的问题、如果控制文件丢失或者损坏了，Oracle将不会了解，下次数据库的启动时将会导致ORA-205错误（标识控制文件"%s的错误），还有一个系统级的错误。</P>
<P>　　如果只是丢失了其中的一个控制文件，可以采用下面的步骤来恢复：<BR>　　　1、如果它正在运行的话，先关闭它<BR>　　　2、查找丢失控制文件的原因、是由于硬件的问题吗（磁盘还是控制器）？<BR>　　　3、如果不是硬件的问题，将控制文件的一个好的拷贝复制到丢失的位置，并且跳到步骤5、<BR>　　　4、如果是硬件的问题，复制一个好的控制文件拷贝到一个可靠的位置<BR>　　　5、编辑initsid.ora 或者 configsid.ora，更新CONTROL_FILES以反映最新的控制文件位置<BR>　　　6、启动数据库</P>
<P>　　事件6：丢失全部的控制文件</P>
<P>　　可以采用以下的步骤恢复：</P>
<P>　　　1、关闭数据库<BR>　　　2、进行一次全数据库备份，包括全部的数据文件和redo log文件<BR>　　　3、以NOMOUNT的状态启动数据库<BR>　　　4、使用CREATE CONTROLFILE重新创建控制文件、你也可以备份控制文件到一个trace文件，然后执行该文件<BR>　　　5、在数据库上进行媒体恢复<BR>　　　6、打开数据库<BR>　　　7、使用shutdown normal关闭数据库<BR>　　　8、对数据库进行一次冷备份</P>
<P>　　事件7：丢失一个索引</P>
<P>　　最简单的方法就是重新创建丢失的索引</P>
<P>　　事件8：丢失一个非活动的redo log</P>
<P>　　如果丢失redo数据，恢复将是不完全的，必须重新创建涉及的表空间。要重新创建表空间，可以使用全的数据库导出，这样就可以很容易的导入数据并且重新创建该表空间的对象。可以使用以下的步骤来恢复：<BR>　　　1、通过Alter system来切换redo log文件<BR>　　　2、关闭数据库<BR>　　　3、startup mount数据库<BR>　　　4、离线删除涉及的数据文件<BR>　　　5、打开数据库<BR>　　　6、删除用户的表空间，包括其中的内容、<BR>　　　7、通过全数据库备份重新创建表空间和其中的对象</P>
<P>　　事件9：丢失活动的Redo log</P>
<P>　　如事件8讨论的一样，如果丢失了redo数据，恢复将是不完全的，必须重新创建涉及的表空间、可以采用以下的步骤恢复：<BR>　　　1、关闭数据库<BR>　　　2、startup mount数据库<BR>　　　3、离线删除涉及的数据文件<BR>　　　4、打开数据库<BR>　　　5、删除用户的表空间，包括其中的内容、<BR>　　　6、通过全数据库备份重新创建表空间和其中的对象</P>
<P>　　要注意的是活动的事务将会丢失</P>
<P>　　事件10：丢失存档的Redo log文件</P>
<P>　　如果存档的redo log文件丢失，应该马上进行一次冷备份、最好也进行一次全数据库导出、没有丢失的存档redo log文件的任何恢复都将是不完全的。</P>
<P>　　事件11：丢失活动的回滚段</P>
<P>　　这里指的是丢失一个回滚段的一个数据文件、这是一个危急的恢复过程，它主要是在于保存活动的事务。这里假定数据库已经起来，而你想保存当前运行的事务。要使用以下的恢复过程，数据库必须运行在archivelog模式下。</P>
<P>　　可以使用以下步骤恢复：<BR>　　　1、不要关闭数据库、对于这种事件，数据库启动比关闭更容易解决问题、<BR>　　　2、令属于该数据文件中的全部回滚段离线<BR>　　　3、删除全部离线的回滚段<BR>　　　4、在上面的第2步中，如果回滚段中有活动的事务，你将不能令它离线、可运行以下的查询来查看哪些事物是活动的：</P>
<P>SELECT SEGMENT_NAME, XACTS ACTIVE_TX, V.STATUS<BR>FROM V$ROLLSTAT V, DBA_ROLLBACK_SEGS<BR>WHERE TABLESPACE_NAME = 'tablespace_name' AND<BR>SEGMENT_ID = USN;</P>
<P>　　如果上面的查询没有结果，那么所有的回滚段都是离线的，但是，如果上面的查询返回一行或者多行，并且其状态为PENDING OFFLINE，那么可检查这些回滚段的ACTIVE_TX列、带有0值的回滚段将很快会离线；但是，非0的值表示上面有活动的事务，它们需要被提交或者回滚。</P>
<P>　　　5、处理活动的事务、执行以下的查询来查看哪些用户的事务被指派到该回滚段：</P>
<P>SELECT S.SID, S.SERIAL#, S.USERNAME, R.NAME "ROLLBACK"<BR>FROM V$SESSION S, V$TRANSACTION T, V$ROLLNAME R<BR>WHERE R.NAME IN ('pending_rollback1','pending_rollback2', .... 'pending_rollbackN') AND<BR>S.TADDR = T.ADDR AND<BR>T.XIDUSN = R.USN;</P>
<P>　　在知道哪些用户在“pending offline”的回滚段上有活动的事务后，可以要求他们提交或者回滚他们的事务，或者可以使用以下的命令杀掉它们的进程：</P>
<P>　　　ALTER SYSTEM KILL SESSION sid, serial#;</P>
<P>　　　6、在你处理完所有活动的事务后，执行以下的步骤：</P>
<P>　　　　丢弃表空间及其中的全部内容<BR>　　　　重新创建回滚表空间<BR>　　　　重新创建回滚段，并且令它们在线</P>
<P>　　事件12：丢失全部的回滚段</P>
<P>　　在这种事件下，将丢失全部活动的事务，并且需要重新创建回滚段。这样大的问题可能是由于一个硬件问题造成的，可以采用以下的步骤恢复：<BR>　　　1、关闭数据库<BR>　　　2、使用DBVERIFY验证全部的数据文件<BR>　　　3、解决其它的硬件问题或者数据文件损坏<BR>　　　4、以startup mount的方式启动数据库实例<BR>　　　5、在数据库上执行媒体恢复　<BR>　　　6、打开数据库<BR>　　　7、按需要创建新的回滚段</P>
<P>　　事件13：导出文件损坏</P>
<P>　　如果导出文件不能用了，那么应该冷备份数据库并且进行一个全的数据库导出、这是假定数据库自身没有问题、如果数据库也损坏了，那么应该执行以下的步骤：<BR>　　　1、ORA-1157错误信息通常都表示一个或者多个的数据文件损坏了。查明哪些表受到影响，它们应该是错误信息中指明的数据文件中的表格<BR>　　　2、跳过坏的数据块，将数据由表格中选择到临时表格中、<BR>　　　3、丢弃损坏的表<BR>　　　4、将临时表重命名为丢弃的表<BR>　　　5、重新建立受影响表上的全部索引<BR>　　　6、使用VALIDATE STRUCTURE CASCADE的选项来分析全部损坏的表<BR>　　要注意的是损坏块中数据将会丢失并且不能恢复</P>
<P>　　事件14：在热备份时关机</P>
<P>　　如果在热备份正在进行的时候突然关机，其中的一些表空间将可能处在备份模式、当你尝试打开数据库时，它将只能mount，并且指示某些表空间处于热备份模式、由于数据库不能打开，你将不能让表空间脱离热备份模式、你可以使用以下的步骤恢复：<BR>　　　1、startup mount数据库<BR>　　　2、查询v$backup以查看哪些数据文件处于ACTIVE状态、<BR>　　　3、通过使用命令ALTER DATABASE DATAFILE END BACKUP.来将这些数据文件脱离备份模式<BR>　　　4、打开数据库</P>
<P>　　事件15：恢复到某个特别的时间点</P>
<P>　　以下的步骤可用来执行point-in-time恢复<BR>　　　1、关闭数据库实例<BR>　　　2、以NOMOUNT的状态启动数据库实例<BR>　　　3、使用UNTIL的选项来恢复数据库<BR>　　　4、打开数据库<BR>　　　5、Shutdown NORMAL <BR>　　　6、启动数据库实例</P>
<P>　　事件16：恢复到一个特别的事件或者活动</P>
<P>　　可以使用以下的步骤来恢复：<BR>　　　1、关闭数据库实例<BR>　　　2、以NOMOUNT状态启动数据库实例；<BR>　　　3、使用UNTIL CANCEL来恢复数据库，提供存档的redo log文件请求直到该活动/事件为止<BR>　　　4、输入CANCEL来取消恢复<BR>　　　5、打开数据库；<BR>　　　6、使用NORMAL的模式来关闭数据库<BR>　　　7、启动数据库实例</P>
<P>　　结论</P>
<P>　　高可用性对于任何的商业都是很重要的，ORACLE DBA可以通过一些计划以确保停机时间最小化、这篇文章讨论了不同的策略可以达到这个目的。</P>
<P>&nbsp;</P><img src ="http://www.blogjava.net/sgsoft/aggbug/996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-04 00:11 <a href="http://www.blogjava.net/sgsoft/articles/996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>了解Oracle数据库中的系统参数</title><link>http://www.blogjava.net/sgsoft/articles/995.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Thu, 03 Feb 2005 16:10:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/995.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/995.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/995.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/995.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/995.html</trackback:ping><description><![CDATA[<H2 align=center>了解Oracle数据库中的系统参数</H2>
<P>Oracle数据库系统根据初始化参数文件init.ora中设置的参数来配置自身的启动，每个实例在启动之前，首先读取这些参数文件中设置的不同参数。Oracle系统中的参数，根据系统使用情况可以简单分为两大类，普通参数，也就是Oracle系统正常使用的一些参数，另外一类就是特殊参数，包括三种，过时参数、强调参数和隐藏参数。随着Oracle数据库新版本的发布，相应每次都会增加或者删除一些参数。如何查询当前版本数据库系统的参数情况以及当前系统版本相对于以前版本增加或者丢弃的那些参数呢？本文将详细介绍如何查询当前系统版本中的各种参数情况。</P>
<P>一、过时参数和强调参数</P>
<P>Oracle数据库中，系统提供了几个视图可以查看系统参数的情况。视图V$OBSOLETE_PARAMETER中含有所有的过时(obsolete)和强调(underscored)参数。这里首先说明一下什么是Oracle的过时(obsolote)和强调(underscored)参数，过时参数，顾名思义就是在Oracle以前的版本中存在，但在新版本中已经淘汰了的参数，已经不再使用；而强调参数，是指那些在新版本中保留了下来，但是除非特殊需要不希望用户使用的那些参数。在视图V$OBSOLETE_PARAMETER中，包含这些参数的名称和一个标志字ISSPECIFIED，该标志字用来指出这个参数是否在init.ora文件中已实际设置。</P>
<P>下面的SQL脚本列出了当前系统中所有的过时参数名称以及它们是否在当前系统中设定。</P>
<P>SQL&gt; COL name format a50;<BR>SQL&gt; SELECT name, isspecified FROM v$obsolete_parameter;</P>
<P>上面谈到，Oracle系统并没有将V$OBSOLETE_PARAMETER视图中的所有参数均丢弃，而是将其中的一部分转换为强调参数，下面就来讨论如何查看这些参数是已被丢弃还是被转换。这可以通过系统视图X$KSPPO来查看，该视图中包含一个名为KSPPOFLAG的字段，用来指明该参数在当前版本中是被丢弃还是被强调，如果该值为1，则表示该参数已被丢弃，该值为2，则表明该参数现为强调参数。</P>
<P>SELECT kspponm, <BR>DECODE(ksppoflg, 1,"Obsolete", 2, "Underscored") <BR>FROM x$ksppo <BR>ORDER BY kspponm;</P>
<P>注：该视图只在sys用户下可以看到。</P>
<P>二、隐藏参数</P>
<P>Oracle系统中还有一类参数称之为隐藏参数(hidden parameters)，是系统中使用，但Oracle官方没有公布的参数，这些参数可能是那些还没有成熟或者是系统开发中使用的参数。这些参数在所有Oracle官方提供的文档中都没有介绍，他们的命名有一个共同特征就是都以"_"作为参数的首字符，诸如Oracle 8i中的_trace_files_public和_lock_sga_areas等等。</P>
<P>下面的查询可以得到当前系统中的所有隐藏参数(以sys身份登录)：</P>
<P>SELECT ksppinm, ksppstvl, ksppdesc <BR>FROM x$ksppi x, x$ksppcv y <BR>WHERE x.indx = y.indx <BR>AND translate(ksppinm,"_","#") like "#%";</P>
<P>三、系统当前参数</P>
<P>下面的脚本以英文字母顺序列出了系统当前使用的所有参数。在列出的参数中，如果参数名称前面有#这个符号，则表示该参数没有明确指定，采用了系统中的默认参数。一般在一个新的Oracle版本安装完成后，首先运行该脚本，则可以生成该版本数据库的标准init.ora文件。</P>
<P>SET pagesize 9000 <BR>SET head OFF <BR>SET term OFF <BR>SELECT <BR>DECODE(isdefault, "TRUE", "# ") || <BR>DECODE(isdefault, "TRUE", RPAD(name,43), RPAD(name,45)) || <BR>" = " || value <BR>FROM v$parameter <BR>ORDER BY name;&nbsp;&nbsp;</P>
<P>注意：上面的SQL脚本没有列出系统中的隐藏参数。 </P>
<P>&nbsp;</P><img src ="http://www.blogjava.net/sgsoft/aggbug/995.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-04 00:10 <a href="http://www.blogjava.net/sgsoft/articles/995.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用正规表达式编写更好的 SQL --oracle 10g</title><link>http://www.blogjava.net/sgsoft/articles/994.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Thu, 03 Feb 2005 16:08:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/994.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/994.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/994.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/994.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/994.html</trackback:ping><description><![CDATA[<H3 align=center>Oracle Database 10g 内幕</H3>
<H2 align=center>使用正规表达式编写更好的 SQL </H2>
<P>作者：Alice Rischert</P>
<P><EM><STRONG>Oracle Database 10g 中的正规表达式特性是一个用于处理文本数据的强大工具</STRONG></EM> </P>
<P>Oracle Database 10g 的一个新特性大大提高了您搜索和处理字符数据的能力。这个特性就是正规表达式，是一种用来描述文本模式的表示方法。很久以来它已在许多编程语言和大量 UNIX 实用工具中出现过了。 </P>
<P>Oracle 的正规表达式的实施是以各种 SQL 函数和一个 WHERE 子句操作符的形式出现的。如果您不熟悉正规表达式，那么这篇文章可以让您了解一下这种新的极其强大然而表面上有点神秘的功能。已经对正规表达式很熟悉的读者可以了解如何在 Oracle SQL 语言的环境中应用这种功能。 </P>
<H3>什么是正规表达式？</H3>
<P>正规表达式由一个或多个字符型文字和/或元字符组成。在最简单的格式下，正规表达式仅由字符文字组成，如正规表达式 cat。它被读作字母 c，接着是字母 a 和 t，这种模式匹配 cat、location 和 catalog 之类的字符串。元字符提供算法来确定 Oracle 如何处理组成一个正规表达式的字符。当您了解了各种元字符的含义时，您将体会到正规表达式用于查找和替换特定的文本数据是非常强大的。 </P>
<P>验证数据、识别重复关键字的出现、检测不必要的空格，或分析字符串只是正规表达式的许多应用中的一部分。您可以用它们来验证电话号码、邮政编码、电子邮件地址、社会安全号码、IP 地址、文件名和路径名等的格式。此外，您可以查找如 HTML 标记、数字、日期之类的模式，或任意文本数据中符合任意模式的任何事物，并用其它的模式来替换它们。 </P>
<H3>用 Oracle Database 10g 使用正规表达式</H3>
<P>您可以使用最新引进的 Oracle SQL REGEXP_LIKE 操作符和 REGEXP_INSTR、REGEXP_SUBSTR 以及 REGEXP_REPLACE 函数来发挥正规表达式的作用。您将体会到这个新的功能如何对 LIKE 操作符和 INSTR、SUBSTR 和 REPLACE 函数进行了补充。实际上，它们类似于已有的操作符，但现在增加了强大的模式匹配功能。被搜索的数据可以是简单的字符串或是存储在数据库字符列中的大量文本。正规表达式让您能够以一种您以前从未想过的方式来搜索、替换和验证数据，并提供高度的灵活性。</P>
<H3>正规表达式的基本例子</H3>
<P>在使用这个新功能之前，您需要了解一些元字符的含义。句号 (.) 匹配一个正规表达式中的任意字符（除了换行符）。例如，正规表达式 a.b 匹配的字符串中首先包含字母 a，接着是其它任意单个字符（除了换行符），再接着是字母 b。字符串 axb、xaybx 和 abba 都与之匹配，因为在字符串中隐藏了这种模式。如果您想要精确地匹配以 a 开头和以 b 结尾的一条三个字母的字符串，则您必须对正规表达式进行定位。脱字符号 (^) 元字符指示一行的开始，而美元符号 ($) 指示一行的结尾（参见<A href="http://oraasp.vicp.net/article/article.aspx?id=108#t1">表 1</A>）。因此， 正规表达式 ^a.b$ 匹配字符串 aab、abb 或 axb。将这种方式与 LIKE 操作符提供的类似的模式匹配 a_b 相比较，其中 (_) 是单字符通配符。 </P>
<P>默认情况下，一个正规表达式中的一个单独的字符或字符列表只匹配一次。为了指示在一个正规表达式中多次出现的一个字符，您可以使靡桓隽看剩脖怀莆馗床僮鞣?如果您想要得到从字母 a 开始并以字母 b 结束的匹配模式，则您的正规表达式看起来像这样：^a.*b$。* 元字符重复前面的元字符 (.) 指示的匹配零次、一次或更多次。LIKE 操作符的等价的模式是 a%b，其中用百分号 (%) 来指示任意字符出现零次、一次或多次。 </P>
<P><A href="http://oraasp.vicp.net/article/article.aspx?id=108#t2">表 2 </A>给出了重复操作符的完整列表。注意它包含了特殊的重复选项，它们实现了比现有的 LIKE 通配符更大的灵活性。如果您用圆括号括住一个表达式，这将有效地创建一个可以重复一定次数的子表达式。例如，正规表达式 b(an)*a 匹配 ba、bana、banana、yourbananasplit 等。 </P>
<P>Oracle 的正规表达式实施支持 POSIX （可移植操作系统接口）字符类，参见<A href="http://oraasp.vicp.net/article/article.aspx?id=108#t3">表 3 </A>中列出的内容。这意味着您要查找的字符类型可以非常特别。假设您要编写一条仅查找非字母字符的 LIKE 条件 — 作为结果的 WHERE 子句可能不经意就会变得非常复杂。 </P>
<P>POSIX 字符类必须包含在一个由方括号 ([]) 指示的字符列表中。例如，正规表达式 [[:lower:]] 匹配一个小写字母字符，而 [[:lower:]]{5} 匹配五个连续的小写字母字符。 </P>
<P>除 POSIX 字符类之外，您可以将单独的字符放在一个字符列表中。例如，正规表达式 ^ab[cd]ef$ 匹配字符串 abcef 和 abdef。必须选择 c 或 d。 </P>
<P>除脱字符 (^) 和连字符 (-) 之外，字符列表中的大多数元字符被认为是文字。正规表达式看起来很复杂，这是因为一些元字符具有随上下文环境而定的多重含义。^ 就是这样一种元字符。如果您用它作为一个字符列表的第一个字符，它代表一个字符列表的非。因此，[^[:digit:]] 查找包含了任意非数字字符的模式，而 ^[[:digit:]] 查找以数字开始的匹配模式。连字符 (-) 指示一个范围，正规表达式 [a-m] 匹配字母 a 到字母 m 之间的任意字母。但如果它是一个字符行中的第一个字符（如在 [-afg] 中），则它就代表连字符。 </P>
<P>之前的一个例子介绍了使用圆括号来创建一个子表达式；它们允许您通过输入更替元字符来输入可更替的选项，这些元字符由竖线 (|) 分开。 </P>
<P>例如，正规表达式 t(a|e|i)n 允许字母 t 和 n 之间的三种可能的字符更替。匹配模式包括如 tan、ten、tin 和 Pakistan 之类的字，但不包括 teen、mountain 或 tune。作为另一种选择，正规表达式 t(a|e|i)n 也可以表示为一个字符列表 t[aei]n。<A href="http://oraasp.vicp.net/article/article.aspx?id=108#t4">表 4 </A>汇总了这些元字符。虽然存在更多的元字符，但这个简明的概述足够用来理解这篇文章使用的正规表达式。 </P>
<H3>REGEXP_LIKE 操作符</H3>
<P>REGEXP_LIKE 操作符向您介绍在 Oracle 数据库中使用时的正规表达式功能。<A href="http://oraasp.vicp.net/article/article.aspx?id=108#t5">表 5 </A>列出了 REGEXP_LIKE 的语法。 </P>
<P>下面的 SQL 查询的 WHERE 子句显示了 REGEXP_LIKE 操作符，它在 ZIP 列中搜索满足正规表达式 [^[:digit:]] 的模式。它将检索 ZIPCODE 表中的那些 ZIP 列值包含了任意非数字字符的行。 </P><PRE>SELECT zip FROM zipcode WHERE REGEXP_LIKE(zip, '[^[:digit:]]')
 
  ZIP
  -----
  ab123
  123xy
  007ab
  abcxy</PRE>
<P>这个正规表达式的例子仅由元字符组成，更具体来讲是被冒号和方括号分隔的 POSIX 字符类 digit。第二组方括号（如 [^[:digit:]] 中所示）包括了一个字符类列表。如前文所述，需要这样做是因为您只可以将 POSIX 字符类用于构建一个字符列表。</P>
<H3>REGEXP_INSTR 函数</H3>
<P>这个函数返回一个模式的起始位置，因此它的功能非常类似于 INSTR 函数。新的 REGEXP_INSTR 函数的语法在<A href="http://oraasp.vicp.net/article/article.aspx?id=108#t6">表 6 </A>中给出。这两个函数之间的主要区别是，REGEXP_INSTR 让您指定一种模式，而不是一个特定的搜索字符串；因而它提供了更多的功能。接下来的示例使用 REGEXP_INSTR 来返回字符串 Joe Smith, 10045 Berry Lane, San Joseph, CA 91234 中的五位邮政编码模式的起始位置。如果正规表达式被写为 [[:digit:]]{5}，则您将得到门牌号的起始位置而不是邮政编码的，因为 10045 是第一次出现五个连续数字。因此，您必须将表达式定位到该行的末尾，正如 $ 元字符所示，该函数将显示邮政编码的起始位置，而不管门牌号的数字个数。 </P><PRE>SELECT REGEXP_INSTR('Joe Smith, 10045 Berry Lane, San Joseph, CA 91234', 
    '[[:digit:]]{5}$') AS rx_instr FROM dual
 
  RX_INSTR
  ----------
  45 </PRE>
<H3>编写更复杂的模式</H3>
<P>让我们在前一个例子的邮政编码模式上展开，以便包含一个可选的四位数字模式。您的模式现在可能看起来像这样：[[:digit:]]{5}(-[[:digit:]]{4})?$。如果您的源字符串以 5 位邮政编码或 5 位 + 4 位邮政编码的格式结束，则您将能够显示该模式的起始位置。 </P><PRE>SELECT REGEXP_INSTR('Joe Smith, 10045 Berry Lane, San Joseph, CA 91234-1234',
  ' [[:digit:]]{5}(-[[:digit:]]{4})?$') AS starts_at FROM dual
 
  STARTS_AT
  ----------
  44 </PRE>
<P>在这个示例中，括弧里的子表达式 (-[[:digit:]]{4}) 将按 ? 重复操作符的指示重复零次或一次。此外，企图用传统的 SQL 函数来实现相同的结果甚至对 SQL 专家也是一个挑战。为了更好地说明这个正规表达式示例的不同组成部分，<A href="http://oraasp.vicp.net/article/article.aspx?id=108#t7">表 7 </A>包含了一个对单个文字和元字符的描述。 </P>
<H3>REGEXP_SUBSTR 函数</H3>
<P>类似于 SUBSTR 函数的 REGEXP_SUBSTR 函数用来提取一个字符串的一部分。<A href="http://oraasp.vicp.net/article/article.aspx?id=108#t8">表 8 </A>显示了这个新函数的语法。在下面的示例中，匹配模式 [^,]* 的字符串将被返回。该正规表达式搜索其后紧跟着空格的一个逗号；然后按 [^,]* 的指示搜索零个或更多个不是逗号的字符，最后查找另一个逗号。这种模式看起来有点像一个用逗号分隔的值字符串。 </P><PRE>SELECT REGEXP_SUBSTR('first field, second field , third field',  ', [^,]*,') FROM dual
 
  REGEXP_SUBSTR('FIR
  ------------------
  , second field , </PRE>
<H3>REGEXP_REPLACE 函数</H3>
<P>让我们首先看一下传统的 REPLACE SQL 函数，它把一个字符串用另一个字符串来替换。假设您的数据在正文中有不必要的空格，您希望用单个空格来替换它们。利用 REPLACE 函数，您需要准确地列出您要替换多少个空格。然而，多余空格的数目在正文的各处可能不是相同的。下面的示例在 Joe 和 Smith 之间有三个空格。REPLACE 函数的参数指定要用一个空格来替换两个空格。在这种情况下，结果在原来的字符串的 Joe 和 Smith 之间留下了一个额外的空格。 </P><PRE>SELECT REPLACE('Joe Smith',' ', ' ') AS replace FROM dual
 
  REPLACE
  ---------
  Joe Smith </PRE>
<P>REGEXP_REPLACE 函数把替换功能向前推进了一步，其语法在<A href="http://oraasp.vicp.net/article/article.aspx?id=108#t9">表 9 </A>中列出。以下查询用单个空格替换了任意两个或更多的空格。( ) 子表达式包含了单个空格，它可以按 {2,} 的指示重复两次或更多次。 </P><PRE>SELECT REGEXP_REPLACE('Joe Smith',  '( ){2,}', ' ') AS RX_REPLACE FROM dual

  RX_REPLACE
  ----------
  Joe Smith </PRE><A name=back>
<H3>后向引用</H3></A>
<P>正则表达式的一个有用的特性是能够存储子表达式供以后重用；这也被称为后向引用（在<A href="http://oraasp.vicp.net/article/article.aspx?id=108#t10">表 10 </A>中对其进行了概述）。它允许复杂的替换功能，如在新的位置上交换模式或显示重复出现的单词或字母。子表达式的匹配部分保存在临时缓冲区中。缓冲区从左至右进行编号，并利用 \digit 符号进行访问，其中 digit 是 1 到 9 之间的一个数字，它匹配第 digit 个子表达式，子表达式用一组圆括号来显示。 </P>
<P>接下来的例子显示了通过按编号引用各个子表达式将姓名 Ellen Hildi Smith 转变为 Smith, Ellen Hildi。 </P><PRE>SELECT REGEXP_REPLACE(
  'Ellen Hildi Smith',
  '(.*) (.*) (.*)', '\3, \1 \2')
  FROM dual
 
  REGEXP_REPLACE('EL
  ------------------
  Smith, Ellen Hildi </PRE>
<P>该 SQL 语句显示了用圆括号括住的三个单独的子表达式。每一个单独的子表达式包含一个匹配元字符 (.)，并紧跟着 * 元字符，表示任何字符（除换行符之外）都必须匹配零次或更多次。空格将各个子表达式分开，空格也必须匹配。圆括号创建获取值的子表达式，并且可以用 \digit 来引用。第一个子表达式被赋值为 \1 ，第二个 \2，以此类推。这些后向引用被用在这个函数的最后一个参数 (\3, \1 \2) 中，这个函数有效地返回了替换子字符串，并按期望的格式来排列它们（包括逗号和空格）。<A href="http://oraasp.vicp.net/article/article.aspx?id=108#t11">表 11 </A>详细说明了该正则表达式的各个组成部分。 </P>
<P>后向引用对替换、格式化和代替值非常有用，并且您可以用它们来查找相邻出现的值。接下来的例子显示了使用 REGEP_SUBSTR 函数来查找任意被空格隔开的重复出现的字母数字值。显示的结果给出了识别重复出现的单词 is 的子字符串。 </P><PRE>SELECT REGEXP_SUBSTR(
  'The final test is is the implementation',
  '([[:alnum:]]+)([[:space:]]+)\1') AS substr
  FROM dual
 
  SUBSTR
  ------
  is is </PRE>
<H3>匹配参数选项</H3>
<P>您可能已经注意到了正则表达式操作符和函数包含一个可选的匹配参数。这个参数控制是否区分大小写、换行符的匹配和保留多行输入。 </P>
<H3>正则表达式的实际应用 </H3>
<P>您不仅可以在队列中使用正则表达式，还可以在使用 SQL 操作符或函数的任何地方（比如说在 PL/SQL 语言中）使用正则表达式。您可以编写利用正则表达式功能的触发器，以验证、生成或提取值。 </P>
<P>接下来的例子演示了您如何能够在一次列检查约束条件中应用 REGEXP_LIKE 操作符来进行数据验证。它在插入或更新时检验正确的社会保险号码格式。如 123-45-6789 和 123456789 之类格式的社会保险号码对于这种列约束条件是可接受的值。有效的数据必须以三个数字开始，紧跟着一个连字符，再加两个数字和一个连字符，最后又是四个数字。另一种表达式只允许 9 个连续的数字。竖线符号 (|) 将各个选项分开。 </P><PRE>ALTER TABLE students
  ADD CONSTRAINT stud_ssn_ck CHECK
  (REGEXP_LIKE(ssn,
  '^([[:digit:]]{3}-[[:digit:]]{2}-[[:digit:]]{4}|[[:digit:]]{9})$'))</PRE>
<P>由 ^ 和 $ 指示的开头或结尾的字符都是不可接受的。确保您的正则表达式没有分成多行或包含任何不必要的空格，除非您希望格式如此并相应地进行匹配。<A href="http://oraasp.vicp.net/article/article.aspx?id=108#t12">表 12 </A>说明了该正则表达式示例的各个组成部分。</P>
<H3>将正则表达式与现有的功能进行比较</H3>
<P>正则表达式有几个优点优于常见的 LIKE 操作符和 INSTR、SUBSTR 及 REPLACE 函数的。这些传统的 SQL 函数不便于进行模式匹配。只有 LIKE 操作符通过使用 % 和 _ 字符匹配，但 LIKE 不支持表达式的重复、复杂的更替、字符范围、字符列表和 POSIX 字符类等等。此外，新的正则表达式函数允许检测重复出现的单词和模式交换。这里的例子为您提供了正则表达式领域的一个概览，以及您如何能够在您的应用程序中使用它们。 </P>
<H3>实实在在地丰富您的工具包</H3>
<P>因为正则表达式有助于解决复杂的问题，所以它们是非常强大的。正则表达式的一些功能难于用传统的 SQL 函数来仿效。当您了解了这种稍显神秘的语言的基础构建程序块时，正则表达式将成为您的工具包的不可缺少的一部分（不仅在 SQL 环境下也在其它的编程语言环境下）。为了使您的各个模式正确，虽然尝试和错误有时是必须的，但正则表达式的简洁和强大是不容置疑的。 </P>
<P><EM><B>Alice Rischert</B> (<A href="mailto:ar280@yahoo.com">ar280@yahoo.com</A>) 是哥伦比亚大学计算机技术与应用系的数据库应用程序开发和设计方向的主席。她编写了 <A href="http://www.amazon.com/exec/obidos/tg/detail/-/0131002775/qid=1060735468/sr=1-2/ref=sr_1_2/002-8332797-9003230?v=glance&amp;s=books" target=_blank>Oracle SQL 交互手册 第 2 版</A>（Prentice Hall，2002）和即将推出的 <A href="http://www.amazon.com/exec/obidos/tg/detail/-/0131451316/qid=1060735383/sr=1-2/ref=sr_1_2/002-8332797-9003230?v=glance&amp;s=books" target=_blank>Oracle SQL 示例</A> （Prentice Hall，2003）。Rischert 拥有超过 15 年的经验在财富 100 强公司内担任数据库设计师、DBA 和项目主管，并且她自从 Oracle version 5 起就一直使用 Oracle 产品。</EM></P>
<P><A name=t1>表 1：定位元字符</A></P>
<TABLE cellPadding=5 width="100%" align=center bgColor=#f7f7e7 border=1 hspace="5" vspace="5">
<TBODY>
<TR>
<TD>元字符</TD>
<TD>说明</TD></TR>
<TR bgColor=#ffffff>
<TD><TT>^</TT></TD>
<TD>使表达式定位至一行的开头</TD></TR>
<TR>
<TD><TT>$</TT></TD>
<TD>使表达式定位至一行的末尾</TD></TR></TBODY></TABLE>
<P></P>
<P><A name=t2>表 2：量词或重复操作符</A> 
<TABLE cellPadding=5 width="100%" align=center bgColor=#f7f7e7 border=1 hspace="5" vspace="5">
<TBODY>
<TR>
<TD>量词</TD>
<TD>说明</TD></TR>
<TR bgColor=#ffffff>
<TD><TT>*</TT></TD>
<TD>匹配 0 次或更多次</TD></TR>
<TR>
<TD><TT>?</TT></TD>
<TD>匹配 0 次或 1 次</TD></TR>
<TR bgColor=#ffffff>
<TD><TT>+</TT></TD>
<TD>匹配 1 次或更多次</TD></TR>
<TR>
<TD><TT>{m}</TT></TD>
<TD>正好匹配 <I>m</I> 次</TD></TR>
<TR bgColor=#ffffff>
<TD><TT>{m,}</TT></TD>
<TD>至少匹配 <I>m</I> 次</TD></TR>
<TR>
<TD><TT>{m, n}</TT></TD>
<TD>至少匹配 <I>m</I> 次但不超过 <I>n</I> 次</TD></TR></TBODY></TABLE>
<P></P>
<P><A name=t3>表 3：预定义的 POSIX 字符类</A> 
<TABLE cellPadding=5 width="100%" align=center bgColor=#f7f7e7 border=1 hspace="5" vspace="5">
<TBODY>
<TR>
<TD>字符类</TD>
<TD>说明</TD></TR>
<TR bgColor=#ffffff>
<TD><TT>[:alpha:]</TT></TD>
<TD>字母字符</TD></TR>
<TR>
<TD><TT>[:lower:]</TT></TD>
<TD>小写字母字符</TD></TR>
<TR bgColor=#ffffff>
<TD><TT>[:upper:]</TT></TD>
<TD>大写字母字符</TD></TR>
<TR>
<TD><TT>[:digit:]</TT></TD>
<TD>数字</TD></TR>
<TR bgColor=#ffffff>
<TD><TT>[:alnum:]</TT></TD>
<TD>字母数字字符</TD></TR>
<TR>
<TD><TT>[:space:]</TT></TD>
<TD>空白字符（禁止打印），如回车符、换行符、竖直制表符和换页符</TD></TR>
<TR bgColor=#ffffff>
<TD><TT>[:punct:]</TT></TD>
<TD>标点字符</TD></TR>
<TR>
<TD><TT>[:cntrl:]</TT></TD>
<TD>控制字符（禁止打印）</TD></TR>
<TR bgColor=#ffffff>
<TD><TT>[:print:]</TT></TD>
<TD>可打印字符</TD></TR></TBODY></TABLE>
<P></P>
<P><A name=t4>表 4：表达式的替换匹配和分组</A> 
<TABLE cellPadding=5 width="100%" align=center bgColor=#f7f7e7 border=1 hspace="5" vspace="5">
<TBODY>
<TR>
<TD colSpan=2>元字符</TD>
<TD>说明</TD></TR>
<TR bgColor=#ffffff>
<TD><TT>|</TT></TD>
<TD>替换</TD>
<TD>分隔替换选项，通常与分组操作符 <TT>()</TT> 一起使用</TD></TR>
<TR>
<TD><TT>( )</TT></TD>
<TD>分组</TD>
<TD>将子表达式分组为一个替换单元、量词单元或后向引用单元（参见“<A href="http://oraasp.vicp.net/article/article.aspx?id=108#back">后向引用</A>”部分）</TD></TR>
<TR bgColor=#ffffff>
<TD><TT>[char]</TT></TD>
<TD>字符列表</TD>
<TD>表示一个字符列表；一个字符列表中的大多数元字符（除字符类、<TT>^</TT> 和 <TT>-</TT> 元字符之外）被理解为文字</TD></TR></TBODY></TABLE>
<P></P>
<P><A name=t5>表 5：<TT>REGEXP_LIKE</TT> 操作符</A> 
<TABLE cellPadding=5 width="100%" align=center bgColor=#f7f7e7 border=1 hspace="5" vspace="5">
<TBODY>
<TR>
<TD>语法</TD>
<TD>说明</TD></TR>
<TR bgColor=#ffffff>
<TD><TT><NOBR>REGEXP_LIKE(source_string, pattern</NOBR><BR>[, match_parameter])</TT></TD>
<TD><TT>source_string</TT> 支持字符数据类型（<TT>CHAR、VARCHAR2、CLOB、NCHAR、NVARCHAR2</TT> 和 <TT>NCLOB</TT>，但不包括 <TT>LONG</TT>）。<TT>pattern</TT> 参数是正则表达式的另一个名称。<TT>match_parameter</TT> 允许可选的参数（如处理换行符、保留多行格式化以及提供对区分大小写的控制）。</TD></TR></TBODY></TABLE>
<P></P>
<P><A name=t6>表 6：<TT>REGEXP_INSTR</TT> 函数</A> 
<TABLE cellPadding=5 width="100%" align=center bgColor=#f7f7e7 border=1 hspace="5" vspace="5">
<TBODY>
<TR>
<TD>语法</TD>
<TD>说明</TD></TR>
<TR bgColor=#ffffff>
<TD><TT><NOBR>REGEXP_INSTR(source_string, pattern</NOBR><BR>[, start_position<BR>[, occurrence<BR>[, return_option<BR>[, match_parameter]]]])</TT></TD>
<TD>该函数查找 <TT>pattern </TT>，并返回该模式的第一个位置。您可以随意指定您想要开始搜索的 <TT>start_position</TT>。 <TT>occurrence</TT> 参数默认为 1，除非您指定您要查找接下来出现的一个模式。<TT>return_option</TT> 的默认值为 0，它返回该模式的起始位置；值为 1 则返回符合匹配条件的下一个字符的起始位置。</TD></TR></TBODY></TABLE>
<P></P>
<P><A name=t7>表 7： 5 位数字加 4 位邮政编码表达式的说明</A> 
<TABLE cellPadding=5 width="100%" align=center bgColor=#f7f7e7 border=1 hspace="5" vspace="5">
<TBODY>
<TR>
<TD>语法</TD>
<TD>说明</TD></TR>
<TR bgColor=#ffffff>
<TD></TD>
<TD>必须匹配的空白</TD></TR>
<TR bgColor=#ffffff>
<TD><TT>[:digit:]</TT></TD>
<TD>POSIX 数字类 </TD></TR>
<TR>
<TD><TT>]</TT></TD>
<TD>字符列表的结尾 </TD></TR>
<TR bgColor=#ffffff>
<TD><TT>{5}</TT></TD>
<TD>字符列表正好重复出现 5 次</TD></TR>
<TR>
<TD><TT>(</TT></TD>
<TD>子表达式的开头 </TD></TR>
<TR bgColor=#ffffff>
<TD><TT>-</TT></TD>
<TD>一个文字连字符，因为它不是一个字符列表内的范围元字符</TD></TR>
<TR>
<TD><TT>[</TT></TD>
<TD>字符列表的开头 </TD></TR>
<TR bgColor=#ffffff>
<TD><TT>[:digit:]</TT></TD>
<TD>POSIX <TT>[:digit:]</TT>类</TD></TR>
<TR>
<TD><TT>[</TT></TD>
<TD>字符列表的开头 </TD></TR>
<TR bgColor=#ffffff>
<TD><TT>]</TT></TD>
<TD>字符列表的结尾</TD></TR>
<TR>
<TD><TT>{4}</TT></TD>
<TD>字符列表正好重复出现 4 次 </TD></TR>
<TR bgColor=#ffffff>
<TD><TT>)</TT></TD>
<TD>结束圆括号，结束子表达式 </TD></TR>
<TR>
<TD><TT>?</TT></TD>
<TD><TT>?</TT> 量词匹配分组的子表达式 0 或 1 次，从而使得 4 位代码可选</TD></TR>
<TR bgColor=#ffffff>
<TD><TT>$</TT></TD>
<TD>定位元字符，指示行尾</TD></TR></TBODY></TABLE>
<P></P>
<P><A name=t8>表 8：<TT>REGEXP_SUBSTR</TT> 函数</A> 
<TABLE cellPadding=5 width="100%" align=center bgColor=#f7f7e7 border=1 hspace="5" vspace="5">
<TBODY>
<TR>
<TD>语法</TD>
<TD>说明</TD></TR>
<TR bgColor=#ffffff>
<TD><TT><NOBR>REGEXP_SUBSTR(source_string, pattern</NOBR><BR>[, position [, occurrence<BR>[, match_parameter]]])</TT></TD>
<TD><TT>REGEXP_SUBSTR</TT> 函数返回匹配模式的子字符串。</TD></TR></TBODY></TABLE>
<P></P>
<P><A name=t9>表 9： <TT>REGEXP_REPLACE </TT>函数</A> 
<TABLE cellPadding=5 width="100%" align=center bgColor=#f7f7e7 border=1 hspace="5" vspace="5">
<TBODY>
<TR>
<TD>语法</TD>
<TD>说明</TD></TR>
<TR bgColor=#ffffff>
<TD><TT><NOBR>REGEXP_REPLACE(source_string, pattern</NOBR><BR>[, replace_string [, position<BR>[,occurrence, [match_parameter]]]])</TT></TD>
<TD>该函数用一个指定的 <TT>replace_string</TT> 来替换匹配的模式，从而允许复杂的“搜索并替换”操作。</TD></TR></TBODY></TABLE>
<P></P>
<P><A name=t10>表 10：后向引用元字符</A> 
<TABLE cellPadding=5 width="100%" align=center bgColor=#f7f7e7 border=1 hspace="5" vspace="5">
<TBODY>
<TR>
<TD colSpan=2>元字符</TD>
<TD>说明</TD></TR>
<TR bgColor=#ffffff>
<TD><TT>\digit</TT></TD>
<TD>反斜线</TD>
<TD>紧跟着一个 1 到 9 之间的数字，反斜线匹配之前的用括号括起来的第 digit 个子表达式。<BR>（注意：反斜线在正则表达式中有另一种意义，取决于上下文，它还可能表示 Escape 字符。</TD></TR></TBODY></TABLE>
<P></P>
<P><A name=t11>表 11：模式交换正则表达式的说明</A> 
<TABLE cellPadding=5 width="100%" align=center bgColor=#f7f7e7 border=1 hspace="5" vspace="5">
<TBODY>
<TR>
<TD>正则表达式项目</TD>
<TD>说明</TD></TR>
<TR bgColor=#ffffff>
<TD><TT>(</TT></TD>
<TD>第一个子表达式的开头 </TD></TR>
<TR>
<TD><TT>.</TT></TD>
<TD>匹配除换行符之外的任意单字符</TD></TR>
<TR bgColor=#ffffff>
<TD><TT>*</TT></TD>
<TD>重复操作符，匹配之前的 <TT>.</TT> 元字符 0 到 <I>n </I>次</TD></TR>
<TR>
<TD><TT>)</TT></TD>
<TD>第一个子表达式的结尾；匹配结果在 <TT>\1</TT><BR>中获取（在这个例子中，结果为 <TT>Ellen</TT>。）</TD></TR>
<TR bgColor=#ffffff>
<TD><TT></TT></TD>
<TD>必须存在的空白 </TD></TR>
<TR>
<TD><TT>(</TT></TD>
<TD>第二个子表达式的开头 </TD></TR>
<TR bgColor=#ffffff>
<TD><TT>.</TT></TD>
<TD>匹配除换行符之外的任意单个字符 </TD></TR>
<TR>
<TD><TT>*</TT></TD>
<TD>重复操作符，匹配之前的 <TT>.</TT> 元字符 0 到 <I>n </I>次</TD></TR>
<TR bgColor=#ffffff>
<TD><TT>)</TT></TD>
<TD>第二个子表达式的结尾；匹配结果在 <TT>\2</TT><BR>中获取（在这个例子中，结果为 <TT>Hildi</TT>。）</TD></TR>
<TR>
<TD><TT></TT></TD>
<TD>空白 </TD></TR>
<TR bgColor=#ffffff>
<TD><TT>(</TT></TD>
<TD>第三个子表达式的开头 </TD></TR>
<TR>
<TD><TT>.</TT></TD>
<TD>匹配除换行符之外的任意单字符 </TD></TR>
<TR bgColor=#ffffff>
<TD><TT>*</TT></TD>
<TD>重复操作符，匹配之前的 <TT>.</TT> 元字符 0 到 <I>n </I>次</TD></TR>
<TR>
<TD><TT>)</TT></TD>
<TD>第三个子表达式的结尾；匹配结果在 <TT>\3</TT><BR>中获取（在这个例子中，结果为 <TT>Smith</TT>。）</TD></TR></TBODY></TABLE>
<P></P>
<P><A name=t12>表 12：社会保险号码正则表达式的说明</A> 
<TABLE cellPadding=5 width="100%" align=center bgColor=#f7f7e7 border=1 hspace="5" vspace="5">
<TBODY>
<TR>
<TD>正则表达式项目</TD>
<TD>说明</TD></TR>
<TR bgColor=#ffffff>
<TD><TT>^</TT></TD>
<TD>行首字符（正则表达式在匹配之前不能有任何前导字符。）</TD></TR>
<TR>
<TD><TT>(</TT></TD>
<TD>开始子表达式并列出用 | 元字符分开的可替换选项</TD></TR>
<TR bgColor=#ffffff>
<TD><TT>[</TT></TD>
<TD>字符列表的开头</TD></TR>
<TR>
<TD><TT>[:digit:]</TT></TD>
<TD>POSIX 数字类 </TD></TR>
<TR bgColor=#ffffff>
<TD><TT>]</TT></TD>
<TD>字符列表的结尾 </TD></TR>
<TR>
<TD><TT>{3}</TT></TD>
<TD>字符列表正好重复出现 3 次 </TD></TR>
<TR bgColor=#ffffff>
<TD><TT>-</TT></TD>
<TD>连字符 </TD></TR>
<TR>
<TD><TT>[</TT></TD>
<TD>字符列表的开头 </TD></TR>
<TR bgColor=#ffffff>
<TD><TT>[:digit:]</TT></TD>
<TD>POSIX 数字类</TD></TR>
<TR>
<TD><TT>]</TT></TD>
<TD>字符列表的结尾 </TD></TR>
<TR bgColor=#ffffff>
<TD><TT>{2}</TT></TD>
<TD>字符列表正好重复出现 2 次 </TD></TR>
<TR>
<TD><TT>-</TT></TD>
<TD>另一个连字符 </TD></TR>
<TR bgColor=#ffffff>
<TD><TT>[</TT></TD>
<TD>字符列表的开头 </TD></TR>
<TR>
<TD><TT>[:digit:]</TT></TD>
<TD>POSIX 数字类 </TD></TR>
<TR bgColor=#ffffff>
<TD><TT>]</TT></TD>
<TD>字符列表的结尾 </TD></TR>
<TR>
<TD><TT>{4}</TT></TD>
<TD>字符列表正好重复出现 4 次 </TD></TR>
<TR bgColor=#ffffff>
<TD><TT>|</TT></TD>
<TD>替换元字符；结束第一个选项并开始下一个替换表达式</TD></TR>
<TR>
<TD><TT>[</TT></TD>
<TD>字符列表的开头 </TD></TR>
<TR bgColor=#ffffff>
<TD><TT>[:digit:]</TT></TD>
<TD>POSIX 数字类</TD></TR>
<TR>
<TD><TT>]</TT></TD>
<TD>字符列表的结尾</TD></TR>
<TR bgColor=#ffffff>
<TD><TT>{9}</TT></TD>
<TD>字符列表正好重复出现 9 次 </TD></TR>
<TR>
<TD><TT>)</TT></TD>
<TD>结束圆括号，结束用于替换的子表达式组</TD></TR>
<TR bgColor=#ffffff>
<TD><TT>$</TT></TD>
<TD>定位元字符，指示行尾；没有额外的字符能够符合模式</TD></TR></TBODY></TABLE></P><img src ="http://www.blogjava.net/sgsoft/aggbug/994.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-04 00:08 <a href="http://www.blogjava.net/sgsoft/articles/994.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle数据库数据对象分析</title><link>http://www.blogjava.net/sgsoft/articles/993.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Thu, 03 Feb 2005 16:07:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/993.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/993.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/993.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/993.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/993.html</trackback:ping><description><![CDATA[<H2 align=center>Oracle数据库数据对象分析</H2>
<P>Oracle数据库数据对象中最基本的是表和视图，其他还有约束、序列、函数、存储过程、包、触发器等。对数据库的操作可以基本归结为对数据对象的操作,理解和掌握Oracle数据库对象是学习Oracle的捷径。</P>
<H3>表和视图</H3>
<P>Oracle中表是数据存储的基本结构。ORACLE8引入了分区表和对象表，ORACLE8i引入了临时表，使表的功能更强大。视图是一个或多个表中数据的逻辑表达式。本文我们将讨论怎样创建和管理简单的表和视图。</P>
<H4>管理表</H4>
<P>表可以看作有行和列的电子数据表，表是关系数据库中一种拥有数据的结构。用CREATE TABLE语句建立表，在建立表的同时，必须定义表名，列，以及列的数据类型和大小。例如：</P>
<BLOCKQUOTE><PRE>CREATE TABLE products ( 
  PROD_ID NUMBER(4),
  PROD_NAME VAECHAR2(20),
  STOCK_QTY NUMBER(5,3)
); </PRE></BLOCKQUOTE>
<P>这样我们就建立了一个名为products的表， 关键词CREATE TABLE后紧跟的表名，然后定义了三列，同时规定了列的数据类型和大小。</P>
<P>在创建表的同时你可以规定表的完整性约束，也可以规定列的完整性约束，在列上普通的约束是NOT NULL,关于约束的讨论我们在以后进行。</P>
<P>在建立或更改表时，可以给表一个缺省值。缺省值是在增加行时，增加的数据行中某一项值为null时，oracle即认为该值为缺省值。</P>
<P>下列数据字典视图提供表和表的列的信息：</P>
<P>　　　. DBA_TABLES<BR>　　　. DBA_ALL_TABLES<BR>　　　. USER_TABLES<BR>　　　. USER_ALL_TABLES<BR>　　　. ALL_TABLES<BR>　　　. ALL_ALL_TABLES<BR>　　　. DBA_TAB_COLUMNS<BR>　　　. USER_TAB_COLUMNS<BR>　　　. ALL_TAB_COLUMNS</P>
<H5>表的命名规则</H5>
<P>表名标识一个表，所以应尽可能在表名中描述表，oracle中表名或列名最长可以达30个字符串。表名应该以字母开始，可以在表名中包含数字、下划线、#、$等。</P>
<H5>从其它表中建立表</H5>
<P>可以使用查询从基于一个或多个表中建立表，表的列的数据类型和大小有查询结果决定。建立这种形式的表的查询可以选择其他表中所有的列或者只选择部分列。在CREATE TABLE语句中使用关键字AS，例如:</P>
<BLOCKQUOTE><PRE>SQL&gt; CREATE TABLE emp AS SELECT * FROM employee
SQL&gt; CREATE TABLE Y AS SELECT * FROM X WHERE no=2 </PRE></BLOCKQUOTE>
<P>需要注意的是如果查询涉及LONG数据类型，那么CREATE TABLE....AS SELECT....将不会工作。</P>
<H5>更改表定义</H5>
<P>在建立表后，有时候我们可能需要修改表，比如更改列的定义，更改缺省值，增加新列，删除列等等。ORACLE使用ALTER TABLE语句来更改表的定义</P>
<P>1、增加列</P>
<P>语法：ALTER TABLE [schema.] table_name ADD column_definition </P>
<P>例：</P>
<BLOCKQUOTE><PRE>ALTER TABLE orders ADD order_date DATE;</PRE></BLOCKQUOTE>
<P>对于已经存在的数据行，新列的值将是NULL.</P>
<P>2、更改列</P>
<P>语法： ALTER TABLE [schema.] table_name MODIFY column_name new_attributes; </P>
<P>例：</P>
<BLOCKQUOTE><PRE>ALTER TABLE orders MODITY (quantity number(10,3),status varchar2(15)); </PRE></BLOCKQUOTE>
<P>这个例子中我们修改了表orders，将STATUS列的长度增加到15,将QUANTITY列减小到10,3;</P>
<P>修改列的规则如下： <BR>　　　. 可以增加字符串数据类型的列的长度，数字数据类型列的精度。<BR>　　　. 减少列的长度时，该列应该不包含任何值，所有数据行都为NULL.<BR>　　　. 改变数据类型时，该列的值必须是NULL.<BR>　　　. 对于十进制数字，可以增加或减少但不能降低他的精度。</P>
<P>3、删除数据列</P>
<P>优化ORACLE数据库，唯一的方法是删除列，重新建立数据库。在ORACLE8i中有很多方法删除列，你可以删除未用数据列或者可以标示该列为未用数据列然后删除。</P>
<P>语法：ALTER TABLE [schema.] table_name DROP {COLUM column_names | (column_names)}[CASCADE CONSTRAINS] </P>
<P>要注意的是在删除列时关于该列的索引和完整性约束也同时删除。注意关键字CASCADE CONSTRAINS，如果删除的列是多列约束的一部分，那么这个约束条件相对于其他列也同时删除。</P>
<P>如果用户担心在大型数据库中删除列要花太多时间，可以先将他们标记为未用数据列，标记未用数据列的语法如下：</P>
<P>ALTER TABLE [schema.] table_name SET UNUSED {COLUM column_names | (column_names)}[CASCADE CONSTRAINS] </P>
<P>这个语句将一个或多个数据列标记为未用数据列，但并不删除数据列中的数据，也不释放占用的磁盘空间。但是，未用数据列在视图和数据字典中并不显示，并且该数据列的名称将被删除，新的数据列可以使用这个名称。基于该数据列的索引、约束，统计等都将被删除。</P>
<P>删除未用数据列的语句是：</P>
<P>ALTER TABLE [schema.] table_name DROP {UNUSED COLUM | COLUMN CONTINUE} </P>
<H5>删除表和更改表名</H5>
<P>删除表非常简单，但它是一个不可逆转的行为。</P>
<P>语法： DROP TABLE [schema.] table_name [CASCADE CONSTRAINTS] </P>
<P>删除表后，表上的索引、触发器、权限、完整性约束也同时删除。ORACLE不能删除视图，或其他程序单元，但oracle将标示他们无效。如果删除的表涉及引用主键或唯一关键字的完整性约束时，那么DROP TABLE语句就必须包含CASCADE CONSTRAINTS子串。</P>
<H5>更改表名</H5>
<P>RENAME命令用于给表和其他数据库对象改名。ORACLE系统自动将基于旧表的完整性约束、索引、权限转移到新表中。ORACLE同时使所有基于旧表的数据库对象，比如视图、程序、函数等，为不合法。</P>
<P>语法：RENAME old_name TO new_name; </P>
<P>例：</P>
<BLOCKQUOTE><PRE>SQL&gt; RENAME orders TO purchase_orders;</PRE></BLOCKQUOTE>
<H5>截短表</H5>
<P>TRUNCATE命令与DROP命令相似， 但他不是删除整个数据表，所以索引、完整性约束、触发器、权限等都不会被删除。缺省情况下将释放部分表和视图空间，如果用户不希望释放表空间，TRUNCATE语句中要包含REUSE STORAGE子串。TRUNCATE命令语法如下：</P>
<P>TRUNCATE {TABLE|CLUSTER} [schema.] name {DROP|REUSE STORAGE} </P>
<P>例：</P>
<BLOCKQUOTE><PRE> SQL&gt; TRUNCATE TABLE t1; </PRE></BLOCKQUOTE>
<H4>管理视图</H4>
<P>视图是一个或多个表中的数据的简化描述，用户可以将视图看成一个存储查询（stored query)或一个虚拟表(virtual table).查询仅仅存储在oracle数据字典中，实际的数据没有存放在任何其它地方，所以建立视图不用消耗其他的空间。视图也可以隐藏复杂查询，比如多表查询，但用户只能看见视图。视图可以有与他所基于表的列名不同的列名。用户可以建立限制其他用户访问的视图。</P>
<H5>建立视图</H5>
<P>CREATE VIEW命令创建视图，定义视图的查询可以建立在一个或多个表，或其他视图上。查询不能有FOR UPDATE子串，在早期的ORACLE8i版本中不支持ORDER BY子串，现在的版本中CREATE VIEW可以拥有ORDER BY子串。</P>
<P>例：</P>
<BLOCKQUOTE><PRE>SQL&gt; CREATE VIEW TOP_EMP AS 
  SELECT empno EMPLOYEE_ID,ename EMPLOYEE_NAME,salary 
  FROM emp
  WHERE salary &gt; 2000 </PRE></BLOCKQUOTE>
<P>用户可以在创建视图的同时更改列名，方法是在视图名后立即加上要命名的列名。重新定义视图需要包含OR REPLACE子串。</P>
<BLOCKQUOTE><PRE>SQL&gt; CREATE VIEW TOP_EMP(EMPLOYEE_ID，EMPLOYEE_NAME，SALARY) AS 
  SELECT empno ,ename ,salary FROM emp WHERE salary &gt;2000 </PRE></BLOCKQUOTE>
<P>如果在创建的视图包含错误在正常情况下，视图将不会被创建。但如果你需要创建一个带错误的视图必须在CREATE VIEW语句中带上FORCE选项。如：</P>
<BLOCKQUOTE><PRE>CREATE FORCE VIEW ORDER_STATUS AS 
  SELECT * FROM PURCHASE_ORDERS
  WHERE STATUS="APPPOVE";

SQL&gt;/
  warning :View create with compilation errors </PRE></BLOCKQUOTE>
<P>这样将创建了一个名为ORDER_STATUS的视图，但这样的视图的状态是不合法的，如果以后状态发生变化则可以重新编译，其状态也变成合法的。</P>
<H5>从视图中获得数据</H5>
<P>从视图中获得数据与从表中获得数据基本一样，用户可以在连接和子查询中使用视图，也可以使用SQL函数，以及所有SELECT语句的字串。</P>
<H5>插入、更新、删除数据</H5>
<P>用户在一定的限制条件下可以通过视图更新、插入、删除数据。如果视图连接多个表，那么在一个时间里只能更新一个表。所有的能被更新的列可以在数据字典USER_UPDATETABLE_COLUMNS中查到。</P>
<P>用户在CREATE VIEW中可以使用了WITH子串。WITH READ ONLY子串表示创建的视图是一个只读视图，不能进行更新、插入、删除操作。WITH CHECK OPTION表示可以进行插入和更新操作，但应该满足WHERE子串的条件。这个条件就是创建视图WHERE子句的条件，比如在上面的例子中用户创建了一个视图TOP_EMP,在这个视图中用户不能插入salary小于2000的数据行。</P>
<H5>删除视图</H5>
<P>删除视图使用DROP VIEW命令。同时将视图定义从数据字典中删除，基于视图的权限也同时被删除，其他涉及到该视图的函数、视图、程序等都将被视为非法。</P>
<P>例：</P>
<BLOCKQUOTE><PRE>DROP VIEW TOP_EMP; </PRE></BLOCKQUOTE>
<H3>过程和函数</H3>
<P>过程和函数都以编译后的形式存放在数据库中，函数可以没有参数也可以有多个参数并有一个返回值。过程有零个或多个参数，没有返回值。函数和过程都可以通过参数列表接收或返回零个或多个值，函数和过程的主要区别不在于返回值，而在于他们的调用方式。过程是作为一个独立执行语句调用的：</P>
<BLOCKQUOTE><PRE> pay_involume(invoice_nbr,30,due_date);</PRE></BLOCKQUOTE>
<P>函数以合法的表达式的方式调用：</P>
<BLOCKQUOTE><PRE>order_volumn:=open_orders(SYSDATE,30);</PRE></BLOCKQUOTE>
<P>创建过程的语法如下：</P>
<P>CREATE [ OR REPLACE] PROCEDURE [schema.]procedure_name<BR>[parameter_lister]<BR>{AS|IS}<BR>declaration_section<BR>BEGIN<BR>executable_section<BR>[EXCEPTION<BR>exception_section]<BR>END [procedure_name]&nbsp;&nbsp;</P>
<P>每个参数的语法如下：</P>
<P>paramter_name mode datatype [(:=|DEFAULT) value]</P>
<P>mode有三种形式：IN、OUT、INOUT。</P>
<P>IN表示在调用过程的时候，实际参数的取值被传递给该过程，形式参数被认为是只读的，当过程结束时，控制会返回控制环境，实际参数的值不会改变。</P>
<P>OUT在调用过程时实际参数的取值都将被忽略，在过程内部形式参数只能是被赋值，而不能从中读取数据，在过程结束后形式参数的内容将被赋予实际参数。</P>
<P>INOUT这种模式是IN和OUT的组合；在过程内部实际参数的值会传递给形式参数，形势参数的值可读也可写，过程结束后，形势参数的值将赋予实际参数。</P>
<P>创建函数的语法和过程的语法基本相同，唯一的区别在于函数有RETUREN子句</P>
<P>CREATE [ OR REPLACE] FINCTION [schema.]function_name<BR>[parameter_list]<BR>RETURN returning_datatype<BR>{AS|IS}<BR>declaration_section<BR>BEGIN<BR>executable_section<BR>[EXCEPTION]<BR>exception_section<BR>END [procedure_name]&nbsp;&nbsp;</P>
<P>在执行部分函数必须有哟个或多个return语句。</P>
<P>在创建函数中可以调用单行函数和组函数，例如：</P>
<BLOCKQUOTE><PRE>CREATE OR REPLACE FUNCTION my_sin(DegreesIn IN NUMBER)
  RETURN NUMBER
IS 
  pi NUMBER=ACOS(-1);
  RadiansPerDegree NUMBER;
BEGIN
  RadiansPerDegree=pi/180;
  RETURN(SIN(DegreesIn*RadiansPerDegree));
END; </PRE></BLOCKQUOTE>
<H3>包</H3>
<P>包是一种将过程、函数和数据结构捆绑在一起的容器；包由两个部分组成：外部可视包规范，包括函数头，过程头，和外部可视数据结构；另一部分是包主体(package body),包主体包含了所有被捆绑的过程和函数的声明、执行、异常处理部分。</P>
<P>打包的PL/SQL程序和没有打包的有很大的差异，包数据在用户的整个会话期间都一直存在，当用户获得包的执行授权时，就等于获得包规范中的所有程序和数据结构的权限。但不能只对包中的某一个函数或过程进行授权。包可以重载过程和函数，在包内可以用同一个名字声明多个程序，在运行时根据参数的数目和数据类型调用正确的程序。</P>
<P>创建包必须首先创建包规范，创建包规范的语法如下：</P>
<P>CREATE [OR REPLACE] PACKAGE package_name<BR>{AS|IS}<BR>public_variable_declarations |<BR>public_type_declarations |<BR>public_exception_declarations |<BR>public_cursor_declarations |<BR>function_declarations |<BR>procedure_specifications<BR>END [package_name] </P>
<P>创建包主体使用CREATE PACKAGE BODY语句：</P>
<P>CREATE [OR REPLACE] PACKAGE BODY package_name<BR>{AS|IS}<BR>private_variable_declarations |<BR>private_type_declarations |<BR>private_exception_declarations |<BR>private_cursor_declarations |<BR>function_declarations |<BR>procedure_specifications<BR>END [package_name] </P>
<P>私有数据结构是那些在包主体内部，对被调用程序而言是不可见的。</P>
<H3>触发器(Triggers)</H3>
<P>触发器是一种自动执行响应数据库变化的程序。可以设置为在触发器事件之前或之后触发或执行。能够触发触发器事件的事件包括下面几种：</P>
<P>DML事件<BR>DDL事件<BR>数据库事件</P>
<P>创建触发器的语法如下：</P>
<P>CREATE [OR REPLACE] TRIGGER trigger_name<BR>{before|after|instead of} event<BR>ON {table_or_view_name|DATABASE}<BR>[FOR EACH ROW[WHEN condition&gt;<BR>trigger_body </P>
<P>只有DML触发器（INSERT、UPDATE、DELETE)语句可以使用INSTEAD OF触发器并且只有表的DML触发器可以是BEFORE或AFTER触发器。</P>
<P>象约束一样触发器可以被设置为禁用或启用来关闭或打开他们的执行体(EXECUTE),将触发器设置为禁用或启用使用ALTER TRIGGER语句：</P>
<P>ALTER TRIGGER trigger_name ENABLE;<BR>ALTER TRIGGER trigger_name DISABLE; </P>
<P>要禁用或启用表的所有触发器，使用ALTER TABLE语句</P>
<P>ALTER TRIGGER table_name DISABLE ALL TRIGGER;<BR>ALTER TRIGGER table_name ENABLE ALL TRIGGER; </P>
<P>删除触发器使用DROP TRIGGER</P>
<P>DROP TRIGGER trigger_name; </P>
<H3>数据字典</H3>
<P>Oracle数据字典包含了用户数据库的元数据。带下划线的表名称中带OBJ$、UET$、SOURCE$，这些表是在执行CREATE DATABASE语句期间由sql.bsq脚本创建的，一般情况下用户很少访问这些表。脚本catalog.sql（通常位于$oracle_home/rdbms/admin）在CREATE DATABASE语句之后立即运行，创建数据字典视图。</P>
<P>数据字典视图大致可以分为三类：</P>
<P>　　.前缀为USER_的数据字典视图，包含了用户拥有的对象的信息。<BR>　　.前缀为ALL_的数据字典视图，包含了用户当前可以访问的全部对象和权限的信息。<BR>　　.前缀为DBA_的数据字典视图，包含了数据库拥有的所有对象和权限的信息。</P>
<P>在绝大多数数据字典视图中都有象DBA_TABLES,ALL_TABLES和USER_TABLES这样的视图家族。Oracle中有超过100个视图家族，所以要全面介绍这些视图家族是单调乏味的而且没有多大的意义。在下表中列出了最重要和最常用的视图家族，需要注意的是每个视图家族都有一个DBA_,一个ALL_一个USER_视图。<BR>其他的字典视图中主要的是V$视图，之所以这样叫是因为他们都是以V$或GV$开头的。V$视图是基于X$虚拟视图的。V$视图是SYS用户所拥有的，在缺省状况下，只有SYS用户和拥有DBA系统权限的用户可以看到所有的视图，没有DBA权限的用户可以看到USER_和ALL_视图，但不能看到DBA_视图。与DBA_,ALL,和USER_视图中面向数据库信息相反，这些视图可视的给出了面向实例的信息。 </P>
<P>在大型系统上化几周时间手工输入每一条语句<BR>手工输入带用户名变量的语句，然后再输入每一个用户名，这需要花好几个小时的时间<BR>写一条SQL语句，生成需要的ALTER USER语句，然后执行他，这只需要几分钟时间</P>
<P>很明显我们将选择生成SQL的方法：</P>
<P>例：</P>
<BLOCKQUOTE><PRE>SELECT "ALTER USER"||username||"TEMPORARY TABLESPACE temp;"
FROM DBA_USERS
WHERE username&lt;&gt;"SYS" 
  AND temporary_tablespace&lt;&gt;"TEMP"; </PRE></BLOCKQUOTE>
<P>这个查询的结果将被脱机处理到一个文件中，然后在执行：</P>
<BLOCKQUOTE><PRE>ALTER USER SYSTEM TEMPORARY TABLESPACE temp;
ALTER USER OUTLN TEMPORARY TABLESPACE temp;
ALTER USER DBSNMP TEMPORARY TABLESPACE temp;
ALTER USER SCOTT TEMPORARY TABLESPACE temp;
ALTER USER DEMO TEMPORARY TABLESPACE temp;</PRE></BLOCKQUOTE><img src ="http://www.blogjava.net/sgsoft/aggbug/993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-04 00:07 <a href="http://www.blogjava.net/sgsoft/articles/993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle RMAN快速入门指南</title><link>http://www.blogjava.net/sgsoft/articles/992.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Thu, 03 Feb 2005 16:05:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/992.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/992.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/992.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/992.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/992.html</trackback:ping><description><![CDATA[<H2 align=center>Oracle RMAN快速入门指南</H2>
<H3>前言</H3>
<P>这篇文章主要介绍RMAN的常用方法，其中包含了作者一些自己的经验，里面的实验也基本全在WIN 2K和ORACLE 8.1.6环境下测试成功（因为这个环境比较容易实现）。</P>
<P>本文借鉴了网上一些高手的相关文章，希望大侠们不要见怪，此处一并谢过。</P>
<P>这篇文章主要是在北京出差期间写的，回到家后整理修改了一下，时间比较仓促，同时因为篇幅有限，一些技术细节不能一一覆盖了，只希望能够帮助新手入门的作用，想真正熟练掌握RMAN，必须经过较长时间的实践磨练才可以，尤其需要在工程中获得宝贵的故障解决经验。</P>
<H3>1.什么是RMAN</H3>
<P>RMAN可以用来备份和还原数据库文件、归档日志和控制文件。它也可以用来执行完全或不完全的数据库恢复。</P>
<P>注意：RMAN不能用于备份初始化参数文件和口令文件。</P>
<P>RMAN启动数据库上的Oracle服务器进程来进行备份或还原。备份、还原、恢复是由这些进程驱动的。</P>
<P>RMAN可以由OEM的Backup Manager GUI来控制，但在本文章里不作重点讨论。</P>
<H3>2. Terminology专业词汇解释</H3>
<H4>2.1. Backup sets备份集合</H4>
<P>备份集合有下面的特性：<BR>　　包括一个或多个数据文件或归档日志<BR>　　以oracle专有的格式保存<BR>　　有一个完全的所有的备份片集合构成<BR>　　构成一个完全备份或增量备份</P>
<H4>2.2. Backup pieces备份片</H4>
<P>一个备份集由若干个备份片组成。每个备份片是一个单独的输出文件。一个备份片的大小是有限制的；如果没有大小的限制， 备份集就只由一个备份片构成。备份片的大小不能大于使用的文件系统所支持的文件长度的最大值。</P>
<H4>2.3. Image copies镜像备份</H4>
<P>镜像备份是独立文件（数据文件、归档日志、控制文件）的备份。它很类似操作系统级的文件备份。它不是备份集或备份片，也没有被压缩。</P>
<H4>2.4. Full backup sets全备份集合</H4>
<P>全备份是一个或多个数据文件中使用过的数据块的的备份。没有使用过的数据块是不被备份的，也就是说，oracle 进行备份集合的压缩。</P>
<H4>2.5. Incremental backup sets增量备份集合</H4>
<P>增量备份是指备份一个或多个数据文件的自从上一次同一级别的或更低级别的备份以来被修改过的数据块。 与完全备份相同，增量备份也进行压缩。</P>
<H4>2.6. File multiplexing</H4>
<P>不同的多个数据文件的数据块可以混合备份在一个备份集中。</P>
<H4>2.7. Recovery catalog resyncing 恢复目录同步</H4>
<P>使用恢复管理器执行backup、copy、restore或者switch命令时，恢复目录自动进行更新，但是有关日志与归档日志信息没有自动记入恢复目录。需要进行目录同步。使用resync catalog命令进行同步。</P><PRE>RMAN&gt;resync catalog;

RMAN-03022：正在编译命令：resync
RMAN-03023：正在执行命令：resync
RMAN-08002：正在启动全部恢复目录的 resync
RMAN-08004：完成全部 resync</PRE>
<H3>3. 恢复目录</H3>
<H4>3.1.恢复目录的概念</H4>
<P>恢复目录是由RMAN使用、维护的用来放置备份信息的仓库。RMAN利用恢复目录记载的信息去判断如何执行需要的备份恢复操作。</P>
<P>恢复目录可以存在于ORACLE数据库的计划中。</P>
<P>虽然恢复目录可以用来备份多个数据库，建议为恢复目录数据库创建一个单独的数据库。</P>
<P>恢复目录数据库不能使用恢复目录备份自身。</P>
<H4>3.2.建立恢复目录</H4>
<P>第一步，在目录数据库中创建恢复目录所用表空间：</P><PRE>SQL&gt; create tablespace rman_ts datafile "d:\oracle\oradata\rman\rman_ts.dbf" size 20M;

表空间已创建。</PRE>
<P>第二步，在目录数据库中创建RMAN 用户并授权：</P><PRE>SQL&gt; create user rman identified by rman default tablespace rman_ts temporary 
  tablespace temp quota unlimited on rman_ts;

用户已创建。

SQL&gt; grant recovery_catalog_owner to rman;

授权成功。

SQL&gt; grant connect, resource to rman;

授权成功。
</PRE>
<P>第三步，在目录数据库中创建恢复目录</P><PRE>C:\&gt;rman catalog rman/rman

恢复管理器：版本8.1.6.0.0 - Production

RMAN-06008：连接到恢复目录数据库
RMAN-06428：未安装恢复目录

RMAN&gt;create catalog tablespace rman_ts;

RMAN-06431：恢复目录已创建</PRE>
<P>注意：虽然使用RMAN不一定必需恢复目录，但是推荐使用。因为恢复目录记载的信息大部分可以通过控制文件来记载，RMAN在恢复数据库时使用这些信息。不使用恢复目录将会对备份恢复操作有限制。</P>
<H4>3.3.使用恢复目录的优势</H4>
<P>可以存储脚本；</P>
<P>记载较长时间的备份恢复操作；</P>
<H3>4. 启动RMAN</H3>
<P>RMAN为交互式命令行处理界面，也可以从企业管理器中运行。</P>
<P>为了使用下面的实例，先检查环境符合：</P>
<P>　　the target database is called "his" and has the same TNS alias<BR>　　user rman has been granted "recovery_catalog_owner "privileges<BR>　　目标数据库的连接用户为internal帐号，或者以其他SYSDBA类型帐号连接　　<BR>　　the recovery catalog database is called "rman" and has the same TNS alias<BR>　　the schema containing the recovery catalog is "rman" (same password)</P>
<P>在使用RMAN前，设置NLS_DATE_FORMAT 和NLS_LANG环境变量，很多RMAN LIST命令的输出结果是与日期时间相关的，这点在用户希望执行以时间为基准的恢复工作也很重要。</P>
<P>下例是环境变量的示范：</P>
<P>NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK<BR>NLS_DATE_FORMAT=DD-MON-YYYY HH24:MI:SS</P>
<P>为了保证RMAN使用时能连接恢复目录，恢复目录数据库必须打开，目标数据库至少要STARTED（unmount），否则RMAN会返回一个错误，目标数据库必须置于归档模式下。</P>
<H4>4.1.使用不带恢复目录的RMAN</H4>
<P>设置目标数据库的 ORACLE_SID ，执行：</P><PRE>% rman nocatalog
RMAN&gt; connect target
RMAN&gt; connect target internal/&lt;PASSWORD&gt;@his</PRE>
<H4>4.2.使用带恢复目录的RMAN</H4><PRE>% rman rman_ts rman/rman@rman
RMAN&gt; connect target

% rman rman_ts rman/rman@rman target internal/&lt;PASSWORD&gt;@his</PRE>
<H4>4.3.使用RMAN</H4>
<P>一旦连接到目标数据库，可以通过交互界面或者事先存储的脚本执行指定RMAN命令，下面是一个使用RMAN交互界面的实例：</P><PRE>RMAN&gt; resync catalog;
RMAN-03022：正在编译命令：resync
RMAN-03023：正在执行命令：resync
RMAN-08002：正在启动全部恢复目录的 resync
RMAN-08004：完成全部 resync</PRE>
<P>使用脚本的实例：</P><PRE>RMAN&gt; execute script alloc_1_disk;</PRE>
<P>创建或者替代存储的脚本：</P><PRE>RMAN&gt; replace script alloc_1_disk { 
   2&gt; allocate channel d1 type disk;
   3&gt; }</PRE>
<P>5.注册或者注销目标数据库</P>
<P>5.1.注册目标数据库</P>
<P>数据库状态：</P>
<P>恢复目录状态：打开</P>
<P>目标数据库：加载或者打开</P>
<P>目标数据库在第一次使用RMAN之前必须在恢复目录中注册：</P>
<P>第一步，启动恢复管理器，并且连接目标数据库：</P><PRE>C:\&gt;rman target internal/oracle@his catalog rman/rman@rman
恢复管理器：版本8.1.6.0.0 - Production
RMAN-06005：连接到目标数据库：HIS (DBID=3021445076)
RMAN-06008：连接到恢复目录数据库</PRE>
<P>第二步，注册数据库：</P><PRE>RMAN&gt; register database;
RMAN-03022：正在编译命令：register
RMAN-03023：正在执行命令：register
RMAN-08006：注册在恢复目录中的数据库
RMAN-03023：正在执行命令：full resync
RMAN-08002：正在启动全部恢复目录的resync
RMAN-08004：完成全部resync
</PRE>
<P>5.2.注销目标数据库</P>
<P>RMAN提供了一个注销工具，叫DBMS_RCVCAT工具包，请注意一旦注销了该目标数据库，就不可以使用恢复目录中含有的备份集来恢复数据库了。</P>
<P>为了能注销数据库，需要获得数据库的标识码（DB_ID）和数据库键值（DB_KEY）。其中连接目标数据库时将会获得DB_ID。</P><PRE>C:\&gt;rman target internal/oracle@his catalog rman/rman@rman
恢复管理器：版本8.1.6.0.0 - Production
RMAN-06005：连接到目标数据库：HIS (DBID=3021445076)
RMAN-06008：连接到恢复目录数据库</PRE>其中DBID=3021445076，利用DBID=3021445076查询数据库键值码，连接到目标数据库，查询db表：<BR><PRE>SQL&gt; select * from db;

  DB_KEY     DB_ID      CURR_DBINC_KEY
  ---------- ---------- --------------
  1          3021445076 2</PRE>
<P>获得DB_KEY＝1，这样，该目标数据库DB_KEY＝1，DBID=3021445076，利用两个值使用DBMS_RCVCAT工具包就可以注销数据库：</P><PRE>SQL&gt; execute dbms_rcvcat.unregisterdatabase(1,3021445076);
PL/SQL 过程已成功完成。</PRE>
<P>至此，注销数据库操作完成。</P>
<H3>6.操作已有的备份</H3>
<H4>6.1.加入目录数据库</H4>
<P>数据库状态：</P>
<P>恢复目录：打开</P>
<P>目标数据库：加载或者打开</P>
<P>如果存在8.x版本以前创建的备份数据想注册到目标数据库，可以采用如下手工方式加入到恢复目录中</P><PRE>RMAN&gt; catalog datafilecopy "/oracle/ .... /system01.dbf"; </PRE>
<P>使用如下命令显示恢复目录中包含的文件</P><PRE>RMAN&gt; list copy of database;</PRE>
<P>6.2.从目录数据库中删除</P>
<P>第一步：查看备份信息：</P><PRE>RMAN&gt;list backup;
RMAN-03022：正在编译命令：list</PRE>
<P>备份集列表</P><PRE>关键字  Recid      标记       LV 集合标记   集合计数   完成时间
------- ---------- ---------- -- ---------- ---------- ----------------------
1104    2          501364455  0  501364446  2          06-8月 -03</PRE>
<P>备份段列表</P><PRE>关键字  Pc# Cp# 状态        完成时间               段名
------- --- --- ----------- ---------------------- ------------------------
1106    1   1   AVAILABLE   06-8月 -03             D:\ORACLE\ORA81\DATABASE\02EU4DMU_1_1</PRE>
<P>数据文件包括列表</P><PRE>文件 名称                                  LV 类型 检查点SCN  检查点时间
---- ------------------------------------- -- ---- ---------- -------------
   3 D:\ORACLE\ORADATA\HIS\USERS01.DBF      0 Full 160052     06-8月 -03</PRE>
<P>备份集的关键字为1104。</P>
<P>第二步：定义delete通道：</P><PRE>RMAN&gt;allocate channel for delete type disk;
RMAN-03022：正在编译命令：allocate
RMAN-03023：正在执行命令：allocate
RMAN-08030：分配的通道：delete
RMAN-08500：通道 delete：sid=19 devtype=DISK</PRE>
<P>第三步：删除backupset备份集</P><PRE>RMAN&gt;change backupset 1104 delete;
RMAN-03022：正在编译命令：change
RMAN-08073：已删除备份段
RMAN-08517：备份段 handle=D:\ORACLE\ORA81\DATABASE\02EU4DMU_1_1 recid=2 stamp=50 1364447
RMAN-03023：正在执行命令：partial resync
RMAN-08003：启动部分恢复目录的 resync
RMAN-08005：完成部分 resync</PRE>
<P>注意：部分执行删除备份集、备份片或者维护恢复目录的命令，需要先指定通道，如：</P><PRE>RMAN&gt;allocate channel for delete type disk;

RMAN&gt;allocate channel for maintenance type disk;</PRE>
<H3>7.在非归档模式下备份</H3>
<P>数据库状态：</P>
<P>恢复目录：打开</P>
<P>目标数据库：例程启动或者数据库加载</P>
<P>恢复目录数据库需要打开，目标数据库必须启动（或者加载）。因为目标数据库不在归档模式下，所以当进行备份恢复操作的时候数据库无法打开。不可以将表空间置于热备份模式上进行等同于文件系统级的拷贝，如果在非归档模式，数据库打开的状态下不能进行数据文件的备份。</P>
<H4>7.1.数据库完全备份</H4><PRE>RMAN&gt; run {
   2&gt; # backup the complete database to disk
   3&gt; allocate channel dev1 type disk;
   4&gt; backup
   5&gt; full
   6&gt; tag full_db_backup
   7&gt; format "/oracle/backups/db_t%t_s%s_p%p"
   8&gt; (database);
   9&gt; release channel dev1;
  10&gt; }</PRE>
<P>行#<BR>2: 表明该行为注释行（＃是注释符）<BR>3&amp;9: See section 15 - Channels通道定义<BR>5: Full backup (default if full or incremental not specified)完全备份模式（缺省模式）<BR>6: Meaningful string (&lt;=30 chars)（备份集标识，&lt;＝30个字符）<BR>7: Filename to use for backup pieces, including substitution variables. 备份片使用的文件名，可以包含代替变量。<BR>8: Indicates all files including controlfiles are to be backed up表明备份所有数据文件包括控制文件</P>
<P>通过下面的命令显示恢复目录中记载的备份集信息：</P><PRE>RMAN&gt; list backupset of database;</PRE>
<H4>7.2.备份表空间</H4><PRE>RMAN&gt; run {
   2&gt; allocate channel dev1 type disk;
   3&gt; backup
   4&gt; tag tbs_users_read_only
   5&gt; format "/oracle/backups/tbs_users_t%t_s%s"
   6&gt; (tablespace users)
   7&gt; }</PRE>
<P>使用下列命令来显示恢复目录中该表的备份信息：</P><PRE>RMAN&gt; list backupset of tablespace users;</PRE>
<P>假设USERS表空间在备份后被置为READ ONLY表空间，以后的全库备份就可以不用备份该表空间，为了达到这个目的，可以在以后的备份中指定"skip readonly"。</P>
<P>注意，目标数据库不需要一定打开，只要加载就可以，因为表空间的信息存储在控制文件中。</P>
<H4>7.3.备份单独数据文件</H4><PRE>RMAN&gt; run {
   2&gt; allocate channel dev1 type "SBT_TAPE";
   3&gt; backup
   4&gt; format "%d_%u"
   5&gt; (datafile "/oracle/dbs/sysbigdb.dbf");
   6&gt; release channel dev1;
   7&gt; }</PRE>
<P>行#<BR>2: 使用MML（media manager layer）分配磁带驱动器，必须指定类型为SBT_TAPE；</P>
<P>注意因为没有指定标识，所以标识为空；</P>
<P>使用下面的命令显示恢复目录中备份的表空间：</P><PRE> RMAN&gt; list backupset of datafile 1;</PRE>
<H4>7.4.备份数据文件</H4><PRE>RMAN&gt; run {
   2&gt; allocate channel dev1 type "SBT_TAPE";
   3&gt; copy datafile "/oracle/dbs/temp.dbf" to "/oracle/backups/temp.dbf";
   4&gt; release channel dev1;
   5&gt; }</PRE>
<P>使用下面的命令显示恢复目录中的文件拷贝：</P><PRE>RMAN&gt; list copy of datafile "/oracle/dbs/temp.dbf";</PRE>
<P>拷贝数据文件和备份数据文件是不一样的，数据文件拷贝是一个该文件的镜像。文件的备份产生一个备份集。</P>
<H4>7.5.备份控制文件</H4><PRE>RMAN&gt; run { 
   2&gt; allocate channel dev1 type "SBT_TAPE";
   3&gt; backup
   4&gt; format "cf_t%t_s%s_p%p"
   5&gt; tag cf_monday_night
   6&gt; (current controlfile);
   7&gt; release channel dev1;
   8&gt; }</PRE>
<P>注意：数据库完全备份将自动备份控制文件。 </P>
<H3>8.归档模式下的备份</H3>
<P>数据库状态：</P>
<P>恢复目录：打开</P>
<P>目标数据库：例程启动，数据库加载或者打开</P>
<P>备份操作使用的命令与非归档模式下基本一样。</P>
<H4>8.1. Backing up archived logs 备份归档日志</H4>
<P>下面的脚本备份归档日志：</P><PRE>RMAN&gt; run {
   2&gt; allocate channel dev1 type disk;
   3&gt; backup
   4&gt; format "/oracle/backups/log_t%t_s%s_p%p"
   5&gt; (archivelog all)
   6&gt; release channel dev1;
   7&gt; }</PRE>
<P>下面的脚本归档日志从# 90 to 100：</P><PRE>RMAN&gt; run {
   2&gt; allocate channel dev1 type disk;
   3&gt; backup
   4&gt; format "/oracle/backups/log_t%t_s%s_p%p"
   5&gt; (archivelog from logseq=90 until logseq=100 thread 1);
   6&gt; release channel dev1;
   7&gt; }</PRE>
<P>下面的脚本备份在24小时内产生的归档日志，在备份完成后会自动删除归档日志。如果备份失败，归档日志不会被删除。</P><PRE>RMAN&gt; run {
   2&gt; allocate channel dev1 type disk;
   3&gt; backup
   4&gt; format "/oracle/backups/log_t%t_s%s_p%p"
   5&gt; (archivelog from time "sysdate-1" all delete input);
   6&gt; release channel dev1;
   7&gt; }</PRE>
<P>使用下面的命令显示恢复目录中的归档日志：</P><PRE>RMAN&gt; list backupset of archivelog all;</PRE>
<P>注意：RMAN找到归档日志后会备份指定日志，如果无法找到日志，它也不会返回错误信息。</P>
<H4>8.2. Backing up the online logs 备份联机日志</H4>
<P>联机日志不能用RMAN来备份，必须先将其归档。</P>
<P>为了实现这点，必须在RMAN中执行如下SQL语句：</P><PRE>RMAN&gt; run {
   2&gt; allocate channel dev1 type disk;
   3&gt; sql "alter system archive log current";
   4&gt; backup
   5&gt; format "/oracle/backups/log_t%t_s%s_p%p"
   6&gt; (archivelog from time "sysdate-1" all delete input);
   7&gt; release channel dev1;
   8&gt; }</PRE>
<P>上面的脚本可以在执行完一个完整的联机数据库备份后执行，确保所有的重做日志可以将数据库恢复到一个一致性的状态。</P>
<P>注意：不可以标识归档日志备份集。</P>
<H3>9. 增量备份</H3>
<P>N级别增量备份备份从最近的N级别或者更小级别以来的所有更改过的数据块内容。增量备份分为两种，一种是累积增量备份，一种是非累积增量备份。</P>
<P>累积增量备份包括自最后一次在更低级别进行备份以来所有改动过的数据块。</P>
<P>非累积增量备份包括自前一次在同级或者更低级别进行备份以来改动过的数据块。</P>
<H4>9.1. Level 0--增量备份策略的基础</H4>
<P>Level 0 是增量备份策略的基础--the basis of the incremental backup strategy</P><PRE>RMAN&gt; run {
   2&gt; allocate channel dev1 type disk;
   3&gt; backup
   4&gt; incremental level 0
   5&gt; filesperset 4
   6&gt; format "/oracle/backups/sunday_level0_%t"
   7&gt; (database);
   8&gt; release channel dev1;
   9&gt; }</PRE>
<P>Line#<BR>4: 0级备份<BR>5: 定义每个backupset 的最大文件数</P>
<P>使用LIST语句查看，数据库备份集的列表显示中， "type" 将显示 "Incremental"，"LV"列将显示"0" 。 </P>
<H4>9.2. 使用增量备份的案例</H4>
<P>一个典型的增量备份案例如下：<BR>　　 星期天晚上 - level 0 backup performed<BR>　　 星期一晚上 - level 2 backup performed<BR>　　 星期二晚上 - level 2 backup performed<BR>　　 星期三晚上 - level 1 backup performed<BR>　　 星期四晚上 - level 2 backup performed<BR>　　 星期五晚上 - level 2 backup performed<BR>　　 星期六晚上 - level 2 backup performed<BR>　　 星期天晚上 - level 0 backup performed</P>
<H3>10. 恢复</H3>
<P>恢复案例如下：</P>
<H4>10.1. Database open，datafile deleted 数据库打开时，文件被删除</H4>
<P>数据文件在数据库打开时被删除。有两种方法可以对打开的数据库进行恢复：还原数据文件或者表空间。下面两个实例显示了该方法：</P>
<P>(a) Datafile recovery 数据文件恢复</P><PRE>RMAN&gt; run {
   2&gt; allocate channel dev1 type disk;
   3&gt; sql "alter tablespace users offline immediate";
   4&gt; restore datafile 4;
   5&gt; recover datafile 4;
   6&gt; sql "alter tablespace users online";
   7&gt; release channel dev1;
   8&gt; }</PRE>
<P>(b) Tablespace recovery 表空间恢复</P><PRE>RMAN&gt; run {
   2&gt; allocate channel dev1 type disk;
   3&gt; sql "alter tablespace users offline immediate";
   4&gt; restore tablespace users;
   5&gt; recover tablespace users;
   6&gt; sql "alter tablespace users online";
   7&gt; release channel dev1;
   8&gt; }</PRE>
<P>注意：如果还原系统表空间文件，数据库必须关闭，因为系统表空间不可以脱机。</P>
<H4>10.2. Complete restore (lost online redo) and rollforward - database closed 完全还原（丢失联机日志）并且前滚 - 数据库关闭</H4><PRE>RMAN&gt; run {
   2&gt; allocate channel dev1 type disk;
   3&gt; set until logseq=105 thread=1;
   4&gt; restore controlfile to "/oracle/dbs/ctrltargdb.ctl";
   5&gt; replicate controlfile from "/oracle/dbs/ctrltargdb.ctl";
   6&gt; restore database;
   7&gt; sql "alter database mount";
   8&gt; recover database;
   9&gt; sql "alter database open resetlogs";
  10&gt; release channel dev1;
  11&gt; }</PRE>
<P>Notes:<BR>"set until" 命令指明恢复到指定的日志文件。这一点在数据文件恢复时很重要，否则RMAN将试图恢复最近的数据文件，该数据文件可能在指定的日志以前。<BR>"replicate controlfile" 复制还原的控制文件到INIT.ORA指定的控制文件。</P>
<P>如果数据库使用WITH RESETLOGS打开，则需要使用RESET DATABASE命令注册改变后的数据库。在使用RESETLOGS命令打开数据库后强烈建议做一个完全的数据库备份。</P>
<H4>10.3. 还原数据文件的子集，完全恢复</H4><PRE>RMAN&gt; run {
   2&gt; allocate channel dev1 type disk;
   3&gt; sql "alter database mount";
   4&gt; restore datafile 2;
   5&gt; restore datafile 3;
   6&gt; restore archivelog all;
   7&gt; recover database;
   8&gt; sql "alter database open";
   9&gt; release channel dev1;
  10&gt; }</PRE>
<H3>11. 脚本</H3>
<P>创建或者取代脚本：</P><PRE>RMAN&gt; create script alloc_disk {
   2&gt; # Allocates one disk
   3&gt; allocate channel dev1 type disk;
   4&gt; setlimit channel dev1 kbytes 2097150 maxopenfiles 32 readrate 200;
   5&gt; }

RMAN&gt; replace script rel_disk {
   2&gt; # releases disk
   3&gt; release channel dev1;
   5&gt; }

RMAN&gt; replace script backup_db_full {
   2&gt; # Performs a complete backup 
   3&gt; execute script alloc_disk;
   4&gt; backup
   5&gt; .....<BACKUP here commands>
   6&gt; execute script rel_disk;
   7&gt; }</PRE>
<P>前两个脚本分别用来分配和回收通道。</P>
<P>alloc_disk 脚本还额外指定了备份片的最大兆字节数，备份时可以同时打开的输入文件的最大数目，以及每秒钟读每个输入文件的数据缓冲区的最大数目。</P>
<P>第三个脚本调用先前存储的两个脚本进行数据库备份。</P>
<P>运行存储脚本的示范：</P><PRE>RMAN&gt; run {
   2&gt; execute script backup_db_full;
   3&gt; }</PRE>
<P>注意：存储的脚本必须在{ .... execute &lt;script&gt;; ....}命令中调用。</P>
<H3>12. Corruption detection </H3>
<P>RMAN可以备份包含损坏数据块的数据文件，查询视图V$BACK_CORRUPTION和V$COPY_CORRUPTION可以获得有关坏数据的信息。</P>
<P>通过设置 set maxcorrupt 可以跳过指定个数的坏块来避免备份失败。</P><PRE>RMAN&gt; replace script backup_db_full {
   2&gt; # Performs a complete backup
   3&gt; execute script alloc_disk;
   4&gt; set maxcorrupt for datafile 1 to 0;
   5&gt; backup
   6&gt; .....<BACKUP here commands>
   7&gt; execute script rel_disk;
   8&gt; }</PRE>
<P>上面的脚本maxcorrupt for datafile 1 to 0设置为0，所以如果有错误数据块在数据文件1中发现，上面的脚本执行就会失败。</P>
<H3>13. 通道</H3>
<P>一个通道是RMAN和目标数据库之间的一个连接，"allocate channel"命令在目标数据库启动一个服务器进程，同时必须定义服务器进程执行备份或者恢复操作使用的I/O类型</P>
<P>通道控制命令可以用来：<BR>　　 控制RMAN使用的O/S资源<BR>　　 影响并行度<BR>　　 指定I/O带宽的限制值（设置limit read rate参数）<BR>　　 定义备份片大小的限制（设置limit kbytes）<BR>　　 指定当前打开文件的限制值（设置limit maxopenfiles）</P>
<H3>14. Report &amp; list commands</H3>
<H4>14.1. List</H4>
<P>list命令查询恢复目录并且产生格式化的查询内容： </P><PRE> RMAN&gt; list backupset of datafile 1;<BR>
  <BR>
  Key File Type LV Completion_time Ckp SCN Ckp Time<BR>
  ------- ---- ------------ -- --------------- ---------- --------<BR>
  165 1 　Full Oct 03 11:24 32022 Oct 03 11:24<BR>
  208 1 　Full Oct 24 14:27 52059 Oct 24 14:26<BR>
  219 1　 Full Oct 24 14:31 52061 Oct 24 14:31<BR>
  &lt;&lt; other entries here &gt;&gt;<BR>
  <BR>
  RMAN&gt; list backupset of archivelog all;<BR>
  <BR>
  Key Thrd Seq Completion time<BR>
  ------- ---- ------- ---------------<BR>
  179 1 94 Oct 03 11:26<BR>
  179 1 95 Oct 03 11:26<BR>
  &lt;&lt; other entries here &gt;&gt;</PRE>
<H4>14.2. Report</H4>
<P>REPORT命令同样可以查询恢复目录，但是REPORT命令语法可以构建获得更为有用的信息的指令，REPORT命令输出可以保存到消息日志文件中，但是必须在连接恢复目录时指定MSGLOG或者LOG选项。</P>
<P>可以列出所有数据库中不能恢复的文件列表：</P><PRE> RMAN&gt; report unrecoverable database;</PRE>
<P>显示全部数据文件：</P><PRE>RMAN&gt; report schema;
RMAN-03022：正在编译命令：report 数据库模式报表
文件    千字节     表空间    RB     segs 名称 
1       121472     SYSTEM    YES    D:\ORACLE\ORADATA\HIS\SYSTEM01.DBF 
2       327680     RBS       YES    D:\ORACLE\ORADATA\HIS\RBS01.DBF 
3       110592     USERS     NO     D:\ORACLE\ORADATA\HIS\USERS01.DBF 
4       73728      TEMP      NO     D:\ORACLE\ORADATA\HIS\TEMP01.DBF 
5       12288      TOOLS     NO     D:\ORACLE\ORADATA\HIS\TOOLS01.DBF 
6       59392      INDX      NO     D:\ORACLE\ORADATA\HIS\INDX01.DBF 
</PRE>
<H3>15. 小提示</H3>
<P>经常同步恢复目录</P>
<P>确认删除不需要的归档日志</P>
<P>备份策略简单原则</P>
<P> </P>
<P align=right>文章来源：天极网</P><img src ="http://www.blogjava.net/sgsoft/aggbug/992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-04 00:05 <a href="http://www.blogjava.net/sgsoft/articles/992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle数据操作和控制语言详解</title><link>http://www.blogjava.net/sgsoft/articles/991.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Thu, 03 Feb 2005 16:04:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/991.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/991.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/991.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/991.html</trackback:ping><description><![CDATA[<H2 align=center>Oracle数据操作和控制语言详解</H2>
<P>　　SQL语言共分为四大类：数据查询语言DQL，数据操纵语言DML，数据定义语言DDL，数据控制语言DCL。其中用于定义数据的结构，比如创建、修改或者删除数据库；DCL用于定义数据库用户的权限；在这篇文章中我将详细讲述这两种语言在Oracle中的使用方法。</P>
<H4>　　DML语言</H4>
<P>　　DML是SQL的一个子集，主要用于修改数据，下表列出了ORACLE支持的DML语句。</P>
<TABLE cellSpacing=0 cellPadding=4 width=600 align=center border=1>
<TBODY>
<TR>
<TD width=170>语句</TD>
<TD width=408>用途</TD></TR>
<TR>
<TD>INSERT</TD>
<TD>向表中添加行</TD></TR>
<TR>
<TD>UPDATE</TD>
<TD>更新存储在表中的数据 </TD></TR>
<TR>
<TD>DELETE</TD>
<TD>删除行 </TD></TR>
<TR>
<TD>SELECT FOR UPDATE</TD>
<TD>禁止其他用户访问DML语句正在处理的行。</TD></TR>
<TR>
<TD>LOCK TABLE</TD>
<TD>禁止其他用户在表中使用DML语句 </TD></TR></TBODY></TABLE>
<H5>　　插入数据</H5>
<P>　　INSERT语句常常用于向表中插入行，行中可以有特殊数据字段，或者可以用子查询从已存在的数据中建立新行。</P>
<P>　　列目录是可选的，缺省的列的目录是所有的列名，包括comlumn_id,comlumn_id可以在数据字典视图ALL_TAB_COLUMNS,USER_TAB_COLUMNS,或者DBA_TAB_COLUMNS中找到。</P>
<P>　　插入行的数据的数量和数据类型必须和列的数量和数据类型相匹配。不符合列定义的数据类型将对插入值实行隐式数据转换。NULL字符串将一个NULL值插入适当的列中。关键字NULL常常用于表示将某列定义为NULL值。</P>
<P>　　下面的两个例子是等价的。</P><PRE>        INSERT INTO customers(cust_id,state,post_code)
          VALUE("Ariel",NULL,"94501");&nbsp;&nbsp;</PRE>
<P>　　或</P><PRE>        INSERT INTO customers(cust_id,state,post_code)
          VALUE("Ariel",,"94501"); </PRE>
<H5>　　更新数据</H5>
<P>　　UPDATE命令用于修改表中的数据。</P><PRE>        UPDATE order_rollup
          SET(qty,price)=(SELECT SUM(qty),SUM(price) FROM order_lines WHERE customer_id="KOHL")
          WHERE cust_id="KOHL" AND order_period = TO_DATE("01-Oct-2000") </PRE>
<H5>　　删除数据</H5>
<P>　　DELETE语句用来从表中删除一行或多行数据，该命令包含两个语句：<BR>　　　1、关键字DELETE FROM后跟准备从中删除数据的表名。<BR>　　　2、WHERE后跟删除条件</P><PRE>        DELETE FROM po_lines WHERE ship_to_state IN ("TX","NY","IL")</PRE>
<H5>　　清空表</H5>
<P>　　如果你想删除表中所有数据，清空表，可以考虑使用DDL语言的TRUNCATE语句。TRUNCATE就像没有WHERE子句的DELETE命令一样。TRUNCATE将删除表中所有行。TRUNCATE不是DML语句是DDL语句，他和DELETE右不同的特点。</P><PRE>        TRUNCATE TABLE (schema)table DROP(REUSE) STORAGE</PRE>
<P>　　STORAGE子串是可选的，缺省是DROP STORAGE。当使用DROP STORAGE时将缩短表和表索引，将表收缩到最小范围，并重新设置NEXT参数。REUSE STORAGE不会缩短表或者调整NEXT参数。</P>
<P>　　TRUNCATE和DELETE有以下几点区别：</P>
<P>　　1、TRUNCATE在各种表上无论是大的还是小的都非常快。如果有ROLLBACK命令DELETE将被撤销，而TRUNCATE则不会被撤销。</P>
<P>　　2、TRUNCATE是一个DDL语言，向其他所有的DDL语言一样，他将被隐式提交，不能对TRUNCATE使用ROLLBACK命令。</P>
<P>　　3、TRUNCATE将重新设置高水平线和所有的索引。在对整个表和索引进行完全浏览时，经过TRUNCATE操作后的表比DELETE操作后的表要快得多。</P>
<P>　　4、TRUNCATE不能触发任何DELETE触发器。</P>
<P>　　5、不能授予任何人清空他人的表的权限。</P>
<P>　　6、当表被清空后表和表的索引讲重新设置成初始大小，而delete则不能。</P>
<P>　　7、不能清空父表。</P>
<H5>　　SELECT FOR UPDATE</H5>
<P>　　select for update语句用于锁定行，阻止其他用户在该行上修改数据。当该行被锁定后其他用户可以用SELECT语句查询该行的数据，但不能修改或锁定该行。</P>
<H5>　　锁定表</H5>
<P>　　LOCK语句常常用于锁定整个表。当表被锁定后，大多数DML语言不能在该表上使用。LOCK语法如下：</P><PRE>        LOCK schema table IN lock_mode </PRE>
<P>　　其中lock_mode有两个选项：</P>
<P>　　　share 共享方式<BR>　　　exclusive 唯一方式</P>
<P>　　例：</P><PRE>        LOCK TABLE intentory IN EXCLUSIVE MODE </PRE>
<H5>　　死锁</H5>
<P>　　当两个事务都被锁定，并且互相都在等待另一个被解锁，这种情况称为死锁。</P>
<P>　　当出现死锁时，ORACLE将检测死锁条件，并返回一个异常。</P>
<H4>　　事务控制</H4>
<P>　　事务控制包括协调对相同数据的多个同步的访问。当一个用户改变了另一个用户正在使用的数据时，oracle使用事务控制谁可以操作数据。</P>
<H5>　　事务</H5>
<P>　　事务表示工作的一个基本单元，是一系列作为一个单元被成功或不成功操作的SQL语句。在SQL和PL/SQL中有很多语句让程序员控制事务。程序员可以：</P>
<P>　　　1、显式开始一个事物，选择语句级一致性或事务级一致性<BR>　　　2、设置撤销回滚点，并回滚到回滚点<BR>　　　3、完成事务永远改变数据或者放弃修改。</P>
<H5>　　事务控制语句</H5>
<TABLE cellSpacing=0 cellPadding=4 width=600 align=center border=1>
<TBODY>
<TR>
<TD width=170>语句</TD>
<TD width=408>用途</TD></TR>
<TR>
<TD>Commit</TD>
<TD>完成事务，数据修改成功并对其他用户开放</TD></TR>
<TR>
<TD>Rollback</TD>
<TD>撤销事务，撤销所有操作</TD></TR>
<TR>
<TD>rollback to savepoint</TD>
<TD>撤销在设置的回滚点以后的操作</TD></TR>
<TR>
<TD>set transaction</TD>
<TD>响应事务或语句的一致性；特别对于事务使用回滚段</TD></TR></TBODY></TABLE>
<P>　　例：</P>
<BLOCKQUOTE><PRE>BEGIN
  UPDATE checking SET balance=balance-5000 WHERE account="Kieesha";

  INSERT INTO checking_log(action_date,action,amount) 
    VALUES (SYSDATE,"Transfer to brokerage",-5000);

  UPDATE brokerage SET cash_balance=cash_balance+5000 WHERE account="Kiesha";

  INSERT INTO brokerage_log(action_date,action,amount)
    VALUES (SYSDATE,"Tracfer from checking",5000);

  COMMIT;

EXCEPTION
  WHEN OTHERS
    ROLLBACK;
END;</PRE></BLOCKQUOTE>
<H5>　　Savepoint 和 部分回滚(Partial Rollback)</H5>
<P>　　在SQL和PL/SQL中Savepoint是在一事务范围内的中间标志。经常用于将一个长的事务划分为小的部分。保留点Savepoint可标志长事务中的任何点，允许可回滚该点之后的操作。在应用程序中经常使用Savepoint；例如一过程包含几个函数，在每个函数前可建立一个保留点，如果函数失败，很容易返回到每一个函数开始的情况。在回滚到一个Savepoint之后，该Savepoint之后所获得的数据封锁被释放。为了实现部分回滚可以用带TO Savepoint子句的ROLLBACK语句将事务回滚到指定的位置。</P>
<P>　　例</P>
<BLOCKQUOTE><PRE>BEGIN 
  INSERT INTO ATM_LOG(who,when,what,where)
  VALUES ("Kiesha",SYSDATE,"Withdrawal of $100","ATM54");
  SAVEPOINT ATM_LOGGED;

  UPDATE checking
    SET balance=balance-100
    RETURN balance INTO new_balance;

  IF new_balance&lt;0 THEN
    ROLLBACK TO ATM_LOGGED;
    COMMIT;
    RAISE insufficient_funda;
  END IF;
END;</PRE></BLOCKQUOTE>
<P>　　关键字SAVEPOINT是可选的，所以下面两个语句是等价的：</P>
<BLOCKQUOTE><PRE>ROLLBACK TO ATM_LOGGED;
ROLLBACK TO SAVEPOINT ATM_LOGGED; </PRE></BLOCKQUOTE>
<H5>　　一致性和事务</H5>
<P>　　一致性是事物控制的关键慨念。掌握了oracle 的一致性模型，能使您更好的，更恰当的使用事务控制。oracle通过一致性保证数据只有在事务全部完成后才能被用户看见和使用。这项技术对多用户数据库有巨大的作用。</P>
<P>　　oracle常常使用语句级（state-level)一致性，保证数据在语句的生命期之间是可见的但不能被改变。事务由多个语句组成，当使用事务时，事物级（transaction-level)一致性在整个事务生命期中保证数据对所有语句都是可见的。</P>
<P>　　oracle通过SCN(syatem change number)实施一致性。一个SCN是一个面向时间的数据库内部键。SCN只会增加不会减少，SCN表示了时间上的一个点，每个数据块都有一个SCN,通过比较这个点实施操作。</P>
<H5>　　事务级一致性</H5>
<P>　　SET TRANSACTION 的一个作用是确保事务级一致或语句级一致中有一个实施。ORACLE使用这些术语：</P>
<P>　　　ISOLATION LEVEL READ COMMIT 表示语句级一致<BR>　　　ISOLATION LEVEL SERIALIZABLE 表示事务级一致。</P>
<P>　　例：</P><PRE>        SET TRANSACTION ISOLATION LEVEL READ COMMIT;</PRE>
<P>　　下面的语句也能确保事务级一致：</P><PRE>        SET TRANSCATION READ ONLY </PRE>
<P>　　任何企图在只读（READ ONLY）事务中修改数据的操作都会抛出一个异常。但是，READ ONLY事务只能在下列语句中使用：</P>
<P>　　SELECT(没有FOR UPDATE子句）<BR>　　LOCK TABLE<BR>　　SET ROLE<BR>　　ALTER SYSTEM<BR>　　ALTER ALARM </P>
<P>　　即使没有改变任何数据，READ ONLY事务依然必须使用一个COMMIT或ROLLBACK以结束整个事务。</P>
<P>　　SET TRANSCTION的另外一个应用是在回滚时直接使用回滚段（ROLLBACK SEGMENT）。回滚段是ORACLE的一个特殊的数据对象，回滚段的头部包含正在使用该回滚段事务的信息。当用户回滚事务（ROLLBACK）时，ORACLE将会利用回滚段中的数据前影像来将修改的数据恢复到原来的值。oracle用round-robin给事务随机分配回滚段。一个大的事务可以分配任何回滚段，这也许会导致回滚段的大小变得很大。因此要避免让大的事务随机分配回滚段。</P>
<P>　　事务以SET TRANSACTION开始,象下面这样：</P><PRE>        SET TRANSACTION USE ROLLBACK SEGMENT rb_large; </PRE>
<P>　　rb_large是一个大的回滚段的名称，现在就给一个大的事务分配了一个大的回滚段，其他的小的回滚段将不由动态空间管理，这样就更有效率。</P>
<P>　　下面我们看一个例子.我们有一个回滚段表空间大小是2G，在高峰时期需要10个回滚段以满足用户的需要，这些高峰在线用户只有小的事务。一周我们连续运行了4个大的事务，这些事务需要删除和加载数据，每一个撤销需要1G，回滚段的大小如下：</P>
<BLOCKQUOTE>rb_large(initial 100M minextenta 2)<BR>rb1 (initial 1M next minextents 5) <BR>rb2 (initial 1M next minextents 5)<BR>rb3 (initial 1M next minextents 5)<BR>rb4 (initial 1M next minextents 5)<BR>rb5 (initial 1M next minextents 5)<BR>rb6 (initial 1M next minextents 5)<BR>rb7 (initial 1M next minextents 5)<BR>rb8 (initial 1M next minextents 5)<BR>rb9 (initial 1M next minextents 5)<BR>rb10 (initial 1M next minextents 5)</BLOCKQUOTE>
<P>　　所有的都非常恰当的安排在2G的表空间中，如果我们缺省的round-robin给事务分配回滚段，4个大事务将有4个独立的回滚段，每个回滚段的大小将是1G,如果这样我们的2G表空间就不够，而数据库管理员就不得不在夜晚2点起来工作，每个事务都由以下面的语句开始： <PRE>        SET TRANSACTION USE ROLLBACK SEGMENT rb_large;</PRE>
<P>　　现在 4个事务重用相同的表空间，保正4个回滚段的表空间在2G以内。数据库管理员可以睡到天亮。 
<H4>　　建立和修改用户</H4>
<P>　　CREATE USER 语句将建立一个用户。当一个用户连接到ORACLE数据库时，它必须被验证。ORACLE中验证有三种类型： 
<P>　　　Database<BR>　　　external<BR>　　　Global 
<P>　　缺省是数据库验证，当用户连接到数据库时，oracle将检测用户是否是数据库的合法用户，并且要提供正确的password.external验证，oracle将只检测用户是否是合法用户，password已经被网络或系统验证了。global验证也是只检测是否是合法用户，password由oraclesecurity server验证。 
<H5>　　Database验证用户账号</H5>
<P>　　数据库验证账号是张好的缺省类型，也是最普通的类型。建立一个账号是piyush,口令是welcome的账号，只需执行下面的命令： <PRE>        CREATE USE piyush IDENTIFIED BY welcome </PRE>
<P>　　piyush可以通过下面的语句将口令改变为saraswatt： <PRE>        ALTER USER piyush IDENTIFIED BY saraswati;</PRE>
<H5>　　外部验证用户账号</H5>
<P>　　用户账号进入数据库时可以不提供口令，这种情况下代替数据库识别口令的是客户端操作系统。外部验证账号有时也叫OPS$账号，当他们最初在oracle6开始介绍时，oracle账号都有关键字前缀OPS$,这也就是为什么init.ora 参数os_authent_prefix是OPS$--默认特征与oracle6保持一致。os_authent_prefix定义的字符串必须被预处理为用于Oracle外部识别账号的操作系统账号名。创建操作系统用户appl的语句是： <PRE>        CREATE USER ops$appl IDENTIFIED EATERNALLY;</PRE>
<P>　　但在通常情况下，os_authent_prefix将被设置为空，像下面这样： <PRE>        CREATE USER appl IDENTIFIED EATERNALLY;</PRE>
<P>　　这样效果是一样的,关键字IDENTIFIED EXTERNALLY告诉ORACLE这是一个外部识别账号。 
<H5>　　GLOBAL用户账号</H5>
<P>　　GLOBAL类型的用户账号数据库不检测口令，而是由X.509目录服务器检测口令。创建一个GLOBAL类型的用户账号的方法是： <PRE>        CREATE USER scott IDENTIFIED GLOBALLY AS "CN=scott,OU=divisional,O=sybex,C=US" </PRE>
<P>　　关键字IDENTIFIED GLOBALLY AS表示建立的是一个GLOBAL类型的用户账号. 
<H5>　　创建和更改用户账号</H5>
<P>　　CREATE USER 用于建立用户账号和给用户账号的属性赋值。ALTER USER用于更改用户账号和属性。但CREATE USER语句必须包括用户名和口令。 
<P>　　有部分属性能用CREATER USER和ALTER USER语句设置，下面对是这些的属性具体描述： 
<P>　　<B>给用户分配缺省表空间</B> 
<P>　　表空间（tablespace)是放置表、索引、丛等用户对象的。如果在create user语句中没有包含表空间，那么缺省的是系统表空间。 
<BLOCKQUOTE><PRE>CREATE USER piyush IDENTIFIED BY saraswati DEFAULTE TABLESPACE user_data;
ALTER USER manoj DEFAULTE TABLESPACE dev1_data; </PRE></BLOCKQUOTE>
<P>　　<B>给用户分配临时表空间</B> 
<P>　　临时表空间，顾名思义是临时存放表、索引等用户对象的临时段。建立方法一样 
<BLOCKQUOTE><PRE>CREATE USER piyush IDENTIFIED BY saraswati Temporary TABLESPACE user_data;
ALTER USER manoj Temporary TABLESPACE dev1_data; </PRE></BLOCKQUOTE>
<P>　　<B>给用户分配表空间的使用定额</B> 
<P>　　使用定额限制用户在表空间中使用磁盘的数量。定额可以按字节、千字节、兆字节或者无限制来制定。 
<BLOCKQUOTE><PRE>CREATE USER piyush IDENTIFIED BY saraswati<BR>  DEFAULT TABLESPACE user_data<BR>  QUOTA UNLIMITED ON user_data<BR>  QUOTA 20M ON tools;<BR>ALTER USER manoj QUOTA 2500K ON tools; </PRE></BLOCKQUOTE>
<P>　　<B>给用户分配一个简表</B> 
<P>　　简表可以限制用户在会话时消耗的资源。这些资源包括：连接数据库的时间，空闲时间，每次会话的逻辑读数据的数量等等，缺省的简表对资源无限制。 
<BLOCKQUOTE><PRE>CREATE USER piyush IDENTIFIED BY saraswati PROFILE TABLESPACE user_data;
ALTER USER manoj Temporary TABLESPACE dev1_data;</PRE></BLOCKQUOTE>
<P>　　<B>为用户响应指定角色</B> 
<P>　　这个属性只能由ALTER USER语句设置，试图用CREATE USER语句设置将回返回一个例外。 <PRE>        ALTER USER manoj DEFAULT ROLE ALL EXCEPT salary_adm; </PRE>
<P>　　<B>为用户的password设定到期时间以便在用户下次登录时更改 </B>
<P>　　当用户的password到期，在下一次登录时将强迫修改password，oracle提示用户输入旧的password,然后输入新的password。这项功能常用于新用户，当新用户用缺省的password登录时必须修改立即修改password. <PRE>        ALTER USER manoj IDENTIFIED BY welcome;
        ALTER USER manoj PASSWORD EXPIRE; </PRE>
<P>　　<B>锁定账号，使用户不能登录 </B><PRE>        ALTER USER ql AC COUNT LOCK&nbsp;;</PRE>
<P>　　<B>对账号解锁，以便用户能登录数据库</B> <PRE>        ALTER USER ql ACCOUNT UNLOCK </PRE>
<H4>　　权限和角色</H4>
<P>　　权限允许用户访问属于其它用户的对象或执行程序，ORACLE系统提供三种权限： 
<P>　　　Object 对象级<BR>　　　System 系统级<BR>　　　Role 角色级 
<P>　　这些权限可以授予给用户、特殊用户public或角色，如果授予一个权限给特殊用户"Public"（用户public是oracle预定义的，每个用户享有这个用户享有的权限）,那么就意味作将该权限授予了该数据库的所有用户。 
<P>　　对管理权限而言，角色是一个工具，权限能够被授予给一个角色，角色也能被授予给另一个角色或用户。用户可以通过角色继承权限，除了管理权限外角色服务没有其它目的。权限可以被授予，也可以用同样的方式撤销。 
<H5>　　建立和使用角色</H5>
<P>　　如前所诉，角色存在的目的就是为了使权限的管理变得轻松。建立角色使用CREATE ROLE语句，他的语法如下： 
<BLOCKQUOTE><PRE>CREATE ROLE role_name IDENTIFIED BY password
CREATE ROLE role_name IDENTIFIED EXTERNALLY<BR>CREATE ROLE role_name IDENTIFIED GLOBALLY </PRE></BLOCKQUOTE>
<P>　　缺省情况下建立的角色没有password或者其他的识别。如果使用IDENTIFIED BY 子句建立，那么角色不会自动响应，必须用SET ROLE激活。 
<BLOCKQUOTE><PRE> SET ROLE role_name IDENTIFIED BY password </PRE></BLOCKQUOTE>
<P>　　EXTERNALLY和GLOBALLY类型的角色由操作系统和ORACLE Service server验证。通常用户需要权限修改应用程序中使用的表单中的数据，但是只有在应用程序运行时而不是在使用ad hoc工具时，这种上下文敏感安全可以通过有PASSWORD的角色来实现。当用户在应用程序内部连结数据库时，代码将执行SET ROLE命令，通过安全验证。所以用户不需要知道角色的password,也不需要自己输入SET ROLE命令。 
<H5>　　对象权限</H5>
<P>　　对象权限就是指在表、视图、序列、过程、函数或包等对象上执行特殊动作的权利。有九种不同类型的权限可以授予给用户或角色。如下表： 
<TABLE cellSpacing=0 cellPadding=4 width=600 align=center border=1>
<TBODY>
<TR>
<TD>权限</TD>
<TD>ALTER</TD>
<TD>DELETE</TD>
<TD>EXECUTE</TD>
<TD>INDEX</TD>
<TD>INSERT</TD>
<TD>READ</TD>
<TD>REFERENCE</TD>
<TD>SELECT</TD>
<TD>UPDATE </TD></TR>
<TR>
<TD>Directory</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>yes</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD></TR>
<TR>
<TD>function</TD>
<TD>no</TD>
<TD>no</TD>
<TD>yes </TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD></TR>
<TR>
<TD>procedure</TD>
<TD>no</TD>
<TD>no</TD>
<TD>yes</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD></TR>
<TR>
<TD>package</TD>
<TD>no</TD>
<TD>no</TD>
<TD>yes</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD></TR>
<TR>
<TD>DB Object</TD>
<TD>no </TD>
<TD>no </TD>
<TD>yes</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD></TR>
<TR>
<TD>Libary</TD>
<TD>no</TD>
<TD>no</TD>
<TD>yes</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD></TR>
<TR>
<TD>Operation&nbsp;</TD>
<TD>no</TD>
<TD>no</TD>
<TD>yes</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD></TR>
<TR>
<TD>Sequence</TD>
<TD>yes</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD>
<TD>no</TD></TR>
<TR>
<TD>Table</TD>
<TD>yes</TD>
<TD>yes</TD>
<TD>no</TD>
<TD>yes</TD>
<TD>yes</TD>
<TD>no</TD>
<TD>yes</TD>
<TD>yes</TD>
<TD>yes</TD></TR>
<TR>
<TD>Type</TD>
<TD>&nbsp;</TD>
<TD>&nbsp;</TD>
<TD>yes</TD>
<TD>&nbsp;</TD>
<TD>&nbsp;</TD>
<TD>&nbsp;</TD>
<TD>&nbsp;</TD>
<TD>&nbsp;</TD>
<TD>&nbsp;</TD></TR>
<TR>
<TD height=23>View</TD>
<TD>&nbsp;</TD>
<TD>yes</TD>
<TD>&nbsp;</TD>
<TD>&nbsp;</TD>
<TD>yes</TD>
<TD>&nbsp;</TD>
<TD>&nbsp;</TD>
<TD>yes</TD>
<TD>yes</TD></TR></TBODY></TABLE>
<P>　　对象由不止一个权限，特殊权限ALL可以被授予或撤销。如TABLE的ALL权限就包括： 
<P>　　　SELECT,INSERT,UPDATE和DELETE,还有INDEX,ALTER,和REFERENCE。 
<P>　　如何看这个表我们以ALTER权限为例进行说明 
<P>　　<B>ALTER权限</B> 
<P>　　允许执行ALTER TABLE和LOCK TABLE操作，ALTER TABLE可以进行如下操作： 
<P>　　　　. 更改表名<BR>　　　　. 增加或删除列<BR>　　　　. 改变列的数据类型或大小<BR>　　　　. 将表转变为分区表 
<P>　　在SEQUENCE上的ALTER权限允许执行ALTER Sequence语句，重新给sequence分配最小值、增量和缓冲区大小。 
<P>　　<B>系统权限</B> 
<P>　　系统权限需要授予者有进行系统级活动的能力，如连接数据库，更改用户会话、建立表或建立用户等等。你可以在数据字典视图SYSTEM_PRIVILEGE_MAP上获得完整的系统权限。对象权限和系统权限都通过GRANT语句授予用户或角色。需要注意的是在授予对象权限时语句应该是WITH GRANT OPTION子句，但在授予系统权象时语句是WITH ADMIN OPTION，所以在你试图授予系统权限时，使用语句WITH GRANT OPTION系统会报告一个错误：ONLY ADMIN OPTION can be specified。在考试中要特别注意这个语法和错误信息。 
<P>　　<B>角色和角色权限 </B>
<P>　　角色权限就是将属于用户的权限授予一个角色。任何权限都可以授予给一个角色。授予系统权限给被授予者必须使用WITH_ADMIN_OPTION子句，在会话期间通过SET ROLE语句授予或撤销角色权限。然而，角色权限不能依靠存储在SQL中的权限。如果函数、程序、包、触发器或者方法使用另一个计划拥有的对象，那么就必须直接给对象的拥有者授权，这是因为权限不会在会话之间改变。 
<P>　　<B>授予和撤销权限</B> 
<P>　　给用户或者角色授予权限使用GRANT 语句,GRANT语句的语法如下： <PRE>        GRANT ROLE（或system privilege） TO user(role,Public) WITH ADMIN OPTION（可选） </PRE>
<P>　　对象权限被授予 WITH GRANT OPTION， 
<P>　　<B>权限和数据字典</B> 
<P>　　数据字典是ORACLE存储有关数据库结构信息的地方，数据本身存放在其他地方，数据字典由表和视图组成。在考试中关于数据字典最容易考的内容是：查看那一类权限已经被授予。比如DBA_TAB_PRIV包含了用户授予给另一用户的对象权限和在授予时是否带有WITH GRANT OTPION子串的信息。注意DBA_TAB_PRIV不仅仅包含了对表的权限的关系，他还包括函数、包、队列等等上的权限的关系。下表列出了所有的权限和角色的数据字典视图： 
<P>　　表： 权限的数据字典视图 
<TABLE cellSpacing=0 cellPadding=4 width=600 align=center border=1>
<TBODY>
<TR>
<TD width=170>视图</TD>
<TD width=408>作用</TD></TR>
<TR>
<TD>ALL_COL_PRIVS</TD>
<TD>表示列上的授权，用户和PUBLIC是被授予者 </TD></TR>
<TR>
<TD>ALL_COL_PRIVS_MADE</TD>
<TD>表示列上的授权，用户是属主和被授予者</TD></TR>
<TR>
<TD>ALL_COL_RECD</TD>
<TD>表示列上的授权，用户和PUBLIC是被授予者</TD></TR>
<TR>
<TD>ALL_TAB_PRIVS</TD>
<TD>表示对象上的授权，用户是PUBLIC或被授予者或用户是属主 </TD></TR>
<TR>
<TD>ALL_TAB_PRIVS_MADE</TD>
<TD>表示对象上的权限，用户是属主或授予者 </TD></TR>
<TR>
<TD>ALL_TAB_PRIVS_RECD</TD>
<TD>表示对象上的权限, 用户是PUBLIC或被授予者 </TD></TR>
<TR>
<TD>DBA_COL_PRIVS</TD>
<TD>数据库列上的所有授权 </TD></TR>
<TR>
<TD>DBA_ROLE_PRIVS</TD>
<TD>显示已授予用户或其他角色的角色</TD></TR>
<TR>
<TD>DBA_SYS_PRIVS</TD>
<TD>已授予用户或角色的系统权限</TD></TR>
<TR>
<TD>DBA_TAB_PRIVS</TD>
<TD>数据库对象上的所有权限</TD></TR>
<TR>
<TD>ROLE_ROLE_PRIVS</TD>
<TD>显示已授予用户的角色</TD></TR>
<TR>
<TD>ROLE_SYS_PRIVS</TD>
<TD>显示通过角色授予用户的系统权限</TD></TR>
<TR>
<TD>ROLE_TAB_PRIVS</TD>
<TD>显示通过角色授予用户的对象权限</TD></TR>
<TR>
<TD>SESSION_PRIVS</TD>
<TD>显示用户现在可利用的所有系统权限 </TD></TR>
<TR>
<TD>USER_COL_PRIVS</TD>
<TD>显示列上的权限，用户是属主、授予者或被授予者</TD></TR>
<TR>
<TD>USER_COL_PRIVS_MADE</TD>
<TD>显示列上已授予的权限，用户是属主或授予者</TD></TR>
<TR>
<TD>USER_COL_PRIVS_RECD</TD>
<TD>显示列上已授予的权限，用户是属主或被授予者</TD></TR>
<TR>
<TD>USER_ROLE_PRIVS</TD>
<TD>显示已授予给用户的所有角色</TD></TR>
<TR>
<TD>USER_SYS_PRIVS</TD>
<TD>显示已授予给用户的所有系统权限</TD></TR>
<TR>
<TD>USER_TAB_PRIVS</TD>
<TD>显示已授予给用户的所有对象权限</TD></TR>
<TR>
<TD>USER_TAB_PRIVS_MADE</TD>
<TD>显示已授予给其他用户的对象权限，用户是属主 </TD></TR>
<TR>
<TD>USER_TAB_PRIVS_RECD</TD>
<TD>显示已授予给其他用户的对象权限，用户是被授予者</TD></TR></TBODY></TABLE>
<P> 
<P>文章来源：yesky </P><img src ="http://www.blogjava.net/sgsoft/aggbug/991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-04 00:04 <a href="http://www.blogjava.net/sgsoft/articles/991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle数据库及应用程序优化</title><link>http://www.blogjava.net/sgsoft/articles/990.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Thu, 03 Feb 2005 16:03:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/990.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/990.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/990.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/990.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/990.html</trackback:ping><description><![CDATA[<H2 align=center>Oracle数据库及应用程序优化</H2>
<P>摘 要:本文对ORACLE数据库及ORACLE应用程序的优化，进行了全面的分析与研究，并提出了自己的一些建议。</P>
<P>关 键 词:ORACLE，优化，数据库，SQL</P>
<H3>1 引言</H3>
<P>　　随着信息化时代的到来，人们开始广泛地使用数据库技术对大量而复杂的信息进行科学高效的管理。在数据库领域中的各种应用软件大量涌现，有Visual Foxpro，Power Builder等等，但其中ORACLE是这个领域中最优秀也是最流行的大型数据库应用软件。本文就在ORACAL中如何优化数据库及其应用程序进行了研究。</P>
<H3>2 优化数据库</H3>
<H4>2.1 优化设置控制文件的个数，位置及其备份</H4>
<P>建议CONTROL_FILE初始化参数中指定多个文件应大于２，并将控制文件镜像到不同位置，并要把这些控制文件备份到安全的磁盘中。</P>
<H4>2.2 优化设计表空间，数据文件的大小及位置</H4>
<H5>2.2.1 设计表空间</H5>
<P>　　尽量把同一时间对磁盘的读写操作分散开，如对一个表中数据进行更新时，数据库将同时去读该表中的数据和该表上的索引信息，如果把表的数据信息和索引信息都放在同一个数据文件中，则数据库的速度将会变慢。最好是把数据信息和索引信息分别放在不同磁盘的两个数据文件中，此时数据库对磁盘的读写操作将分散在两个磁盘上，速度将得到显著提高。因此在设计数据库的表空间和数据文件时，首先给表和表的索引分别创建两个表空间（存放用户数据的数据表空间和存放表索引的索引表空间）。另外，还根据该系统的数据量的大小及系统中的数据的性质不同，再考虑创建几个数据表空间或者给数据表空间添加几个数据文件。</P>
<H5>2.2.2 设计数据文件的大小</H5>
<P>　　把记录大小相当的表放在同一个表空间中，这时一个表空间的存储参数设置，可以保证表中的记录都放在一个范围中，避免了一条记录跨范围存放，可以明显数据库的性能。</P>
<H5>2.2.3 设计数据文件的位置</H5>
<P>　　为了避免磁盘的I/O操作冲突，应把数据文件创建在不同位置。</P>
<H4>2.3 优化设计重演日志文件</H4>
<H5>2.3.1 重演日志文件的大小</H5>
<P>　　由于数据库在利用重演日志文件时是循环使用它们的，而且当LGWR进程在两个日志文件切换时，将自动产生一个检测点，所以重演日志文件的大小会直接影响到检测点出现的频率。而由于在数据库检测点时，对用户而言，数据库的速度会受影响，所以检测点的出现频率大，或者检测点正好出现在数据库处理数据高峰期，将会极大影响数据库的性能。因此，重演日志文件的大小设计，应考虑检测点出现的频率以及检测点应避开数据库处理数据的高峰期。</P>
<H5>2.3.2 重演日志文件组的个数</H5>
<P>　　在ARCHIVELOG模式下时，适当增加重演日志文件组的个数，可以降低数据库存档日志文件的频率。</P>
<H5>2.3.3 重演日志文件的存档</H5>
<P>　　应把重演日志文件的存档之处设置在磁盘读写更快的物理设备上。这样可以减少日志文件的存档时间。</P>
<H4>2.4 回滚段的优化设计</H4>
<H5>2.4.1 回滚段数目的设计</H5>
<P>　　要考虑数据库需要支持的并发事务的数目，因为每个回滚段有其所能支持的最大事务数，如果回滚段数目不够多，则有些新事务被迫要等待，将影响数据库的性能。</P>
<H5>2.4.2 回滚段大小的设计</H5>
<P>　　要考虑该回滚段能容纳数据库可能的最大事务的回滚项数。</P>
<H4>2.5 优化数据库使用的内存配置</H4>
<P>　　要调整数据库的高速缓冲区，共享池、重演日志缓冲区和进程全局区的大小平衡问题。</P>
<H3>3 优化应用程序</H3>
<H4>3.1 采取统一的SQL程序</H4>
<P>　　因为ORACLE在执行SQL文时，首先将当前要执行的SQL文与公共区域中保存的先前执行过的SQL文进行比较，SQL文相同时，就会跳过当前要执行的SQL文的解析处理，这样通过减少解析次数就加快SQL文的执行速度。</P>
<H4>3.2 选取合适的SQL代码</H4>
<P>　　在进行数据库操作时，同一结果可以用很多方法来实现。我们应当选取合适的SQL代码，使其更容易明了，并且运行速度更快。</P>
<H4>3.3 明确列名</H4>
<P>　　使用SELECT取得的列名一定要明确指定，并且应当使抽出的记录要尽量少。用SORT等的场合，因为ORACLE将必要的列的值放到WORK领域，因此减少列数也就节约了I/O回数。</P>
<H4>3.4 注意结合索引的顺序</H4>
<P>　　由于列的顺序不同而导致索引的作用效果不同。例如：(AGE，ADDRESS)顺序的结合索引。</P>
<P>WHERE AGE=28 AND ADDRESS="BEI JING" &amp;结合索引有效<BR>WHERE AGE=28 &amp;结合索引有效<BR>WHERE ADDRESS="BEI JING" &amp;结全索引无效</P>
<H4>3.5 注意WHERE的使用</H4>
<H5>3.5.1 索引列不要使用函数</H5>
<P>　　由于索引列一旦使用了函数，索引就会变无效，因此在能用索引的情况下，尽量改变程序来利用索引。如：</P>
<P>WHERE SUBSTR(TELNO，2，2)="88"改为WHERE TELNO LIKE "88%"较好。</P>
<H5>3.5.2 索引列不要使用NOT</H5>
<P>　　由于索引列一旦使用不等于，索引就会变得无效，最后导致速度变慢。</P>
<H5>3.5.3 不要用NULL</H5>
<P>　　如果用了NULL，索引就会无效，变成全表检索，影响处理速度。</P>
<H5>3.5.4 不要对索引列进行计算</H5>
<P>　　如果对索引列进行计算，索引就会无效，也后导致速度变慢。</P>
<H3>4.结束语</H3>
<P>　　本文所提出的优化方法，能够起到提高ORACLE数据库性能以及提高ORACLE应用程序执行效率的作用。这仅是个人在实际工作中的经验总结，希望能够对广大同行起到一定帮助作用。 </P><img src ="http://www.blogjava.net/sgsoft/aggbug/990.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-04 00:03 <a href="http://www.blogjava.net/sgsoft/articles/990.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle数据库中索引的维护</title><link>http://www.blogjava.net/sgsoft/articles/989.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Thu, 03 Feb 2005 16:02:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/989.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/989.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/989.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/989.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/989.html</trackback:ping><description><![CDATA[<P>本文只讨论Oracle中最常见的索引，即是B-tree索引。本文中涉及的数据库版本是Oracle8i。</P>
<H3>一. 查看系统表中的用户索引</H3>
<P>在Oracle中，SYSTEM表是安装数据库时自动建立的，它包含数据库的全部数据字典，存储过程、包、函数和触发器的定义以及系统回滚段。</P>
<P>一般来说，应该尽量避免在SYSTEM表中存储非SYSTEM用户的对象。因为这样会带来数据库维护和管理的很多问题。一旦SYSTEM表损坏了，只能重新生成数据库。我们可以用下面的语句来检查在SYSTEM表内有没有其他用户的索引存在。</P>
<BLOCKQUOTE><PRE>select count(*) from dba_indexes
  where tablespace_name = "SYSTEM"
  and owner not in ("SYS","SYSTEM")
</PRE></BLOCKQUOTE>
<H3>二. 索引的存储情况检查</H3>
<P>Oracle为数据库中的所有数据分配逻辑结构空间。数据库空间的单位是数据块（block）、范围（extent）和段（segment）。</P>
<P>Oracle数据块（block）是Oracle使用和分配的最小存储单位。它是由数据库建立时设置的DB_BLOCK_SIZE决定的。一旦数据库生成了，数据块的大小不能改变。要想改变只能重新建立数据库。（在Oracle9i中有一些不同，不过这不在本文讨论的范围内。）</P>
<P>Extent是由一组连续的block组成的。一个或多个extent组成一个segment。当一个segment中的所有空间被用完时，Oracle为它分配一个新的extent。</P>
<P>Segment是由一个或多个extent组成的。它包含某表空间中特定逻辑存储结构的所有数据。一个段中的extent可以是不连续的，甚至可以在不同的数据文件中。</P>
<P>一个object只能对应于一个逻辑存储的segment，我们通过查看该segment中的extent，可以看出相应object的存储情况。</P>
<P>（1）查看索引段中extent的数量：</P>
<BLOCKQUOTE><PRE>select segment_name, count(*) 
from dba_extents
where segment_type="INDEX"
  and owner=UPPER("&amp;owner") 
group by segment_name
/ </PRE></BLOCKQUOTE>
<P>（2）查看表空间内的索引的扩展情况：</P>
<BLOCKQUOTE><PRE>select substr(segment_name,1,20) "SEGMENT NAME", bytes, count(bytes) 
from dba_extents <BR>where segment_name in<BR>  ( select index_name from dba_indexes where tablespace_name=UPPER("&amp;表空间") )
group by segment_name, bytes
order by segment_name
/</PRE></BLOCKQUOTE>
<H3>三. 索引的选择性</H3>
<P>索引的选择性是指索引列中不同值的数目与表中记录数的比。如果一个表中有2000条记录，表索引列有1980个不同的值，那么这个索引的选择性就是1980/2000=0.99。</P>
<P>一个索引的选择性越接近于1，这个索引的效率就越高。</P>
<P>如果是使用基于cost的最优化，优化器不应该使用选择性不好的索引。如果是使用基于rule的最优化，优化器在确定执行路径时不会考虑索引的选择性（除非是唯一性索引），并且不得不手工优化查询以避免使用非选择性的索引。</P>
<P>确定索引的选择性，可以有两种方法：手工测量和自动测量。</P>
<P>（1）手工测量索引的选择性</P>
<P>如果要根据一个表的两列创建两列并置索引，可以用以下方法测量索引的选择性：</P>
<P>　　列的选择性=不同值的数目/行的总数 /* 越接近1越好 */</P>
<BLOCKQUOTE><PRE>select count(distinct 第一列||"%"||第二列)/count(*) from 表名</PRE></BLOCKQUOTE>
<P>如果我们知道其中一列索引的选择性（例如其中一列是主键），那么我们就可以知道另一列索引的选择性。</P>
<P>手工方法的优点是在创建索引前就能评估索引的选择性。</P>
<P>（2）自动测量索引的选择性</P>
<P>如果分析一个表，也会自动分析所有表的索引。</P>
<P>第一，为了确定一个表的确定性，就要分析表。</P>
<BLOCKQUOTE><PRE>analyze table 表名 compute statistics</PRE></BLOCKQUOTE>
<P>第二，确定索引里不同关键字的数目：</P>
<BLOCKQUOTE><PRE>select distinct_keys from user_indexes where table_name="表名" and index_name="索引名"</PRE></BLOCKQUOTE>
<P>第三，确定表中行的总数：</P>
<BLOCKQUOTE><PRE>select num_rows from user_tables where table_name="表名"</PRE></BLOCKQUOTE>
<P>第四，索引的选择性=索引里不同关键字的数目/表中行的总数：</P>
<BLOCKQUOTE><PRE>select i.distinct_keys/t.num_rows from user_indexes i, user_tables t<BR>where i.table_name="表名" and i.index_name="索引名" and i.table_name=t.table_name</PRE></BLOCKQUOTE>
<P>第五，可以查询USER_TAB_COLUMNS以了解每个列的选择性。</P>
<P>表中所有行在该列的不同值的数目：</P>
<BLOCKQUOTE><PRE>select column_name, num_distinct from user_tab_columns where table_name="表名"</PRE></BLOCKQUOTE>
<P>列的选择性=NUM_DISTINCT/表中所有行的总数，查询USER_TAB_COLUMNS有助测量每个列的选择性，但它并不能精确地测量列的并置组合的选择性。要想测量一组列的选择性，需要采用手工方法或者根据这组列创建一个索引并重新分析表。</P>
<H3>四. 确定索引的实际碎片</H3>
<P>随着数据库的使用，不可避免地对基本表进行插入，更新和删除，这样导致叶子行在索引中被删除，使该索引产生碎片。插入删除越频繁的表，索引碎片的程度也越高。碎片的产生使访问和使用该索引的I/O成本增加。碎片较高的索引必须重建以保持最佳性能。</P>
<P>（1）利用验证索引命令对索引进行验证。</P>
<P>这将有价值的索引信息填入index_stats表。</P>
<BLOCKQUOTE><PRE>validate index 用户名.索引名</PRE></BLOCKQUOTE>
<P>（2）查询index_stats表以确定索引中删除的、未填满的叶子行的百分比。</P>
<BLOCKQUOTE><PRE>select name, del_lf_rows, lf_rows,
       round((del_lf_rows/(lf_rows+0.0000000001))*100) "Frag Percent"<BR>from index_stats</PRE></BLOCKQUOTE>
<P>（3）如果索引的叶子行的碎片超过10%，考虑对索引进行重建。</P>
<BLOCKQUOTE><PRE>alter index 用户名.索引名 rebuild
  tablespace 表空间名
  storage(initial 初始值 next 扩展值)
  nologging</PRE></BLOCKQUOTE>
<P>（4）如果出于空间或其他考虑，不能重建索引，可以整理索引。</P>
<BLOCKQUOTE><PRE> alter index用户名.索引名 coalesce</PRE></BLOCKQUOTE>
<P>（5）清除分析信息</P>
<BLOCKQUOTE><PRE>analyze index 用户名.索引名 delete statistics</PRE></BLOCKQUOTE>
<H3>五. 重建索引</H3>
<P>（1）检查需要重建的索引</P>
<P>根据以下几方面进行检查，确定需要重建的索引。</P>
<P>第一，查看SYSTEM表空间中的用户索引</P>
<P>为了避免数据字典的碎片出现，要尽量避免在SYSTEM表空间出现用户的表和索引。</P>
<BLOCKQUOTE><PRE>select index_name from dba_indexes 
where tablespace_name="SYSTEM" and owner not in ("SYS","SYSTEM")</PRE></BLOCKQUOTE>
<P>第二，确保用户的表和索引不在同一表空间内</P>
<P>表和索引对象的第一个规则是把表和索引分离。把表和相应的索引建立在不同的表空间中，最好在不同的磁盘上。这样可以避免在数据管理和查询时出现的许多I/O冲突。</P>
<BLOCKQUOTE><PRE>set linesize 120
col "OWNER" format a20
col "INDEX" format a30
col "TABLE" format a30
col "TABLESPACE" format a30
select i.owner "OWNER", i.index_name "INDEX", t.table_name "TABLE", 
       i.tablespace_name "TABLESPACE"
from dba_indexes i, dba_tables t
where i.owner=t.owner
  and i.table_name=t.table_name
  and i.tablespace_name=t.tablespace_name
  and i.owner not in ("SYS","SYSTEM")
  / </PRE></BLOCKQUOTE>
<P>第三，查看数据表空间里有哪些索引</P>
<P>用户的默认表空间应该不是SYSTEM表空间，而是数据表空间。在建立索引时，如果不指定相应的索引表空间名，那么，该索引就会建立在数据表空间中。这是程序员经常忽略的一个问题。应该在建索引时，明确的指明相应的索引表空间。</P>
<BLOCKQUOTE><PRE>col segment_name format a30
select owner, segment_name, sum(bytes) <BR>  from dba_segments<BR>  where tablespace_name="数据表空间名"<BR>    and segment_type="INDEX"<BR>  group by owner,segment_name<BR>/ </PRE></BLOCKQUOTE>
<P>第四，查看哪个索引被扩展了超过10次</P>
<P>随着表记录的增加，相应的索引也要增加。如果一个索引的next extent值设置不合理（太小），索引段的扩展变得很频繁。索引的extent太多，检索时的速度和效率就会降低。</P>
<BLOCKQUOTE><PRE>set linesize 100
col owner format a10
col segment_name format a30
col tablespace_name format a30
select count(*), owner, segment_name, tablespace_name 
from dba_extents
where segment_type="INDEX" 
  and owner not in ("SYS","SYSTEM")
group by owner,segment_name,tablespace_name
having count(*) &gt;10
order by count(*) desc
/</PRE></BLOCKQUOTE>
<P>（2）找出需要重建的索引后，需要确定索引的大小，以设置合理的索引存储参数。</P>
<BLOCKQUOTE><PRE>set linesize 120
col "INDEX" format a30
col "TABLESPACE" format a20
select owner "OWNER", segment_name "INDEX", tablespace_name "TABLESPACE", 
       bytes "BYTES/COUNT", sum(bytes) "TOTAL BYTES", 
       round(sum(bytes)/(1024*1024),0) "TOTAL M",
       count(bytes) "TOTAL COUNT"
  from dba_extents
  where segment_type="INDEX" 
    and segment_name in ("索引名1","索引名2", ......)
  group by owner,segment_name,segment_type,tablespace_name,bytes
  order by owner,segment_name
  /</PRE></BLOCKQUOTE>
<P>（3）确定索引表空间还有足够的剩余空间</P>
<P>确定要把索引重建到哪个索引表空间中。要保证相应的索引表空间有足够的剩余空间。</P>
<BLOCKQUOTE><PRE>select round(bytes/(1024*1024),2) free(M)
  from sm$ts_free
  where tablespace_name="表空间名"
/ </PRE></BLOCKQUOTE>
<P>（4）重建索引</P>
<P>重建索引时要注意以下几点：</P>
<P>a.如果不指定tablespace名，索引将建在用户的默认表空间。<BR>b.如果不指定nologging，将会写日志，导致速度变慢。由于索引的重建没有恢复的必要，所以，可以不写日志。<BR>c.如果出现资源忙，表明有进程正在使用该索引，等待一会再提交。</P>
<BLOCKQUOTE><PRE>alter index 索引名 rebuild
  tablespace 索引表空间名
  storage(initial 初始值 next 扩展值)
  nologging
  / </PRE></BLOCKQUOTE>
<P>（5）检查索引</P>
<P>对重建好的索引进行检查。</P>
<BLOCKQUOTE><PRE>select * from dba_extents where segment_name="索引名"
</PRE></BLOCKQUOTE>
<P>（6）根据索引进行查询，检查索引是否有效</P>
<P>使用相应的where条件进行查询，确保使用该索引。看看使用索引后的效果如何。</P>
<BLOCKQUOTE><PRE>select * from dba_ind_columns where index_name like "表名%"
</PRE></BLOCKQUOTE>
<P>然后，根据相应的索引项进行查询。</P>
<BLOCKQUOTE><PRE>select * from "表名%" where ......
</PRE></BLOCKQUOTE>
<P>（6）找出有碎片的表空间，并收集其碎片。</P>
<P>重建索引后，原有的索引被删除，这样会造成表空间的碎片。</P>
<BLOCKQUOTE><PRE>select "alter tablespace "||tablespace_name||" coalesce;"
  from dba_free_space_coalesced
  where percent_blocks_coalesced!=100
/ </PRE></BLOCKQUOTE>
<P>整理表空间的碎片。</P>
<BLOCKQUOTE><PRE>alter tablespace 表空间名 coalesce</PRE></BLOCKQUOTE><img src ="http://www.blogjava.net/sgsoft/aggbug/989.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-04 00:02 <a href="http://www.blogjava.net/sgsoft/articles/989.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>提高ORACLE数据库的查询统计速度</title><link>http://www.blogjava.net/sgsoft/articles/988.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Thu, 03 Feb 2005 16:01:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/988.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/988.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/988.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/988.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/988.html</trackback:ping><description><![CDATA[<H2 align=center>提高ORACLE数据库的查询统计速度</H2>
<P>大型数据库系统中往往要用到查询统计，但是对于数据量大的系统，用户在进行复杂的查询统计时往往感到速度很慢，不能满足应用要求，这就要求我们在设计数据库系统时进行合理设置，提高查询统计的速度。本文结合笔者的项目开发经验，阐述具体的设置方法。</P>
<P>以oracle7.33数据库系统为例，我们在开发大型oracle数据库系统时结合项目的特点，本着安全、高效的原则对数据库进行了一些物理设计，从而大大提高了数据库的查询统计速度。总结为如下几点：</P>
<P>　1）扩大数据表空间到500M，用于存放本系统的数据； 　　 <BR>　2）段盘区的初始大小为10K，增长大小为10K，增长幅度为1；<BR>　3）用户临时空间增大40M；<BR>　4）系统临时表空间和回滚段表空间增大40M，并且新建4个回滚段；<BR>　5）需要经常联结查询，而且数据量又大的库存表、名录表、收发料表放在一簇内；<BR>　6）提供定时备份，备份文件放在另外的机器上。</P>
<P>设置数据表空间的SQL语句如下：<BR>　CREATE TABLESPACE WXGL_DATA1 DATAFILE "WXGL_DATA1.ORA" SIZE 500M ONLINE;</P>
<P>增加系统临时表空间和回滚段表空间的SQL语句如下：<BR>　ALTER TABLESPACE TEMPORARY_DATA ADD DATAFILE "TMP2ORCL.ORA" SIZE 40M;<BR>　ALTER TABLESPACE ROLLBACK_DATA ADD DATAFILE "RBS2ORCL.ORA" SIZE 40M;</P>
<P>将数据空间设置在指定的数据文件的SQL语句如下：<BR>　CREATE USER ZBGL IDENTIFIED BY ZBGL;<BR>　GRANT DBA TO ZBGL;<BR>　ALTER USER ZBGL DEFAULT TABLESPACE WXGL_DATA1 TEMPORARY TABLESPACE TEMPORARY_DATA;</P>
<P>将数据量大的库存表等放在一簇内的SQL语句如下：<BR>　KCB = "CREATE TABLE QC_KCB( " <BR>　　 +" CKNM NUMBER(8) ," <BR>　　 +" QCNM NUMBER(10) ," <BR>　　 +" CKKC NUMBER(12,2)," <BR>　　 +" SNCKKC NUMBER(12,2)," <BR>　　 +" LDJ NUMBER(12,2)," <BR>　　 +" BZ VARCHAR(100)," <BR>　　 +" PRIMARY KEY(CKNM,QCNM))" <BR>　　 +" TABLESPACE WXGL_DATA1 " ;（大数据量的库存表等放在WXGL_DATA1) <BR>　QCFL = "CREATE TABLE QC_QCFL " <BR>　　 + "(FLBH NUMBER(2) PRIMARY KEY," <BR>　　 + " FLMC VARCHAR(20) " <BR>　　 + " ) " <BR>　　 +" TABLESPACE WXGL_DATA2 " ;(其他表放在WXGL_DATA2）</P><img src ="http://www.blogjava.net/sgsoft/aggbug/988.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-04 00:01 <a href="http://www.blogjava.net/sgsoft/articles/988.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE数据库的统计数据及其生成方式</title><link>http://www.blogjava.net/sgsoft/articles/987.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Thu, 03 Feb 2005 16:00:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/987.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/987.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/987.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/987.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/987.html</trackback:ping><description><![CDATA[<H2 align=center>ORACLE数据库的统计数据及其生成方式</H2>
<P>ORACLE数据库的PL/SQL语句执行的优化器，有基于代价的优化器（CBO）和基于规则的优化器（RBO）。</P>
<P>RBO的优化方式，依赖于一套严格的语法规则，只要按照规则写出的语句，不管数据表和索引的内容是否发生变化，不会影响PL/SQL语句的"执行计划"。</P>
<P>CBO自ORACLE7版被引入，ORACLE自7版以来采用的许多新技术都是只基于CBO的，如星型连接排列查询，哈希连接查询，反向索引，索引表，分区表和并行查询等。CBO计算各种可能"执行计划"的"代价"，即cost，从中选用cost最低的方案，作为实际运行方案。各"执行计划"的cost的计算根据，依赖于数据表中数据的统计分布，ORACLE数据库本身对该统计分布是不清楚的，须要分析表和相关的索引，才能搜集到CBO所需的数据。 <BR>CBO是ORACLE推荐使用的优化方式，要想使用好CBO，使SQL语句发挥最大效能，必须保证统计数据的及时性。</P>
<P>统计信息的生成可以有完全计算法和抽样估算法。SQL例句如下： <BR>完全计算法： analyze table abc compute statistics; <BR>抽样估算法(抽样20%)： analyze table abc estimate statistics sample 20 percent; <BR>对表作完全计算所花的时间相当于做全表扫描，抽样估算法由于采用抽样，比完全计算法的生成统计速度要快，如果不是要求要有精确数据的话，尽量采用抽样分析法。建议对表分析采用抽样估算，对索引分析可以采用完全计算。</P>
<P>我们可以采用以下两种方法，对数据库的表和索引及簇表定期分析生成统计信息，保证应用的正常性能。</P>
<P>1. 在系统设置定时任务，执行分析脚本。</P>
<P>在数据库服务器端，我们以UNIX用户oracle，运行脚本analyze，在analyze中，我们生成待执行sql脚本，并运行。（假设我们要分析scott用户下的所有表和索引）</P>
<P>Analyze脚本内容如下： </P>
<P>sqlplus scott/tiger &lt;&lt; EOF <BR>set pagesize 5000 <BR>set heading off <BR>SPOOL ANALYTAB.SQL <BR>SELECT "ANALYZE TABLE SCOTT."||TABLE_NAME||" ESTIMATE STATISTICS SAMPLE 20 PERCENT ;" FROM USER_TABLES； <BR>SPOOL OFF <BR>SPOOL ANALYIND.SQL <BR>SELECT "ANALYZE TABLE SCOTT."||TABLE_NAME||" ESTIMATE STATISTICS SAMPLE 20 PERCENT FOR ALL INDEXES;" FROM USER_TABLES； <BR>SPOOL OFF <BR>SPOOL ANALYZE.LOG <BR>@ANALYTAB.SQL <BR>@ANALYIND.SQL <BR>SPOOL OFF <BR>EXIT&nbsp;&nbsp;</P>
<P>在UNIX平台上crontab加入，以上文件，设置为每个月或合适的时间段运行。</P>
<P>2. 利用ORACLE提供的程序包（PACKAGE）对相关的数据库对象进行分析。 </P>
<P>有以下的程序包可以对表，索引，簇表进行分析。 </P>
<P>包中的存储过程的相关参数解释如下：</P>
<P>TYPE可以是：TABLE，INDEX，CLUSTER中其一。 <BR>SCHEMA为：TABLE，INDEX，CLUSTER的所有者，NULL为当前用户。 <BR>NAME为：相关对象的名称。 <BR>METHOD是：ESTIMATE，COMPUTE，DELETE中其一，当选用ESTIMATE， <BR>下面两项，ESTIMATE_ROWS和ESTIMATE_PERCENT不能同时为空值。 <BR>ESTIMATE_ROWS是：估算的抽样行数。 <BR>ESTIMATE_PERCENT是：估算的抽样百分比。 <BR>METHOD_OPT是：有以下选项， <BR>FOR TABLE /*只统计表*/ <BR>[FOR ALL [INDEXED] COLUMNS] [SIZE N] /*只统计有索引的表列*/ <BR>FOR ALL INDEXES /*只分析统计相关索引*/ <BR>PARTNAME是：指定要分析的分区名称。</P>
<P>1)&nbsp;&nbsp;<BR>DBMS_DDL.ANALYZE_OBJECT( <BR>TYPE VARCHAR2, <BR>SCHEMA VARCHAR2, <BR>NAME VARCHAR2, <BR>METHOD VARCHAR2, <BR>ESTIMATE_ROWS NUMBER DEFAULT NULL, <BR>ESTIMATE_PERCENT NUMBER DEFAULT NULL, <BR>METHOD_OPT VARCHAR2 DEFAULT NULL, <BR>PARTNAME VARCHAR2 DEFAULT NULL ) ; </P>
<P>该存储过程可对特定的表，索引和簇表进行分析。例如，对SCOTT用户的EMP表，进行50%的抽样分析，参数如下：</P>
<P>DBMS_DDL.ANALYZE_OBJECT("TABLE", "SCOTT", "EMP", "ESTIMATE", NULL,50);&nbsp;&nbsp;</P>
<P>2)&nbsp;&nbsp;<BR>DBMS_UTILITY.ANALYZE_SCHEMA ( <BR>SCHEMA VARCHAR2, <BR>METHOD VARCHAR2, <BR>ESTIMATE_ROWS NUMBER DEFAULT NULL, <BR>ESTIMATE_PERCENT NUMBER DEFAULT NULL, <BR>METHOD_OPT VARCHAR2 DEFAULT NULL ) ; <BR>DBMS_UTILITY.ANALYZE_DATABASE ( <BR>METHOD VARCHAR2, <BR>ESTIMATE_ROWS NUMBER DEFAULT NULL, <BR>ESTIMATE_PERCENT NUMBER DEFAULT NULL, <BR>METHOD_OPT VARCHAR2 DEFAULT NULL );</P>
<P>其中，ANALYZE_SCHEMA用于对某个用户拥有的所有TABLE，INDEX和CLUSTER的分析统计。ANALYZE_DATABASE用于对整个数据库进行分析统计。</P>
<P>3) DBMS_STATS是在ORACLE8I中新增的程序包，它使统计数据的生成和处理更加灵活方便，并且可以并行方式生成统计数据。在程序包中的以下过程分别分析统计TABLE，INDEX，SCHEMA，DATABASE级别的信息。</P>
<P>DBMS_STATS.GATHER_TABLE_STATS <BR>DBMS_STATS.GATHER_INDEX_STATS <BR>DBMS_STATS.GATHER_SCHEMA_STATS <BR>DBMS_STATS.GATHER_DATABASE_STATS</P>
<P>在这里，我们以数据库JOB的方式，定时对数据库中SCOTT模式下所有的表和索引进行分析：</P>
<P>在SQL*PLUS下运行：</P>
<P>VARIABLE jobno number; <BR>BEGIN <BR>DBMS_JOBS.SUBMIT ( :jobno , <BR>" dbms_utility.analyze_schema ( "scott", "estimate", NULL, 20) ; ", <BR>sysdate, "sysdate+30"); <BR>commit; <BR>end; <BR>/ <BR>Statement processed. <BR>Print jobno <BR>JOBNO <BR>------------- <BR>16 </P>
<P>以上作业，每隔一个月用DBMS_UTILITY.ANALYZE_SCHEMA对用户SCOTT的所有表，簇表和索引作统计分析。</P><img src ="http://www.blogjava.net/sgsoft/aggbug/987.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-04 00:00 <a href="http://www.blogjava.net/sgsoft/articles/987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle专家调优秘密</title><link>http://www.blogjava.net/sgsoft/articles/986.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Thu, 03 Feb 2005 15:58:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/986.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/986.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/986.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/986.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/986.html</trackback:ping><description><![CDATA[<H2 align=center>Oracle专家调优秘密</H2>
<H3>前言</H3>
<P>在过去的十年中，Oracle已经成为世界上最专业的数据库之一。对于IT专家来说，就是要确保利用Oracle的强大特性来提高他们公司的生产力。最有效的方法之一是通过Oracle调优。它有大量的调整参数和技术来改进你的Oracle数据库的性能。</P>
<P>Oracle调优是一个复杂的主题。关于调优可以写整整一本书，不过，为了改善Oracle数据库的性能，有一些基本的概念是每个Oracle DBA都应该遵从的。 </P>
<P>在这篇简介中，我们将简要地介绍以下的 Oracle 主题： </P>
<P>-- 外部调整：我们应该记住Oracle并不是单独运行的。因此我们将查看一下通过调整Oracle服务器以得到高的性能。<BR>-- Row re-sequencing以减少磁盘I/O：我们应该懂得Oracle调优最重要的目标是减少I/O。 <BR>-- Oracle SQL调整。Oracle SQL调整是Oracle调整中最重要的领域之一，只要通过一些简单的SQL调优规则就可以大幅度地提升SQL语句的性能，这是一点都不奇怪的。<BR>-- 调整Oracle排序：排序对于Oracle性能也是有很大影响的。<BR>-- 调整Oracle的竞争：表和索引的参数设置对于UPDATE和INSERT的性能有很大的影响。</P>
<P>我们首先从调整Oracle外部的环境开始。如果内存和CPU的资源不足的话，任何的Oracle调整都是没有帮助的。</P>
<H3>外部的性能问题</H3>
<P>Oracle并不是单独运行的。Oracle数据库的性能和外部的环境有很大的关系。这些外部的条件包括有：<BR>　 ．CPU -- CPU 资源的不足令查询变慢。当查询超过了Oracle服务器的CPU性能时，你的数据库性能就受到CPU的限制。<BR>　 ．内存 -- 可用于Oralce的内存数量也会影响SQL的性能，特别是在数据缓冲和内存排序方面。<BR>　 ．网络 -- 大量的Net8通信令SQL的性能变慢。<BR>许多新手都错误的认为应该首先调整Oracle数据库，而不是先确认外部资源是否足够。实际上，如果外部环境出现瓶颈，再多的Oracle调整都是没有帮助的。 </P>
<P>在检查Oracle的外部环境时，有两个方面是需要注意的： <BR>　1 、当运行队列的数目超过服务器的CPU数量时，服务器的性能就会受到CPU的限制。补救的方法是为服务器增加额外的CPU或者关闭需要很多处理资源的组件，例如 Oracle Parallel Query 。<BR>　2 、内存分页。当内存分页时，内存容量已经不足，而内存页是与磁盘上的交换区进行交互的。补救的方法是增加更多的内存，减少Oracle SGA的大小，或者关闭Oracle的多线程服务器。</P>
<P>可以使用各种标准的服务器工具来得到服务器的统计数据，例如 vmstat,glance,top 和 sar 。 DBA的目标是确保数据库服务器拥有足够的CPU和内存资源来处理Oracle的请求。 </P>
<P>以下让我们来看一下Oracle的row-resequencing是如何能够极大地减少磁盘I/O的。</P>
<H3>Row-resequencing （行的重新排序）</H3>
<P>就象我们上面提到的，有经验的Oracle DBA都知道I/O是响应时间的最大组成部分。其中磁盘I/O特别厉害，因为当Oracle由磁盘上的一个数据文件得到一个数据块时，读的进程就必须等待物理I/O操作完成。磁盘操作要比数据缓冲慢10,000倍。因此，如果可以令I/O最小化，或者减少由于磁盘上的文件竞争而带来的瓶颈，就可以大大地改善Oracle数据库的性能。</P>
<P>如果系统响应很慢，通过减少磁盘I/O就可以有一个很快的改善。如果在一个事务中通过按一定的范围搜索 primary-key索引来访问表，那么重新以CTAS的方法组织表将是你减少I/O的首要策略。通过在物理上将行排序为和primary-key索引一样的顺序，就可以加快获得数据的速度。</P>
<P>就象磁盘的负载平衡一样，行的重新排序也是很简单的，而且也很快。通过与其它的DBA管理技巧一起使用，就可以在高I/O的系统中大大地减少响应的时间。</P>
<P>在高容量的在线事务处理环境中（online transaction processing，OLTP），数据是由一个primary索引得到的，重新排序表格的行就可以令连续块的顺序和它们的primary索引一样，这样就可以在索引驱动的表格查询中，减少物理I/O并且改善响应时间。这个技巧仅在应用选择多行的时候有用，或者在使用索引范围搜索和应用发出多个查询来得到连续的key时有效。对于随机的唯一primary-key（主键）的访问将不会由行重新排序中得到好处。</P>
<P>让我们看一下它是如何工作的。考虑以下的一个SQL的查询，它使用一个索引来得到100行：</P><PRE>    select salary from employee where last_name like 'B%'; </PRE>
<P>这个查询将会使用last_name_index，搜索其中的每一行来得到目标行。这个查询将会至少使用100次物理磁盘的读取，因为employee的行存放在不同的数据块中。</P>
<P>不过，如果表中的行已经重新排序为和last_name_index的一样，同样的查询又会怎样处理呢？我们可以看到这个查询只需要三次的磁盘I/O就读完全部100个员工的资料（一次用作索引的读取，两次用作数据块的读取），减少了97次的块读取。</P>
<P>重新排序带来的性能改善的程度在于在你开始的时候行的乱序性如何，以及你需要由序列中访问多少行。至于一个表中的行与索引的排序键的匹配程度，可以查看数据字典中的dba_indexes和dba_tables视图得到。</P>
<P>在dba_indexes的视图中，查看clustering_factor列。如果clustering_factor的值和表中的块数目大致一样，那么你的表和索引的顺序是一样的。不过，如果clustering_factor的值接近表中的行数目，那就表明表格中的行和索引的顺序是不一样的。</P>
<P>行重新排序的作用是不可以小看的。在需要进行大范围的索引搜索的大表中，行重新排序可以令查询的性能提高三倍。</P>
<P>一旦你已经决定重新排序表中的行，你可以使用以下的工具之一来重新组织表格。</P>
<P>　. 使用Oracle的Create Table As Select(CTAS)语法来拷贝表格 <BR>　. Oracle9i自带的表格重新组织工具</P>
<P>以下，我们来看以下 SQL 语句的调优。</P>
<H3>SQL调优</H3>
<P>Oracle的SQL调优是一个复杂的主题，甚至是需要整本书来介绍Oracle SQL调优的细微差别。不过有一些基本的规则是每个Oracle DBA都需要跟从的，这些规则可以改善他们系统的性能。SQL调优的目标是简单的：</P>
<P>　. 消除不必要的大表全表搜索：不必要的全表搜索导致大量不必要的I/O，从而拖慢整个数据库的性能。调优专家首先会根据查询返回的行数目来评价SQL。在一个有序的表中，如果查询返回少于40%的行，或者在一个无序的表中，返回少于7%的行，那么这个查询都可以调整为使用一个索引来代替全表搜索。对于不必要的全表搜索来说，最常见的调优方法是增加索引。可以在表中加入标准的B树索引，也可以加入bitmap和基于函数的索引。要决定是否消除一个全表搜索，你可以仔细检查索引搜索的I/O开销和全表搜索的开销，它们的开销和数据块的读取和可能的并行执行有关，并将两者作对比。在一些情况下，一些不必要的全表搜索的消除可以通过强制使用一个index来达到，只需要在SQL语句中加入一个索引的提示就可以了。 </P>
<P>　. 在全表搜索是一个最快的访问方法时，将小表的全表搜索放到缓存中，调优专家应该确保有一个专门的数据缓冲用作行缓冲。在Oracle7中，你可以使用alter table xxx cache语句，在Oracle8或以上，小表可以被强制为放到KEEP池中缓冲。</P>
<P>　. 确保最优的索引使用：对于改善查询的速度，这是特别重要的。有时Oracle可以选择多个索引来进行查询，调优专家必须检查每个索引并且确保Oracle使用正确的索引。它还包括bitmap和基于函数的索引的使用。</P>
<P>　. 确保最优的JOIN操作：有些查询使用NESTED LOOP join快一些，有些则是HASH join快一些，另外一些则是sort-merge join更快。</P>
<P>这些规则看来简单，不过它们占SQL调优任务的90%，并且它们也无需完全懂得Oracle SQL的内部运作。以下我们来简单概览以下Oracle SQL的优化。</P>
<P>我们首先简要查看 Oracle 的排序，并且看一看排序操作是如何影响性能的。</P>
<H3>调整 Oracle 的排序操作</H3>
<P>排序是SQL语法中一个小的方面，但很重要，在Oracle的调整中，它常常被忽略。当使用create index、ORDER BY或者GROUP BY的语句时，Oracle数据库将会自动执行排序的操作。通常，在以下的情况下Oracle 会进行排序的操作：<BR>　　使用Order by的SQL语句 <BR>　　使用Group by的SQL语句 <BR>　　在创建索引的时候 <BR>　　进行table join时，由于现有索引的不足而导致SQL优化器调用MERGE SORT </P>
<P>当与Oracle建立起一个session时，在内存中就会为该session分配一个私有的排序区域。如果该连接是一个专用的连接(dedicated connection)，那么就会根据init.ora中sort_area_size参数的大小在内存中分配一个Program Global Area(PGA)。如果连接是通过多线程服务器建立的，那么排序的空间就在large_pool中分配。不幸的是，对于所有的session，用做排序的内存量都必须是一样的，我们不能为需要更大排序的操作分配额外的排序区域。因此，设计者必须作出一个平衡，在分配足够的排序区域以避免发生大的排序任务时出现磁盘排序（disk sorts）的同时，对于那些并不需要进行很大排序的任务，就会出现一些浪费。当然，当排序的空间需求超出了sort_area_size的大小时，这时将会在TEMP表空间中分页进行磁盘排序。磁盘排序要比内存排序大概慢14,000 倍。</P>
<P>上面我们已经提到，私有排序区域的大小是有init.ora中的sort_area_size参数决定的。每个排序所占用的大小由init.ora中的sort_area_retained_size参数决定。当排序不能在分配的空间中完成时，就会使用磁盘排序的方式，即在Oracle实例中的临时表空间中进行。</P>
<P>磁盘排序的开销是很大的，有几个方面的原因。首先，和内存排序相比较，它们特别慢；而且磁盘排序会消耗临时表空间中的资源。Oracle还必须分配缓冲池块来保持临时表空间中的块。无论什么时候，内存排序都比磁盘排序好，磁盘排序将会令任务变慢，并且会影响Oracle实例的当前任务的执行。还有，过多的磁盘排序将会令free buffer waits的值变高，从而令其它任务的数据块由缓冲中移走。</P>
<P>接着，让我们看一下Oracle的竞争，并且看一下表的存储参数的设置是如何影响SQL UPDATE和INSERT语句的性能的。</P>
<H3>调整 Oracle 的竞争</H3>
<P>Oracle 的其中一个优点时它可以管理每个表空间中的自由空间。Oracle负责处理表和索引的空间管理，这样就可以让我们无需懂得Oracle的表和索引的内部运作。不过，对于有经验的Oracle调优专家来说，他需要懂得Oracle是如何管理表的extent和空闲的数据块。对于调整拥有高的insert或者update的系统来说，这是非常重要的。</P>
<P>要精通对象的调整，你需要懂得freelists和freelist组的行为，它们和pctfree及pctused参数的值有关。这些知识对于企业资源计划（ERP）的应用是特别重要的，因为在这些应用中，不正确的表设置通常是DML语句执行慢的原因。</P>
<P>对于初学者来说，最常见的错误是认为默认的Oracle参数对于所有的对象都是最佳的。除非磁盘的消耗不是一个问题，否则在设置表的pctfree和pctused参数时，就必须考虑平均的行长和数据库的块大小，这样空的块才会被有效地放到freelists中。当这些设置不正确时，那些得到的freelists也是"dead"块，因为它们没有足够的空间来存储一行，这样将会导致明显的处理延迟。</P>
<P>Freelists对于有效地重新使用Oracle表空间中的空间是很重要的，它和pctfree及pctused这两个存储参数的设置直接相关。通过将pctused设置为一个高的值，这时数据库就会尽快地重新使用块。不过，高性能和有效地重新使用表的块是对立的。在调整Oracle的表格和索引时，需要认真考虑究竟需要高性能还是有效的空间重用，并且据此来设置表的参数。以下我们来看一下这些freelists是如何影响Oracle的性能的。</P>
<P>当有一个请求需要插入一行到表格中时，Oracle就会到freelist中寻找一个有足够的空间来容纳一行的块。你也许知道，freelist串是放在表格或者索引的第一个块中，这个块也被称为段头（segment header）。pctfree和pctused参数的唯一目的就是为了控制块如何在freelists中进出。虽然freelist link和unlink 是简单的Oracle功能，不过设置freelist link(pctused)和unlink(pctfree)对Oracle的性能确实有影响。</P>
<P>由DBA的基本知识知道，pctfree参数是控制freelist un-links的（即将块由freelists中移除）。设置pctfree=10意味着每个块都保留10%的空间用作行扩展。pctused参数是控制freelist re-links的。设置pctused=40意味着只有在块的使用低于40%时才会回到表格的freelists中。</P>
<P>许多新手对于一个块重新回到freelists后的处理都有些误解。其实，一旦由于一个删除的操作而令块被重新加入到freelist中，它将会一直保留在freelist中即使空间的使用超过了60% ，只有在到达pctfree时才会将数据块由freelist中移走。</P>
<H3>表格和索引存储参数设置的要求总结</H3>
<P>以下的一些规则是用来设置freelists，freelist groups，pctfree和pctused存储参数的。你也知道，pctused和pctfree的值是可以很容易地通过alter table命令修改的，一个好的DBA应该知道如何设置这些参数的最佳值。</P>
<P>有效地使用空间和高性能之间是有矛盾的，而表格的存储参数就是控制这个方面的矛盾：</P>
<P>　. 对于需要有效地重新使用空间，可以设置一个高的pctused值，不过副作用是需要额外的I/O 。一个高的pctused值意味着相对满的块都会放到freelist中。因此，这些块在再次满之前只可以接受几行记录，从而导致更多的I/O。</P>
<P>　 . 追求高性能的话，可以将pctused设置为一个低的值，这意味着Oracle不会将数据块放到freelists中直到它几乎是空的。那么块将可以在满之前接收更多的行，因此可以减少插入操作的I/O。要记住Oracle扩展新块的性能要比重新使用现有的块高。对于Oracle来说，扩展一个表比管理freelists消耗更少的资源。</P>
<P>让我们来回顾一下设置对象存储参数的一些常见规则：</P>
<P>　 ．经常将pctused设置为可以接收一条新行。对于不能接受一行的free blocks对于我们来说是没有用的。如果这样做，将会令Oracle的性能变慢，因为Oracle将在扩展表来得到一个空的块之前，企图读取5个"dead"的free block。</P>
<P>　 ．表格中chained rows的出现意味着pctfree太低或者是db_block_size太少。在很多情况下，RAW和LONG RAW列都很巨大，以至超过了Oracle的最大块的大小，这时chained rows是不可以避免的。</P>
<P>　 ．如果一个表有同时插入的SQL语句，那么它需要有同时删除的语句。运行单一个一个清除的工作将会把全部的空闲块放到一个freelist中，而没有其它包含有任何空闲块的freelists出现。</P>
<P>　 ．freelist参数应该设置为表格同时更新的最大值。例如，如果在任何时候，某个表最多有20个用户执行插入的操作，那么该表的参数应该设置为freelists=20。</P>
<P>应记住的是freelist groups参数的值只是对于Oracle Parallel Server和Real Application Clusters才是有用的。对于这类Oracle，freelist groups应该设置为访问该表格的Oracle Parallel Server实例的数目。</P><img src ="http://www.blogjava.net/sgsoft/aggbug/986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-03 23:58 <a href="http://www.blogjava.net/sgsoft/articles/986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle SQL依然无可替代--《Mastering Oracle SQL》</title><link>http://www.blogjava.net/sgsoft/articles/985.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Thu, 03 Feb 2005 15:42:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/985.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/985.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/985.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/985.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/985.html</trackback:ping><description><![CDATA[天寒地冻，呆在家里又读完了《Mastering Oracle SQL》2nd，发现Oracle的功能还是很强悍，光函数就有两百个，HSQL是很难比拟的。接下来的硬骨头，看来要么冒险用Hibernate3.0的SQL Mapping功能，要么就自己跑JDBC组装VO了。 
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>1.报表合计专用的Rollup函数<BR></STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 销售报表<BR>&nbsp; 广州&nbsp;&nbsp;&nbsp;&nbsp; 1月&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000元<BR>&nbsp; 广州&nbsp;&nbsp;&nbsp;&nbsp; 2月&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2500元<BR>&nbsp; 广州&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4500元<BR>&nbsp; 深圳&nbsp;&nbsp;&nbsp;&nbsp; 1月&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000元<BR>&nbsp; 深圳&nbsp;&nbsp;&nbsp;&nbsp; 2月&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2000元<BR>&nbsp; 深圳&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000元<BR>&nbsp; 所有地区&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7500元<BR></DIV>
<DIV><BR>以往的查询SQL:<BR>Select&nbsp; area,month,sum(money) from SaleOrder group by area,month<BR>然后广州，深圳的合计和所有地区合计都需要在程序里自行累计</DIV>
<DIV><BR>1.其实可以使用如下SQL:<PRE>&nbsp;&nbsp; Select area,month,sum(total_sale) from SaleOrder group by <STRONG>rollup</STRONG>(area,month)</PRE>就能产生和报表一模一样的纪录</DIV>
<DIV>&nbsp;</DIV>
<DIV>2.如果year不想累加，可以写成<PRE>&nbsp;&nbsp; Select year,month,area,sum(total_sale) from SaleOrder group by <STRONG>year</STRONG>, <STRONG>rollup</STRONG>(month,area)</PRE>&nbsp;&nbsp;&nbsp;另外Oracle 9i还支持如下语法:<PRE>&nbsp;&nbsp; Select year,month,area,sum(total_sale) from SaleOrder group by rollup(<STRONG>(year,month),</STRONG>area)</PRE></DIV>
<DIV>&nbsp;</DIV>
<DIV>3.如果使用Cube(area,month)而不是RollUp(area,month)，除了获得每个地区的合计之外，还将获得每个月份的合计，在报表最后显示。</DIV>
<DIV>&nbsp;</DIV>
<DIV>4.Grouping让合计列更好读<BR>&nbsp; RollUp在显示广州合计时，月份列为NULL，但更好的做法应该是显示为"所有月份"<BR>&nbsp; Grouping就是用来判断当前Column是否是一个合计列，1为yes，然后用Decode把它转为"所有月份"<PRE>&nbsp; Select&nbsp; <STRONG>Decode(Grouping(area),1,'所有地区',area)</STRONG> area,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Decode(Grouping(month),1,'所有月份',month),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum(money)<BR>&nbsp;&nbsp;From SaleOrder&nbsp;<BR>&nbsp;&nbsp;Group by RollUp(area,month);</PRE></DIV>
<DIV>&nbsp;</DIV>
<DIV><STRONG>2.对多级层次查询的start with.....connect by</STRONG><BR>&nbsp;&nbsp; 比如人员组织,产品类别,Oracle提供了很经典的方法</DIV>
<DIV><PRE> SELECT <STRONG>LEVE</STRONG>L, name, emp_id,manager_emp_id<BR> FROM employee<BR> <STRONG>START WITH </STRONG>manager_emp_id is null<BR> <STRONG>CONNECT BY PRIOR </STRONG>emp_id = manager_emp_id;</PRE></DIV>
<DIV>上面的语句demo了全部的应用,start with指明从哪里开始遍历树,如果从根开始,那么它的manager应该是Null,如果从某个职员开始,可以写成emp_id='11'<BR>CONNECT BY 就是指明父子关系,注意PRIOR位置<BR>另外还有一个LEVEL列,显示节点的层次</DIV>
<DIV>&nbsp;</DIV>
<DIV><STRONG>3.更多报表/分析决策功能</STRONG><BR>3.1 分析功能的基本结构<BR>&nbsp;&nbsp;&nbsp;&nbsp; 分析功能() over( partion子句,order by子句,窗口子句)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;概念上很难讲清楚,还是用例子说话比较好.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </DIV>
<DIV>&nbsp;</DIV>
<DIV>3.2 Row_Number 和 Rank, DENSE_Rank<BR>&nbsp;&nbsp;&nbsp; 用于选出Top 3 sales这样的报表<BR>&nbsp;&nbsp;&nbsp; 当两个业务员可能有相同业绩时,就要使用Rank和Dense_Rank<BR>&nbsp;&nbsp;&nbsp; 比如<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 金额&nbsp;&nbsp;&nbsp; RowNum&nbsp; Rank&nbsp; Dense_Rank<BR>&nbsp;&nbsp;&nbsp; 张三 4000元&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<BR>&nbsp;&nbsp;&nbsp; 李四 3000元&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2<BR>&nbsp;&nbsp;&nbsp; 钱五 2000元&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3<BR>&nbsp;&nbsp;&nbsp; 孙六 2000元&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3<BR>&nbsp;&nbsp;&nbsp; 丁七 1000元&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4</DIV>
<DIV>&nbsp;&nbsp;&nbsp; 这时,应该把并列第三的钱五和孙六都选进去,所以用Ranking功能比RowNumber保险.至于Desnse还是Ranking就看具体情况了。</DIV>
<DIV><PRE>&nbsp;&nbsp;&nbsp; SELECT salesperson_id, SUM(tot_sales) sp_sales,<BR>&nbsp;&nbsp;&nbsp; <STRONG>RANK( ) OVER </STRONG>(ORDER BY SUM(tot_sales) DESC) sales_rank<BR>&nbsp;&nbsp;&nbsp; FROM orders<BR>&nbsp;&nbsp;&nbsp; GROUP BY salesperson_id</PRE></DIV>
<DIV>3.3 NTILE 把纪录平分成甲乙丙丁四等 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比如我想取得前25%的纪录,或者把25%的纪录当作同一个level平等对待,把另25%当作另一个Level平等对待</DIV>
<DIV><PRE>&nbsp;&nbsp;&nbsp; SELECT cust_nbr, SUM(tot_sales) cust_sales,<BR>&nbsp;&nbsp;&nbsp; <STRONG>NTILE(4) OVER </STRONG>(ORDER BY SUM(tot_sales) DESC) sales_quartile<BR>&nbsp;&nbsp;&nbsp; FROM orders<BR>&nbsp;&nbsp;&nbsp; GROUP BY cust_nbr<BR>&nbsp;&nbsp;&nbsp; ORDER BY 3,2 DESC;</PRE>NTITLE(4)把纪录以 SUM(tot_sales)排序分成4份.</DIV>
<DIV>&nbsp;</DIV>
<DIV>3.4 辅助分析列和Windows Function<BR>&nbsp;&nbsp;&nbsp;&nbsp; 报表除了基本事实数据外,总希望旁边多些全年总销量,到目前为止的累计销量,前后三个月的平均销量这样的列来参考.<BR>&nbsp;&nbsp;&nbsp; 这种前后三个月的平均和到目前为止的累计销量就叫windows function, 见下例<PRE>&nbsp;&nbsp;&nbsp; SELECT month, SUM(tot_sales) monthly_sales,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUM(SUM(tot_sales)) OVER (ORDER BY month<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW</STRONG>) max_preceeding<BR>&nbsp;&nbsp;&nbsp; FROM orders<BR>&nbsp;&nbsp;&nbsp; GROUP BY month<BR>&nbsp;&nbsp;&nbsp; ORDER BY month;<BR><BR><BR></PRE><PRE><BR>&nbsp;&nbsp;&nbsp; SELECT month, SUM(tot_sales) monthly_sales,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AVG(SUM(tot_sales)) OVER (ORDER BY month <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING</STRONG>) rolling_avg&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; FROM orders<BR>&nbsp;&nbsp;&nbsp; GROUP BY month<BR>&nbsp;&nbsp;&nbsp; ORDER BY month;</PRE></DIV>
<DIV>&nbsp;&nbsp;&nbsp; Windows Function的关键就是Windows子句的几个取值<BR>&nbsp;&nbsp;&nbsp; 1 PRECEDING 之前的一条记录<BR>&nbsp;&nbsp;&nbsp; 1 FOLLOWING 之后的一条记录<BR>&nbsp;&nbsp;&nbsp; UNBOUNDED PRECEDING 之前的所有记录<BR>&nbsp;&nbsp;&nbsp; CURRENT ROW 当前纪录</DIV>
<DIV>&nbsp;</DIV>
<DIV><STRONG>4.SubQuery总结</STRONG><BR>&nbsp; SubQuery天天用了,理论上总结一下.SubQuery 分三种<BR>&nbsp; 1.Noncorrelated 子查询&nbsp;&nbsp; 最普通的样式.<BR>&nbsp; 2.Correlated Subqueries&nbsp; 把父查询的列拉到子查询里面去,头一回cyt教我的时候理解了半天.<BR>&nbsp; 3.Inline View&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 也被当成最普通的样式用了.</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp; 然后Noncorrelated 子查询又有三种情况<BR>&nbsp; 1.返回一行一列&nbsp;&nbsp;&nbsp; where price &lt; (select max(price) from goods )<BR>&nbsp;&nbsp;2.返回多行一列&nbsp;&nbsp;&nbsp; where price&gt;= ALL (select price from goods where type=2)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;or where NOT price&lt; ANY(select price from goods where type=2)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最常用的IN其实就是=ANY()<BR>&nbsp; 3.返回多行多列&nbsp;&nbsp;&nbsp; 一次返回多列当然就节省了查询时间 <PRE>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UPDATE monthly_orders&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SET (tot_orders, max_order_amt) =<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;(SELECT COUNT(*), MAX(sale_price)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM cust_order)<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>          DELETE FROM line_item<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE (order_nbr, part_nbr) IN<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;      (SELECT order_nbr, part_nbr FROM cust_order c)</PRE></DIV><img src ="http://www.blogjava.net/sgsoft/aggbug/985.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-03 23:42 <a href="http://www.blogjava.net/sgsoft/articles/985.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE数据库常用操作</title><link>http://www.blogjava.net/sgsoft/articles/972.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Thu, 03 Feb 2005 13:26:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/972.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/972.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/972.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/972.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/972.html</trackback:ping><description><![CDATA[对于DBA来讲，熟悉ORACLE的常用操作方法有很重要的作用，下面列举几个方面的：
<P align=center><B></B>&nbsp;</P>
<TABLE cellSpacing=0 cellPadding=0 width=0 align=right border=0>
<TBODY>
<TR>
<TD align=middle></TD></TR>
<TR>
<TD><!--start banner ad--><!--ba-->
<SCRIPT language=JavaScript1.1 src="http://ad.cn.doubleclick.net/adj/messagingplus.zdnet.com.cn/developer/database;sz=1x1;ord=65061713?"> </SCRIPT>
<!-- Sniffer Code for Flash 5 -->
<SCRIPT language=VBScript> 
on error resume next 
ShockMode = (IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash.5")))
</SCRIPT>
<NOEMBED>
<a href="http://ad.cn.doubleclick.net/click%3Bh=v3|3214|3|0|%2a|o%3B13561728%3B0-0%3B0%3B10707894%3B31-1|1%3B8724972|8742868|1%3B%3B%7Esscs%3D%3fhttp%3a%2f%2fhttp://ad.doubleclick.net/clk;13464484;4278154;m?http://www.mymai.com/index1.aspx?s=zdmail" target="_blank"><IMG SRC="http://m2.cn.doubleclick.net/1012548/mpu_mymai.swf " WIDTH=468 HEIGHT=60 BORDER=0 ></a>
</NOEMBED><NOSCRIPT>
<a href="http://ad.cn.doubleclick.net/click%3Bh=v3|3214|3|0|%2a|o%3B13561728%3B0-0%3B0%3B10707894%3B31-1|1%3B8724972|8742868|1%3B%3B%7Esscs%3D%3fhttp%3a%2f%2fhttp://ad.doubleclick.net/clk;13464484;4278154;m?http://www.mymai.com/index1.aspx?s=zdmail" target="_blank"><IMG SRC="http://m2.cn.doubleclick.net/1012548/mpu_mymai.swf " WIDTH=468 HEIGHT=60 BORDER=0 ></a>
</NOSCRIPT><NOSCRIPT> <A HREF="http://ad.cn.doubleclick.net/jump/messagingplus.zdnet.com.cn/developer/database;sz=1x1;ord=65061713?"> <IMG SRC="http://ad.cn.doubleclick.net/ad/messagingplus.zdnet.com.cn/developer/database;sz=1x1;ord=65061713?" border=0 ></A> 
      </NOSCRIPT><!--end banner ad--></TD></TR></TBODY></TABLE>
<P><B>一、</B><B>Oracle</B><B>数据库的几个关闭方法</B></P>
<P>对于ORACLE来讲，关闭的方法有三个：</P>
<P>在SVRMGRL下可以输入如下语句，就可关闭数据库，但每个语句都有自己的作用，有的语句还必须慎重使用</P>
<P>1、shutdown normal （从字面就可理解这是一个用正常的方式来关闭数据库。）</P>
<P>2、shutdown immediate （立即方式关闭数据库。）</P>
<P>当执行shutdown immediate时，数据库并不立即关闭，而是在Oracle执行完内部的必要的工作后才关闭，shutdown immediate可以完成shutdown不能对数据库关闭的操作。建议DBA们常用此方法关闭数据库</P>
<P>3、shutdown abort （直接关闭数据库）</P>
<P>这个停止的方法不推荐，因为对于正在访问数据库的会话会被突然终止，可能会造成数据库的数据丢失，并且如果数据库中有大量操作正在执行，这时执行shutdown abort后，重新启动数据库需要很长时间。</P>
<P>举例说明：</P>
<P>1、停Oracle</P>
<P># su – oracle</P>
<P>$ lsnrctl&nbsp;&nbsp; stop&nbsp;&nbsp;&nbsp; </P>
<P>$ svrmgrl</P>
<P>&gt;connectinternal</P>
<P>&gt;shutdown&nbsp;&nbsp;&nbsp;&nbsp; immediate</P>
<P>&gt;exit</P>
<P>相应的启动Oracle的方法如下：</P>
<P># su – oracle&nbsp;&nbsp;&nbsp; 以ORACLE用户身份进入</P>
<P>$ svrmgrl&nbsp;&nbsp; 打开ORACLE的管理器</P>
<P>&gt;connectinternal&nbsp;&nbsp; 建立库的连接</P>
<P>&gt;startup&nbsp;&nbsp; 启动数据库</P>
<P>&gt;exit&nbsp;&nbsp;&nbsp; 退出管理器</P>
<P>$ lsnrctl&nbsp;&nbsp; start&nbsp;&nbsp;&nbsp; 启动监听</P>
<P>$lsnrctl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; status&nbsp;&nbsp; 查看监听的状态</P>
<P><B>二、对</B><B>Oracle 8i</B><B>数据库服务器操作的一些相关命令和方法：</B></P>
<P>1、sar此命令可以帮助查看哪些缓冲区高速缓存使用情况，让我们决定哪些需要增加，哪些需要减少：</P>
<P>sar -b：我们可用它查看缓冲区高速缓存的活动；</P>
<P>sar -w：我们可用它查看内存交换活动；</P>
<P>sar -u：我们可用它查看CPU利用情况；</P>
<P>sar -r：我们可用它查看内存利用情况；</P>
<P>sar -p：报告Solaris内存分页活动，此命令是：vmstat命令的一部份功能，</P>
<P>比如下面命令用于每5秒显示10次分页活动的概要情况：<BR>$ sar -p 5 10</P>
<P>% vmstat 5</P>
<P>此命令将显示系统每5秒钟做的事的概要，包括进程、虚拟内存、磁盘、分页和CPU的活动情况。</P>
<P>2、iostat，可监控磁盘的活动情况</P>
<P>3、swap，可监控交换空间的情况</P><img src ="http://www.blogjava.net/sgsoft/aggbug/972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-03 21:26 <a href="http://www.blogjava.net/sgsoft/articles/972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 基本知识及问题解决</title><link>http://www.blogjava.net/sgsoft/articles/970.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Thu, 03 Feb 2005 13:18:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/970.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/970.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/970.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/970.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/970.html</trackback:ping><description><![CDATA[概序<BR><BR>Oracle数据库作为一个大型的关系型数据库，它与其他关系型数据库相比，有许多个性的东西，下面作一个简单的说明，其中包括我们在日常运行和维护中可能用到的知识，希望对大家有所帮助<BR><BR>一、基本知识<BR><BR>1、表空间对于数据库是唯一性的，且要求每个数据库最少有一个表空间。<BR><BR>表空间可以分为系统表空间和非系统表空间、回滚段表空间；也可以分为用户表空间和非用户表空间，他们只是分类方式不同，其实实质差不多；<BR><BR>临时表空间：临时表空间并不包含真正的数据,恢复的方法是删除临时表空间并重建即可.。系统表空间：如果备份不可用,则只能采用重建数据库的方法 。<BR><BR>表空间的大小可以根据需要和设备的情况进行设置<BR><BR>表空间可以简单的理解为存放信息的空间，我们一般按如下顺序进行数据库系统的创建：创建表空间---》修改表空间---》创建回滚段---》创建用户和授权---》创建用户表---》创建表索引，用户只要按这个顺序就可以建立自己的数据库系统了，至于创建的数据库是否有最佳的性能，我会在以后的文章中做专门的讨论。表空间的建立可以用图形用户界面的方式很方便的建立，相信大家都会，在这里我不进行详细的介绍，下面我把建表空间、修改表空间、建回滚段、创建用户和授权、创建表、创建索引的SQL附后，请参考：<BR><BR>2、控制文件在每个数据库中必不可少，为了使数据库的性能提高建议多建几个控制文件，求要求放在不同的磁盘上。 ORACLE数据库由数据文件，控制文件和联机日志文件三种文件组成。由于磁盘空间的变化，或者基于数据库磁盘I/O性能的调整等，数据库管理员可能会考虑移动数据库文件。下面以UNIX平台为例，分别讨论三种数据库文件的移动方法<BR><BR>不能被忽视的数据库日志文件<BR><BR>请注意日志文件在恢复数据库时非常重要<BR><BR>日志可分为在线日志和离线日志，在线日志能记录每一个Oracle数据库中所作的全部修改。一个在线日志由多个在线日志文件组成，每一个运行的Oracle数据库实例相应地有一个在线日志，它与Oracle后台进程LGWR一起工作，立即记录该实例所作的全部修改。离线日志是可选择的·当ORACLE填满了在线日志文件后，就要进行归档了。<BR><BR>二、创建表空间、回滚段、用户、表的语法<BR><BR>1、创建表空间（这是在建数据库时的第一步要做的工作，表空间好比容器，将数据库的各种东西包含在里面）<BR><BR>CREATE TABLESPACE test DATAFILE '/dev/test_name1' SIZE 1000M, '/dev/test_name2' SIZE 1000M , '/dev/test_name3' SIZE 1000M<BR>DEFAULT STORAGE ( INITIAL 64K NEXT 64K MAXEXTENTS UNLIMITED PCTINCREASE 50 );<BR><BR>注意：这里没有对表空间的扩展进行限制。<BR><BR>2、修改表空间<BR><BR>alter TABLESPACE ts_name1 add DATAFILE '/dev/name4' SIZE 1000M;<BR><BR>3、回滚段<BR><BR>CREATE ROLLBACK SEGMENT "RStest" TABLESPACE "Test_name" <BR>STORAGE ( INITIAL 16M NEXT 16M MAXEXTENTS UNLIMITED);<BR><BR>注意不要建不同的大小的回滚段，因为ORACLE不会自己挑选和需要最相符的回滚段<BR><BR>4、创建用户和授权<BR><BR>CREATE USER test_user IDENTIFIED BY test_user <BR>DEFAULT TABLESPACE Test_name1 TEMPORARY TABLESPACE Test_name2;<BR>GRANT CONNECT TO test_user;<BR>GRANT DBA TO test_user;<BR>GRANT resource TO test_user;<BR><BR>5、创建表<BR><BR>create table test_name1<BR>(<BR>a NUMBER(10) not null,<BR>b NUMBER(10) null ,<BR>c NUMBER(3) defalut 0,<BR>d number(3) not null ,<BR>constraint PK_ test_user primary key (a)<BR>using index<BR>tablespace test_name1<BR>storage<BR>(<BR>initial 1m<BR>next 1m<BR>pctincrease 0<BR>)<BR>)<BR>pctfree 10<BR>tablespace test_name1<BR>storage<BR>(<BR>initial 1m<BR>next 1m<BR>pctincrease 0<BR>)<BR>partition by range(d)<BR>(partition part000 values less than (1) tablespace test_name1,<BR>partition part001 values less than (2) tablespace test_name1,<BR>)<BR>/<BR><BR>6、创建索引<BR><BR>create index id_tablename1 on test_name1 (f2)<BR>tablespace ts_name<BR>storage<BR>(<BR>initial 500k<BR>next 500k<BR>pctincrease 0<BR>)<BR><BR>/<BR><BR>三、查询表空间<BR><BR>select substr(a.TABLESPACE_NAME,1,10) TablespaceName,<BR><BR>sum(a.bytes/1024/1024) totle_size,<BR><BR>sum(nvl(b.free_space1/1024/1024,0)) free_space,<BR><BR>sum(a.bytes/1024/1024)-sum(nvl(b.free_space1/1024/1024,0)) used_space,<BR><BR>round((sum(a.bytes/1024/1024)-sum(nvl(b.free_space1/1024/1024,0)))*100/sum(a.bytes/1024/1024),2) used_percent<BR><BR>from dba_data_files a,<BR><BR>(select sum(nvl(bytes,0)) free_space1,file_id<BR><BR>from dba_free_space<BR><BR>group by file_id) b<BR><BR>where a.file_id = b.file_id(+)<BR><BR>group by a.TABLESPACE_NAME<BR><img src ="http://www.blogjava.net/sgsoft/aggbug/970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-03 21:18 <a href="http://www.blogjava.net/sgsoft/articles/970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从Oracle空间数据中诞生SVG</title><link>http://www.blogjava.net/sgsoft/articles/969.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Thu, 03 Feb 2005 13:16:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/969.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/969.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/969.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/969.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/969.html</trackback:ping><description><![CDATA[<P align=left><B>如果你已经在</B><B>Oracle</B><B>中存储了几何数据，你就可以直接从浏览器中浏览它，而不需要任何其它的软件。</B></P>
<P align=left>&nbsp;</P>
<P align=left>Oracle Spatial无论从功能，数据结构，还是帮助用户存储或重新找回空间数据的表格来说，都算得上是一种完备的设置。该数据以二维空间，三维空间，或四维空间的形式来描述形状以及它们的几何关联。</P>
<TABLE cellSpacing=0 cellPadding=0 width=0 align=right border=0>
<TBODY>
<TR>
<TD align=middle></TD></TR>
<TR>
<TD><!--start banner ad--><!--ba-->
<SCRIPT language=JavaScript1.1 src="http://ad.cn.doubleclick.net/adj/messagingplus.zdnet.com.cn/developer/database;sz=1x1;ord=301785435?"> </SCRIPT>
<!-- Sniffer Code for Flash 5 -->
<SCRIPT language=VBScript> 
on error resume next 
ShockMode = (IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash.5")))
</SCRIPT>
<NOEMBED>
<a href="http://ad.cn.doubleclick.net/click%3Bh=v3|3214|3|0|%2a|o%3B13561728%3B0-0%3B0%3B10707894%3B31-1|1%3B8724972|8742868|1%3B%3B%7Esscs%3D%3fhttp%3a%2f%2fhttp://ad.doubleclick.net/clk;13464484;4278154;m?http://www.mymai.com/index1.aspx?s=zdmail" target="_blank"><IMG SRC="http://m2.cn.doubleclick.net/1012548/mpu_mymai.swf " WIDTH=468 HEIGHT=60 BORDER=0 ></a>
</NOEMBED><NOSCRIPT>
<a href="http://ad.cn.doubleclick.net/click%3Bh=v3|3214|3|0|%2a|o%3B13561728%3B0-0%3B0%3B10707894%3B31-1|1%3B8724972|8742868|1%3B%3B%7Esscs%3D%3fhttp%3a%2f%2fhttp://ad.doubleclick.net/clk;13464484;4278154;m?http://www.mymai.com/index1.aspx?s=zdmail" target="_blank"><IMG SRC="http://m2.cn.doubleclick.net/1012548/mpu_mymai.swf " WIDTH=468 HEIGHT=60 BORDER=0 ></a>
</NOSCRIPT><NOSCRIPT> <A HREF="http://ad.cn.doubleclick.net/jump/messagingplus.zdnet.com.cn/developer/database;sz=1x1;ord=301785435?"> <IMG SRC="http://ad.cn.doubleclick.net/ad/messagingplus.zdnet.com.cn/developer/database;sz=1x1;ord=301785435?" border=0 ></A> 
      </NOSCRIPT><!--end banner ad--></TD></TR></TBODY></TABLE>
<P>
<P align=left>有了Oracle Spatial，你就可以定义一组有特色的形状（诸如点，线，矩形，多边形，或者）；你可以将数据存储注册于Oracle Spatial数据词典中，并可从中重新找回；还可以对该数据提出质疑，以重新找回关于范围，交叉点，亲密关系，以及其它一些以内插值置换的信息。</P>
<P align=left>&nbsp;</P>
<P>Oracle Spatial数据最初是从一些很难阅读的存储物诸如SDO－POINT、SDO＿ORDINATES中得来的。能够直接解压，直接使用而不需要额外的软件，这对用户来说无疑很有益处。SVG（可变动的矢量绘图档）是从数据库中产生的，只要你的机器上安装了SVG浏览器，它就可以帮你毫不费力地完成这一任务，。</P>
<P>&nbsp;</P>
<P>这篇文章里，我将要向你展示一个PL/SQL包裹，当用户通过modplsql界面下达指令时，这一包裹会产生出足够的SVG，让你用它们来浏览那些数据，这些在Oracle Spatial使用说明的第二章中用一个简单的例子作了介绍。（在Oracle Technology Network上，你可以在线看到每一个主要数据库版本的HTML版本，在该网络上，你可能需要注册）。这个例子中定义了四个图形――一个矩形，两个多边形，以及一个圆，以此来帮助一个软件制造商确定在哪里可以获得更多的销售利润。为了节省空间，我只支持这个例子中所涉及的三种形状。我不支持单元转换（公尺置换成像素），但是我支持将那些图象卷起来并放大。我还假设所有的数据现在都是二维的。</P>
<P>&nbsp;</P>
<P align=left>在将数据转换成SVG所期望的形式的过程中遭遇到的最大挑战是，描述那些形状有许多不同的方法。比如说，Oracle Spatial对“圆”的定义是：三个点沿着其圆周而成。这对于描述一个二维的圆很有用，而在三维或四维空间中，从特定的方向看，它则可能是歪斜的。SVG期望中点与半径相匹配。在数学中只要求那些三点不在同一条直线上，这样的可能性则大多了。还有一个小难题就是这样一个事实，那就是Oracle Spatial更倾向于按照数学图表来描述数据，以Y轴为纵轴，而在SVG中则以Y轴为横轴，因此要把整个图形翻转成垂直状。</P>
<P align=left>&nbsp;</P>
<P align=left>如果你安装了Oracle Spatial，并运行Oracle Spatial用户指导第二章中的声明，就可以从modplsql中编辑并运行以下脚本了。我发现“m=20”是一个很好的放大倍率，与图表很相符。</P><img src ="http://www.blogjava.net/sgsoft/aggbug/969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-02-03 21:16 <a href="http://www.blogjava.net/sgsoft/articles/969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>