??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产理论片在线播放,国产精品亚洲精品,色窝窝亚洲av网http://www.tkk7.com/zilong/category/21125.html <center> 新的征?..... </center>zh-cnTue, 05 Jun 2007 22:56:16 GMTTue, 05 Jun 2007 22:56:16 GMT60Oracle中有x间操?/title><link>http://www.tkk7.com/zilong/archive/2007/06/05/122210.html</link><dc:creator>阿伟</dc:creator><author>阿伟</author><pubDate>Tue, 05 Jun 2007 10:44:00 GMT</pubDate><guid>http://www.tkk7.com/zilong/archive/2007/06/05/122210.html</guid><wfw:comment>http://www.tkk7.com/zilong/comments/122210.html</wfw:comment><comments>http://www.tkk7.com/zilong/archive/2007/06/05/122210.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zilong/comments/commentRss/122210.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zilong/services/trackbacks/122210.html</trackback:ping><description><![CDATA[<p><br>==============================实践?==============================</p> <p>如果两个字段都是DATE型,那么直接用END_DATE - BEGIN_DATE卛_Q不需要Q何{型,取整直接用TRUNC卛_QTRUNC(END_DATE - BEGIN_DATE),q样是直接将数部分舍去?/p> <p>=====================================================================</p> <p>*************实例Q包括MONTHS_BETWEEN,ADD_MONTHS,MOD,LAST_DAY的用法)******************</p> <p>/*<br>   解决ҎQ本例假讄L?007Q?5月䆾的报告及时率<br>   1.需要要取得2007Q?5月䆾需要做随访的婴儿信?br>   2.再查询出q些婴儿中在本次随访中已l做了随访ƈ且满?lt;=20天的<br> */<br> /*2007Q?月需要随访的婴儿ID*/<br> <br> select T.ID,T.*  /*不太准确*/<br> from fy_new_baby t<br> where<br> mod(trunc(months_between(TO_DATE('2007-05-31', 'yyyy-mm-dd') ,t.birthday)),12)  in (1,3,6,9,12)<br> and t.live = '1'<br> <br> select T.ID,T.*  /*比较准确*/<br> FROM FY_NEW_BABY T<br> WHERE MOD(TRUNC(MONTHS_BETWEEN(TO_DATE('2007-05-31','yyyy-mm-dd'),T.BIRTHDAY)),12) IN (1,3,6,9,12)<br> AND T.LIVE = '1'<br>/*本月需要做随访的ƈ且已l做了随访的记录<br>Q其中也包括了以前做q随访而ƈ非算是本ơ随访的Q后面通过Q随访日期-本次应该随访日期Q?gt;0来将其排除掉*/ <br> select v.* from fy_register_visit v<br> where v.new_baby_id in (select T.ID<br> from fy_new_baby t<br> where<br> mod(trunc(months_between(TO_DATE('2007-05-31', 'yyyy-mm-dd') ,t.birthday)),12)  in (1,3,6,9,12)<br> and t.live = '1') <br>/*出生日期和本月的月差*/<br> SELECT MONTHS_BETWEEN(TO_DATE('2007-05-31','YYYY-MM-DD'),T.BIRTHDAY) FROM FY_NEW_BABY T<br> <br>/*本月需要做随访的婴儿在本月应该随访的日?/<br> select T.ID,T.BIRTHDAY,ADD_MONTHS(T.BIRTHDAY,TRUNC(MONTHS_BETWEEN(TO_DATE('2007-05-31','YYYY-MM-DD'),T.BIRTHDAY)) ),t.* <br> from fy_new_baby t WHERE T.ID IN (select T.ID<br> from fy_new_baby t<br> where<br> mod(trunc(months_between(TO_DATE('2007-05-31', 'yyyy-mm-dd') ,t.birthday)),12)  in (1,3,6,9,12)<br> and t.live = '1')<br> <br> <br> /*需要在本月做随访的婴儿的随访日期-本月应该做随访的日期*/<br>  select ff.id,v.vst_date,ff.birthday, ff.shouldvisit,(v.vst_date-ff.shouldvisit) as day from fy_register_visit v,<br> ( select T.ID as id,T.BIRTHDAY as birthday,ADD_MONTHS(T.BIRTHDAY,TRUNC(MONTHS_BETWEEN(TO_DATE('2007-05-31','YYYY-MM-DD'),T.BIRTHDAY)) ) as shouldvisit<br>  from fy_new_baby t WHERE T.ID IN (select T.ID<br>  from fy_new_baby t<br>  where<br>  mod(trunc(months_between(TO_DATE('2007-05-31', 'yyyy-mm-dd') ,t.birthday)),12)  in (1,3,6,9,12)<br>  and t.live = '1') ) ff<br>  where v.new_baby_id = ff.id <br>  <br>   /*随访表中满Q随访日期-本月应该随访日期<=20Q的*/ <br>  select ff.id,v.vst_date,v.vst_zonecode,ff.birthday, ff.shouldvisit,(v.vst_date-ff.shouldvisit) as day from fy_register_visit v,<br> ( select T.ID as id,T.BIRTHDAY as birthday,ADD_MONTHS(T.BIRTHDAY,TRUNC(MONTHS_BETWEEN(TO_DATE('2007-05-31','YYYY-MM-DD'),T.BIRTHDAY)) ) as shouldvisit<br>  from fy_new_baby t WHERE T.ID IN (select T.ID<br>  from fy_new_baby t<br>  where<br>  mod(trunc(months_between(TO_DATE('2007-05-31', 'yyyy-mm-dd') ,t.birthday)),12)  in (1,3,6,9,12)<br>  and t.live = '1') ) ff<br>  where v.new_baby_id = ff.id <br>  and v.vst_date-ff.shouldvisit<=20<br>  and v.vst_date-ff.shouldvisit>=0<br>  <br>  /*2007-05月䆾需要随访的zM婴儿L---按地区分l?br>    因ؓFY_NEW_BABY表中没有地区字段Q所以需要关联FY_PREGNANT_REG?/<br> select B.REP_ZONECODE  , count(*) as shouldVisitNum<br> FROM FY_NEW_BABY T,FY_PREGNANT_REG B<br> WHERE MOD(TRUNC(MONTHS_BETWEEN(TO_DATE('2007-05-31','yyyy-mm-dd'),T.BIRTHDAY)),12) IN (1,3,6,9,12)<br> AND T.LIVE = '1' <br> AND T.CARD_ID = B.ID<br> GROUP BY B.REP_ZONECODE<br> <br> /*2007Q?5月䆾需要随访的婴儿q且已经存在在随访表中ƈ满Q?=<随访日期Q本月应该随访日?lt;=20Q的*/<br> select v.vst_zonecode, count(distinct v.id) as visitNum /*ff.id,v.vst_date,ff.birthday, ff.shouldvisit,(v.vst_date-ff.shouldvisit) as day*/<br>   from fy_register_visit v,<br>        (select T.ID as id,<br>                T.BIRTHDAY as birthday,<br>                ADD_MONTHS(T.BIRTHDAY,<br>                           TRUNC(MONTHS_BETWEEN(TO_DATE('2007-05-31',<br>                                                        'YYYY-MM-DD'),<br>                                                T.BIRTHDAY))) as shouldvisit<br>           from fy_new_baby t<br>          WHERE T.ID IN (select T.ID<br>                           from fy_new_baby t<br>                          where mod(trunc(months_between(TO_DATE('2007-05-31',<br>                                                                 'yyyy-mm-dd'),<br>                                                         t.birthday)),<br>                                    12) in (1, 3, 6, 9, 12)<br>                            and t.live = '1')) ff<br>  where v.new_baby_id = ff.id<br>    and v.vst_date - ff.shouldvisit <= 20<br>    and v.vst_date - ff.shouldvisit >= 0<br>  group by v.vst_zonecode</p> <p>***************************************用例END****************************************</p> <p> </p> <p><br>===========================参考资?===============================================<br> Oracle中如何计时间差 <br>计算旉差是Oracle DATA数据cd的一个常见问题。Oracle支持日期计算Q你可以创徏诸如“日期1Q日?”q样的表辑ּ来计这两个日期之间的时间差?/p> <p>一旦你发现了时间差异,你可以用简单的技巧来以天、小时、分钟或者秒为单位来计算旉差。ؓ了得到数据差Q你必须选择合适的旉度量单位Q这样就可以q行数据格式隐藏?/p> <p>使用完善复杂的{换函数来转换日期是一个诱惑,但是你会发现q不是最好的解决Ҏ?/p> <p>round(to_number(end-date-start_date))- 消逝的旉Q以天ؓ单位Q?/p> <p>round(to_number(end-date-start_date)*24)- 消逝的旉Q以时为单位)</p> <p>round(to_number(end-date-start_date)*1440)- 消逝的旉Q以分钟为单位)</p> <p>昄旉差的默认模式是什么?Z扑ֈq个问题的答案,让我们进行一个简单的SQL *Plus查询?/p> <p>SQL> select sysdate-(sysdate-3) from dual;</p> <p>SYSDATE-(SYSDATE-3)<br>-------------------<br>                  3</p> <p>q里Q我们看COracle使用天来作ؓ消逝时间的单位Q所以我们可以很Ҏ的用{换函数来把它转换成小时或者分钟。然而,当分钟数不是一个整数时Q我们就会遇到放|小数点的问题?/p> <p>Select<br>   (sysdate-(sysdate-3.111))*1440<br>from<br>   dual;</p> <p>(SYSDATE-(SYSDATE-3.111))*1440<br>------------------------------<br>                    4479.83333</p> <p>当然Q我们可以用ROUND函数Q即取整函数Q来解决q个问题Q但是要C我们必须首先把DATE数据cd转换成NUMBER数据cd?/p> <p>Select<br>   round(to_number(sysdate-(sysdate-3.111))*1440)<br>from<br>   dual;</p> <p>ROUND(TO_NUMBER(SYSDATE-(SYSDATE-3.111))*1440)<br>----------------------------------------------<br>                                          4480</p> <p>我们可以用这些函数把一个消逝时间近D{换成分钟q把q个值写入Oracle表格中。在q个例子里,我们有一个离U(logoffQ系l触发机制来计已l开始的会话旉q把它放入一个Oracle STATSPACK USER_LOG扩展表格之中?/p> <p>Update<br>   perfstat.stats$user_log<br>set<br>   elapsed_minutes =<br>   round(to_number(logoff_time-logon_time)*1440)<br>where<br>   user = user_id<br>and<br>   elapsed_minutes is NULL;</p> <img src ="http://www.tkk7.com/zilong/aggbug/122210.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zilong/" target="_blank">阿伟</a> 2007-06-05 18:44 <a href="http://www.tkk7.com/zilong/archive/2007/06/05/122210.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle数据导入导出imp exphttp://www.tkk7.com/zilong/archive/2007/06/05/122209.html阿伟阿伟Tue, 05 Jun 2007 10:41:00 GMThttp://www.tkk7.com/zilong/archive/2007/06/05/122209.htmlhttp://www.tkk7.com/zilong/comments/122209.htmlhttp://www.tkk7.com/zilong/archive/2007/06/05/122209.html#Feedback0http://www.tkk7.com/zilong/comments/commentRss/122209.htmlhttp://www.tkk7.com/zilong/services/trackbacks/122209.html 

功能Q?/span>Oracle数据导入导出imp/expq当与oracle数据q原与备份?/span>
 
大多情况都可以用Oracle数据导入导出完成数据的备份和q原Q不会造成数据的丢失)?/span>
 
 Oracle
有个好处Q虽然你的电脑不是服务器Q但是你装了oracle客户端,q徏立了q接
 
Q通过net8 assistant中本?/span>-->服务命名 d正确的服务命?/span>
 
其实你可以想成是客户端与服务器端修了条\Q然后数据就可以被拉q来了)
 
q样你可以把数据导出到本圎ͼ虽然可能服务器离你很q?/span>
 
你同样可以把dmp文g从本地导入到q处的数据库服务器中?/span>
 
利用q个功能你可以构Z个相同的数据库,一个用来测试,一个用来正式用?/span>
 
执行环境Q可以在SQLPLUS.EXE或?/span>DOSQ命令行Q中执行Q?/span>
 DOS
中可以执行时׃ ?/span>oracle 8i ?/span> 安装目录\ora81\BIN被设|ؓ全局路径Q?/span>
 
该目录下?/span>EXP.EXE?/span>IMP.EXE文g被用来执行导入导出?/span>
 oracle
?/span>java~写Q我?/span>SQLPLUS.EXE?/span>EXP.EXE?/span>IMP.EXEq俩个文件是被包装后的类文g?/span>
 SQLPLUS.EXE
调用EXP.EXE?/span>IMP.EXE他们所包裹的类Q完成导入导出功能?/span>
 
下面介绍的是导入导出的实例,向导入导出看实例基本上就可以完成Q因为导入导出很单?/span>
数据导出Q?/span>
 1
数据库TEST完全导出,用户?/span>system 密码manager 导出?/span>D:\daochu.dmp?/span>
   exp system/manager@TEST file=d:\daochu.dmp full=y
 2
数据库?/span>system用户?/span>sys用户的表导出
   exp system/manager@TEST file=d:\daochu.dmp owner=(system,sys)
 3
数据库中的?/span>table1 ?/span>table2导出
   exp system/manager@TEST file=d:\daochu.dmp tables=(table1,table2)
 4
数据库中的?/span>table1中的字段filed1?/span>"00"打头的数据导?/span>
   exp system/manager@TEST file=d:\daochu.dmp tables=(table1) query=\" where filed1 like '00%'\"
 
    
上面是常用的导出Q对于压~我不太在意Q用winzip?/span>dmp文g可以很好的压~?/span>
                    
不过在上面命令后?/span> 加上 compress=y  可以了

数据的导?/span>
 1
?/span>D:\daochu.dmp 中的数据导入 TEST数据库中?/span>
   imp system/manager@TEST  file=d:\daochu.dmp
  
上面可能有点问题Q因为有的表已经存在Q然后它报错,对该表就不进行导入?/span>
  
在后面加?/span> ignore=y 可以了?/span>
 2
?/span>d:\daochu.dmp中的?/span>table1 导入
 imp system/manager@TEST  file=d:\daochu.dmp  tables=(table1)
 
 
基本上上面的导入导出够用了。不情冉|是将表彻底删除,然后导入?/span>
 
注意Q?/span>
 
你要有够的权限Q权限不够它会提CZ?/span>
 
数据库时可以q上的。可以用tnsping TEST 来获得数据库TEST能否q上?/span>
可以通过输入 IMP 命o和您的用户名/口o
后接用户?/span>/口o的命?/span>:

例程: IMP SCOTT/TIGER

或?/span>, 可以通过输入 IMP 命o和各U参数来控制导入
按照不同参数。要指定参数Q您可以使用关键?/span>:

格式: IMP KEYWORD=value ?/span> KEYWORD=(value1,value2,...,vlaueN)
例程: IMP SCOTT/TIGER IGNORE=Y TABLES=(EMP,DEPT) FULL=N
?/span> TABLES=(T1: P1,T1: P2)Q如?/span> T1 是分

USERID 必须是命令行中的W一个参数?/span>

关键?/span> 说明Q默认)        关键?/span>      说明Q默认)
--------------------------------------------------------------------------
USERID  
用户?/span>/口o           FULL         导入整个文g (N)
BUFFER  
数据~冲区大?/span>         FROMUSER     所有h用户名列?/span>
FILE    
输入文g (EXPDAT.DMP)    TOUSER       用户名列?/span>
SHOW    
只列出文件内?/span> (N) TABLES      表名列表
IGNORE  
忽略创徏错误 (N)    RECORDLENGTH  IO 记录的长?/span>
GRANTS 
导入权限 (Y)           INCTYPE      增量导入cd
INDEXES
导入索引 (Y)          COMMIT       提交数组插入 (N)
ROWS   
导入数据?/span> (Y)        PARFILE      参数文g?/span>
LOG     
屏幕输出的日志文?/span>   CONSTRAINTS  导入限制 (Y)
DESTROY               
覆盖表空间数据文?/span> (N)
INDEXFILE             
/索引信息写入指定的文?/span>
SKIP_UNUSABLE_INDEXES 
跌不可用烦引的l护 (N)
FEEDBACK              
?/span> x 行显C?/span> (0)
TOID_NOVALIDATE       
跌指定cd ID 的验?/span>
FILESIZE              
每个转储文g的最大大?/span>
STATISTICS            
始终导入预计的l计信息
RESUMABLE             
遇到与空格有关的错误时挂?/span> (N)
RESUMABLE_NAME        
用来标识可恢复语句的文本字符?/span>
RESUMABLE_TIMEOUT      RESUMABLE
的等待时?/span>
COMPILE               
~译q程, E序包和函数 (Y)

下列关键字仅用于可传输的表空?/span>
TRANSPORT_TABLESPACE
导入可传输的表空间元数据 (N)
TABLESPACES
要传输到数据库的表I间
DATAFILES
要传输到数据库的数据文?/span>
TTS_OWNERS
拥有可传输表I间集中数据的用?/span>



阿伟 2007-06-05 18:41 发表评论
]]>
PowerDesigner导入导出PDM和rtf文ghttp://www.tkk7.com/zilong/archive/2007/06/05/122207.html阿伟阿伟Tue, 05 Jun 2007 10:38:00 GMThttp://www.tkk7.com/zilong/archive/2007/06/05/122207.htmlhttp://www.tkk7.com/zilong/comments/122207.htmlhttp://www.tkk7.com/zilong/archive/2007/06/05/122207.html#Feedback0http://www.tkk7.com/zilong/comments/commentRss/122207.htmlhttp://www.tkk7.com/zilong/services/trackbacks/122207.html数据库中导出PDM:
1.
打开PowerDesignerQ》新建-“Physical Data Model”Q》DBMS:ORACLE Version 9i
2Q?br>打开PowerDesignerQ》菜单栏“Database”Q》Database Reverse EngineeringQ》Using an ODBC data source中选择双的浏览-》connect to an ODBC Data SourceQ》在Machine data source中选择你配|好的数据源。(注:如果W一ơ连接,需要先配置数据源,步骤如下Q点?#8220;Add”按钮Q》ODBC数据源管理器Q》点?#8220;d”按钮Q》创建新数据源-》选择“Oracle in OraHome92” Q》完成-》进?#8220;Oracle ODBC Driver Configuration”Q》配|数据源名称(Data Source Name)以及监听?TNS Service Name)Q》配|完成后点击双?#8220;Test Connection”Q》在弹出框里输入q接数据库的用户名和密码Q》点击OKQ》提CConnection successfulQ》OKQ》数据源配置成功。-》退出数据源配置后,在数据源q接对话框中QConnect to an ODBC Data SourceQ中选择好刚才配|的数据源,然后再次填写用户名和密码Q》点击connectQ就可连接到数据库上。)
Q》点?#8220;定”Q》弹?#8220;ODBC Reverse Engineering”界面Q里面是此数据库用户所拥有的所有表Q选中要导出PDM的表Q》点?#8220;OK”,便可导出所选表的PDMQ》点击菜单栏中的保存Q可导出的PDM文g保存在相应的文g目录中?/p>

已有的PDM文g到成rtf文gQ?br>1Q?br>打开已有的PDM文gQ》然后选中根目录-》在菜单栏中选择“Model”Q?#8220;Reports”Q?#8220;Manage Templates”Q?#8220;List of Report Templates”中选择“Standard Physical Reprot”Q》点M面菜单栏中的新徏Q》选择最下面?#8220;Physical Data Model”Qƈ填写Name,语言选择chinese,点击OKQ》弹?#8220;Available items”?#8220;Template items”界面Q》在左面的列表中选择“Table”->"Table Column list"->双击Q将光择到右面的目中-》展开Table树型Q右键点击Table Column listQ》选择Layout属性,开在此界面中选择要导出的rtf中的列-》退出右键点击Table Colum list选择“edit”Q》在此设|导出的表名Q可设中?PARENT%及英文名%PARENTCODE%Q点M面的insertQ,点击OK?/p>

阿伟 2007-06-05 18:38 发表评论
]]>
[导入]SQL Server中删除重复数据的几个Ҏhttp://www.tkk7.com/zilong/archive/2007/03/31/107591.html阿伟阿伟Sat, 31 Mar 2007 02:49:00 GMThttp://www.tkk7.com/zilong/archive/2007/03/31/107591.htmlhttp://www.tkk7.com/zilong/comments/107591.htmlhttp://www.tkk7.com/zilong/archive/2007/03/31/107591.html#Feedback0http://www.tkk7.com/zilong/comments/commentRss/107591.htmlhttp://www.tkk7.com/zilong/services/trackbacks/107591.html
数据库的使用q程中由于程序方面的问题有时候会到重复数据Q重复数据导致了数据库部分设|不能正设|…?
  Ҏ一
declare @max integer,@id integer
declare cur_rows cursor local for select dD?count(*) from 表名 group by dD?having count(*) > 1
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from 表名 where dD?= @id
fetch cur_rows into @id,@max
end
close cur_rows
set rowcount 0
  Ҏ?/div>
  有两个意义上的重复记录,一是完全重复的记录Q也x有字D均重复的记录,二是部分关键字段重复的记录,比如Name字段重复Q而其他字D不一定重复或都重复可以忽略?/div>
  1、对于第一U重复,比较Ҏ解决Q?/div>
select distinct * from tableName
  可以得到无重复记录的结果集?/div>
  如果该表需要删除重复的记录Q重复记录保?条)Q可以按以下Ҏ删除
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp
  发生q种重复的原因是表设计不周生的Q增加唯一索引列即可解冟?/div>
  2、这c重复问题通常要求保留重复记录中的W一条记录,操作Ҏ如下
  假设有重复的字段为Name,AddressQ要求得到这两个字段唯一的结果集
select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
select * from #Tmp where autoID in(select autoID from #tmp2)
  最后一个select卛_CNameQAddress不重复的l果集(但多了一个autoID字段Q实际写时可以写在select子句中省L列)

?a >http://www.chinaitpower.com/2006Aug/2006-08-23/212751.html

文章来源:http://21958978.spaces.live.com/Blog/cns!A7DF246804AD47BB!219.entry

阿伟 2007-03-31 10:49 发表评论
]]>[导入]删除认的javaScriptҎhttp://www.tkk7.com/zilong/archive/2007/03/31/107594.html阿伟阿伟Sat, 31 Mar 2007 02:49:00 GMThttp://www.tkk7.com/zilong/archive/2007/03/31/107594.htmlhttp://www.tkk7.com/zilong/comments/107594.htmlhttp://www.tkk7.com/zilong/archive/2007/03/31/107594.html#Feedback0http://www.tkk7.com/zilong/comments/commentRss/107594.htmlhttp://www.tkk7.com/zilong/services/trackbacks/107594.html
<SCRIPT LANGUAGE=javascript>
function p_del() {
var msg = "您真的确定要删除吗?\n\nL认!";
if (confirm(msg)==true){
return true;
}else{
return false;
}
}
</SCRIPT>
调用ҎQ?br /><a href="del.jsp?id=<%=id%>" onclick="javascript:return p_del()">??lt;/a>

转蝲:http://www.zhuoda.org/Jason/44762.html

文章来源:http://21958978.spaces.live.com/Blog/cns!A7DF246804AD47BB!215.entry

阿伟 2007-03-31 10:49 发表评论
]]>[导入]Toad快速入?/title><link>http://www.tkk7.com/zilong/archive/2007/03/31/107596.html</link><dc:creator>阿伟</dc:creator><author>阿伟</author><pubDate>Sat, 31 Mar 2007 02:49:00 GMT</pubDate><guid>http://www.tkk7.com/zilong/archive/2007/03/31/107596.html</guid><wfw:comment>http://www.tkk7.com/zilong/comments/107596.html</wfw:comment><comments>http://www.tkk7.com/zilong/archive/2007/03/31/107596.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zilong/comments/commentRss/107596.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zilong/services/trackbacks/107596.html</trackback:ping><description><![CDATA[ <div> <div> <p> <font style="FONT-SIZE: 20px"> <b>Toad快速入?/b> </font> <br /> <font style="FONT-SIZE: 11px">          www.InnovateDigital.com 整理</font> </p> <p> </p> <h2> <b>  一?Toad功能lD</b> </h2> <p> <font style="FONT-SIZE: 13px">     在Oracle 应用E序的开发过E中Q访问数据库对象和编写SQLE序是一件乏味且耗费旉的工作,Ҏ据库q行日常理也是需要很多SQL脚本才能完成的。Quest Software为此提供了高效的Oracle应用开发工?ToadQTools of Oracle Application DevelopersQ。在Toad的新版本中,q加入了DBA模块Q可以帮助DBA完成许多日常理工作。它最大的特点是单易用,讉K速度快。?ToadQ我们可以通过一个图形化的用L面快速访问数据库Q完成复杂的SQL和PL/SQL代码~辑和测试工作。Toad由Oracle开发专家专门ؓ开发h员而设计,是一个功能强大、结构紧凑的专业化PL/SQL开发环境?/font> </p> <p> <font style="FONT-SIZE: 13px">     Toad 主要h如下特点Q?/font> </p> <p> </p> <h3> <b>  模式览Q?/b> </h3> <p> <font style="FONT-SIZE: 13px">     模式览功能可以让我们快速访问数据字典,览数据库中的表、烦引、存储过E。Toad 提供Ҏ据库的快速访问,使用极ؓ方便Q用L面简z,l构安排合理。当我们点击一个单独的数据库对象,Toad立即昄此对象的详细信息。例如,当我们点一个数据库的表Q所有和此表相关的烦引、约束、存储过E、SQL语句以及和其他表的相互引用关p都在同一界面昄出来。ؓ了简化操作,用户可以在浏览窗口操作数据库对象?/font> </p> <p> </p> <h3> <b>  SQL ~辑器:</b> </h3> <p> <font style="FONT-SIZE: 13px">     SQL ~辑器的主要功能是编辑、运行和调整SQL语句。TOAD 的高U编辑窗口包括众多的Ҏ来提高开发h员编写SQL语句的品化E度。例如,单地生成代码模板Q在~写SQL前自动发现包的内容和列的名字{等?/font> </p> <p> <font style="FONT-SIZE: 13px">     SQL ~辑器包括一个编辑窗口和q行l果H口Q允许开发h员在~辑的过E中试q行l果。SQL~辑器中不仅包括标准的编辑命令,也包括一些增强的功能Q如快速查询表中的字段、将SQL语句的内Ҏ式化{等。这个窗口可以处理大?GB 的内容,对大的开发项目来说非常有用。便L书签可以让开发h员非常容易地扑ֈ相关位置。在q行l果H口可提供用户定义的配置功能Q支持LONG 和LONG RAW列,可以数据卸出到盘、打印数据、编辑数据等{?/font> </p> <p> </p> <h3> <b>  存储q程~辑器:</b> </h3> <p> <font style="FONT-SIZE: 13px">     存储q程~辑器的主要功能是编辑、编译、测试、调试存储过E和触发器。TOAD提供语法标识、错误标识和其他很多易于使用的功能,如在弹出H口昄表名、列名和Oracle函数。和其他?PL/SQL ~辑工具不同QTOAD 允许在一个文件中操作多个数据库对象,可以~译一个对象、编译多个对象、编译到当前光标、从光标开始编译。在q行出现错误Ӟ存储q程停止到有问题的语句。用户可以用快h式或模板来快速编写PL/SQL,也可以根据需要生成自q模板。用Toad可以非常方便地进行编辑工作,可如讄书签、取消注释、格式化SQL语句{等?/font> </p> <p> </p> <h3> <b>  PL/SQL Debugger选项Q?/b> </h3> <p> <font style="FONT-SIZE: 13px">     Toad 提供单易用的PL/SQL 调试功能Q可以节省开发h员在大型目中用于开发和试的宝贉|_提高应用开发的质量。在存储q程开发的q程中,Toad可以逐行~辑、调试和q行代码。运行时可以Ҏ需要输入参敎ͼ观察相关参数的变化来查存储过E的正确性。在调式q程中,Toad 可以通过H口昄所有的断点、参? 调用堆栈和输出参数。用ToadQ非常容易检到存储q程的错误,开发h员可以一步一步运行PL/SQL语句来识别问题。调试会话可以和其他E序会话同时q行?/font> </p> <p> </p> <h3> <b>  SQLab Xpert OptionQ?/b> </h3> <p> <font style="FONT-SIZE: 13px">     帮助开发h员优化SQLQؓ他们提供各种优化模式下SQL执行计划Qƈ且能够给Z化的Q能够比较各U模式下实际的SQLq行l果Q帮助开发h员真正高速地开发高效地代码?/font> </p> <p> <font style="FONT-SIZE: 13px">     Toad q可以外挂一些别的品,比如PL/Formatter, RevealNet Knowledge Base , SQL Impact{,q些都能够和Toad紧密集成Q共同提供了一个完的集成开发环境。新版本q新增加了DBA模块Q更加拓q了Toadq个产品的适用范围?/font> </p> <p> </p> <h2> <b>  二、系l要求:</b> </h2> <p> <font style="FONT-SIZE: 13px">     客户端:</font> </p> <p> <font style="FONT-SIZE: 13px"> <ul> <li>Windows 95 / 98 / NT/2000中英文均? </li> <li>完整安装的SQL*Net 2.0或者Net8 </li> <li>盘Q一般安装需?0M左右的空_Ҏ所选择模块的不同和安装方式的不同,最也?M的磁盘空_从网l服务器dQ? </li> <li>内存QWindows 9x/Me:16M 内存QWindows NT/2000: Min 32M] </li> <li>Tuning模块需要额外的25MI间 </li> </ul> </font> </p> <p> </p> <p> <font style="FONT-SIZE: 13px">     服务器端Q?/font> </p> <p> <font style="FONT-SIZE: 13px"> <ul> <li>Oracle 7.3 或者更高,在Q何硬件^C? </li> <li>需要一个DBA用户帐号 </li> </ul> </font> </p> <p> </p> <p> </p> <h2> <b>  三.安装Q?/b> </h2> <p> <font style="FONT-SIZE: 13px">     1Q?三种安装方式的选择Q?/font> </p> <p> <font style="FONT-SIZE: 13px">     a) TOAD and Personal Configuration Files to PC 默认安装选择Q完成一个完整的Client端的安装Q把所有需要的文g拯到本地Toad目录。绝大多数用户应该选择使用q个安装方式?</font> </p> <p> <font style="FONT-SIZE: 13px">     b) Personal Config Files to PC, read TOAD from Network Server 从网l服务器dToadE序Q在本地计算机安装一些自定义的文Ӟq且创徏到服务器文g的快h式,一般不推荐使用q个方式Q而且要求|络服务器已l配|?</font> </p> <p> <font style="FONT-SIZE: 13px">     c) TOAD to Network Server</font> </p> <p> <font style="FONT-SIZE: 13px">     把Toad安装到网l服务器上,以便q样别的用户能够q行Personal Config Files to PC, read TOAD from Network Serverq种方式的安装?/font> </p> <p> <font style="FONT-SIZE: 13px">     2Q?Ҏ需要用到的特性,需要运行一些脚?都在Toad\temps目录?</font> </p> <p> <font style="FONT-SIZE: 13px"> <ul> <li>如果需要用Toad来查看执行计划,必须q行脚本PrepToad.sql或者notoad.sql </li> <li>如果希望专门建立一个Toad 用户来存放Toad需要用的对象的话Q就q行preptoad.sql? </li> <li>如果希望在当前连接用h式下建立toad需要用的对象的话Q就q行notoad.sql? </li> <li>注意Q如果是选择了专门徏立toadq个用户的话Q需要先修改一下脚本,指定用户的默认表I间和时表I间? </li> <li>需要用Oracle8i 的Profile analyzerQ必运行ToadProfiler.sql </li> <li>需要加强Toad的安全性,必须q行ToadSecurity.sql </li> </ul> </font> </p> <p> </p> <p> </p> <h2> <b>  四、Toad使用快速入?/b> </h2> <p> </p> <h3> <b>  1Q?Schema BrowserQ?/b> </h3> <p> <font style="FONT-SIZE: 13px">     Schema browser是Toad的极为有特色的模块。在schema browser的帮助下Q可以方便的览数据库内部的各类数据库对象,比如表,索引Q序列,存储q程{,而且可以方便的倒出DDL语句和进行各U修改,重徏工作。定位到某一cd象上Q这列对象允许的操作都会自动列出来?/font> </p> <p> <font style="FONT-SIZE: 13px">     特色Q?/font> </p> <p> <font style="FONT-SIZE: 13px"> <ul> <li>支持Oracle数据库里面所有对象的新徏、查看、修改,集成了几乎对所有数据库对象的管理所需要的功能? </li> <li>按照 模式->对象cd ->对象->对象可操作属?-> 对象本n的详l信息和对象相关的信?来组l,非常有条理,Ҏ定位对象Q也能够看到所有你需要的对象的相关信息? </li> <li>对于表: <p><font style="FONT-SIZE: 13px"><ul><li>完备的徏表向|不用输入冗长的语法,更加全面地替你考虑? </li><li>可以修改表的各种逻辑和物理属性,修改列的属性,增加列,删除?在Oracle8i里面)Q修改表的物理存储属性,TruncateQDrop{? </li><li>可以生成的完整的DDl语句Q包括存储信息,权限信息Q约束,索引和触发器{,而这些手工很隑ց到? </li><li>可以方便的对表进行分析,查看表地所有信息,可以有条件的倒出表里面的数据Qƈ且保存ؓsql语句? </li><li>可以方便的对表进行重l,可以完成exp/imp作不到的事情Q而且更少Ch工参与,更加安全?</li></ul></font></p><p></p></li> <li>对于视图Q存储过E: <p><font style="FONT-SIZE: 13px"><ul><li>可以保存建立视图、存储过E的语句为文本, </li><li>重新~译失效的视图,存储q程Q修改视囄定义语句{。方便的查看存储q程的代码,怺依赖关系Q权限信息等保存为文本等?</li></ul></font></p><p></p></li> <li>回滚D? <p><font style="FONT-SIZE: 13px"><ul><li>z明了的onlineQoffline状态,方便地online/offline操作 </li><li>详细的回滚段物理信息和当前状态? </li><li>可以方便的修改物理存储属?</li></ul></font></p><p></p></li> <li>表空_ <p><font style="FONT-SIZE: 13px"><ul><li>Tablespace MapQ直观的昄数据物理的在表空间上的分? </li><li>直观的查看各个表I间的利用率、剩余空间、破情늭信息 </li><li>可以q行各种alter操作Qonline, offline, 增加数据文gQ改变数据文件大,改变物理存储属性等 </li></ul></font></p><p></p></li> <li>对其他数据库对象也有完备的操作支持?</li> </ul> </font> </p> <p> </p> <p> </p> <h3> <b>  2Q?SQL Editor:</b> </h3> <p> <font style="FONT-SIZE: 13px"> <ul> <li>a) ȀzSQL Editor的三U方式: <p><font style="FONT-SIZE: 13px"><ul><li>q接到数据库之后QToad自动打开SQL Editorq个H口 </li><li>点击dh上最左边的那个按? </li><li>从菜单栏QDatabase -> SQL Editor </li></ul></font></p><p></p></li> <li>b) 特点Q? <p><font style="FONT-SIZE: 13px"><ul><li>允许同时打开多个~辑H口Q同时编辑多个SQL语句 </li><li>支持同时q接到多个数据库Q同时对多个数据库进行操? </li><li>允许~辑SQLQPLSQLQJAVAQHTML和文? </li><li>使用书签功能Q可以在大量SQL语句里,快速定位某个语句所在位|? </li><li>SQL Editor本nh强大的编辑功能,非常方便~辑SQL语句? </li><li>强大的快捷键支持和工h快速按钮的支持Q更加高效编?很多快捷键可以自己定义,在View ->options ->SQL Editor里面) </li><li>能够Ҏ前面的条Ӟ推测需要输入的代码Q可以做到某U程度的代码填充 </li><li>把鼠标定位到?视图/存储q程名称之上Q按F4Q可以打开对象描述H口Q方便的查看表和视图的定义,存储q程的源代码Q? </li><li>非常Ҏ对SQL语句的分析其执行计划Q单dh上的 按钮可以看到Explain Plan的结? </li><li>支持部分SQL*Plus命oQ可以方便的执行大量的ؓSQL*Plus~写的数据库脚本 </li><li>可以通过SQLab xpert来对当前SQL语句q行全面的分析,l出各种合理的调优意见,只需要单dh上的Tuning按钮 </li><li>可以方便的保存,打开和运行SQL脚本 </li><li>支持Ҏ询结果进行修? </li><li>可以把查询结果以多种格式保存hQ可以保存ؓHTMLQ纯文本QXLS{多U格? </li><li>很容易的得到SQL函数的列表和用法描述QShow SQL help Window 按钮Q? </li><li>可以查看SQL语句的执行情况:通过下方的AutoTraceH口 Q看到SQL语句的实际执行结果和执行效率? </li><li>支持历史SQL(F8) Q可以方便的查询以前执行q的SQLQ不用反复重新输入? </li><li>可以执行匿名块,存储q程Q从下方的窗口看到DBMS_OUTPUT的结?</li></ul></font></p><p></p></li> </ul> </font> </p> <p> </p> <p> </p> <h3> <b>  3Q?Stored Procedure Editor</b> </h3> <p> <font style="FONT-SIZE: 13px"> <ul> <li>a) 打开存储q程~写器的几个途径Q? <p><font style="FONT-SIZE: 13px"><ul><li>单击总菜单栏上的W三个按? </li><li>点击Database - > Procedure Editor </li><li>可以通过Schema browser来调?</li></ul></font></p><p></p></li> <li>b) 一些特点和优点Q? <p><font style="FONT-SIZE: 13px"><ul><li>强大的自定义讄Q从保留字的昄方式Q到自动替换Q到各种快捷键的定义{等Q用得越熟越手? </li><li>自动用不同颜色显CSQL和PL/SQL关键字,语法清晰明了Q可Ҏ自己的习惯来具体定制各类关键字的具体昄方式。可以自定义存储q程得模板,在新建存储过E的时候,自动生成E序的框架可以方便的调用Schema BrowserQ把鼠标定位于某个对象上QF4QSchema Browser打开该对象的详细描述Q帮助顺利快速开发程序。支持代码自动更正,如输入ndfQ自动替换成NO_DATA_FOUNDQ输入the自动替换成theQ类似的自动替换q可以自׃改和d? </li><li>方便的左边行hC,单击左边行号可以实现调试断点的增加/删除 </li><li>对各U快捷键的支持,不但包括常见的编辑操作,q可以有自己定义的PLSQL块的支持Q自己定义快h式)。如可以定义CTRL+SHIFT+D:弹出所有PLSQL Block的类型,可以自己选择? </li><li>可以在一个集成开发环境里面,一边编码,一边调试,不用多处切换 </li><li>方便的同时打开多个存储q程Q通过面快速切? </li><li>快速编译存储过E,快速定位错误所在,自己选择是否同时~译依赖的存储过E? </li><li>内置对PL/FormatterQ可以用PL/Formatter对存储过E进行格式化Qƈ且可以提供存储过E的概要分析和修改徏议;PL/Formatter可以对现有的存储q程q行高速的格式化,使所有的存储q程都符合同L~写标准Q这h有利于提高程序的可读性,避免不同人写的模块的风格上的很差异;PL/Formatter q有助于提高E序的模块化Q增强程序的l构清晰度,增强SQL的共用性;PL/Formatter q可以帮助完成PL/SQL和Oracle版本之间的管理? </li><li>内置RevealNet Knowledge BaseQ单击鼠标右键就可以打开Q快速得到技术上的支持,解决技术难? <p><font style="FONT-SIZE: 13px"><ul><li>PL/SQL </li><li>包含整个开发过E中可能遇到问题的答? </li><li>Code Library:大量的严谨的PL/SQL代码例子和现成过E,完全源代码提? </li><li>各种错误处理模块可供参考,各类字符日期函数 </li><li>包含1400多个主题 </li><li>Admin </li><li>解答DBA日常工作?0%的常见问题,覆盖2400多个主题 </li><li>从网l到性能优化Q从备䆾恢复到Error message,一应俱?</li></ul></font></p><p></p></li></ul></font></p><p></p></li> <li>如何用SQLab Xpert对存储过E进行调优? <p><font style="FONT-SIZE: 13px"><ul><li>需要Toad单独的Debug Option(Standard Version 没有q个选项) </li><li>要用Toad对存储过E进行debugQ必d装Oracle的系l包Qdbms_debugQ而且必须安装Oracle Probe API v2.0 或者更高的版本? </li><li>集成在Stored Precedure Editor里面Q可以一边编写一边调试,大大提高开发效? </li><li>打开Procedure Editor后,Debug菜单Ȁz,可以开始进行Debug工作? </li><li>允许对存储过E进行逐行调试、断点调?也支持对触发器进行调试? </li><li>可以有断Ҏ持,支持Watch变量Q允许运行时改变变量的? </li><li>允许对多层调用的Debug支持 </li></ul></font></p><p></p></li> </ul> </font> </p> <p> </p> <p> <font style="FONT-SIZE: 13px">     调试步骤具体举例Q?/font> </p> <p> <font style="FONT-SIZE: 13px">     1Q?点击菜单栏的W三个按钮: 打开Procedure Editor</font> </p> <p> <font style="FONT-SIZE: 13px">     2Q?点击Procedure Editor的菜单栏?按钮Q调出需要调试的存储q程</font> </p> <p> <font style="FONT-SIZE: 13px">     3Q?单击工具栏上的按?Q输入需要传入的参数Q如果不需要传入参敎ͼ可以直接单击工具栏上的按钮: Q直接开始调试,如下图输入传入参敎ͼ</font> </p> <p> <font style="FONT-SIZE: 13px">     4Q?单击菜单栏的按钮Q?Q可以单步跟t,也可以定义一个断点,直接q行到断点在单步执行Q在存储q程q行的过E中Q当前语句会高亮度显C,q且把鼠标指针定位到变量上,Toad自动昄该变量的当前倹{?/font> </p> <p> <font style="FONT-SIZE: 13px">     5Q?可以随时中止E序的执行,只要点Debug ->Halt ExecutionQ或者菜单栏上的按钮 Q就可以中止E序的执?/font> </p> <p> <font style="FONT-SIZE: 13px">     6Q?当碰C个存储过E调用另外一个存储过E的时候,可以选择跌(Step Over) Q这样就直接q行那个被调用的存储q程Q返回调用结果,l箋q个存储q程的调试,也可以选择Trace Into Q这样就打开被调用的存储q程Q进一步深入调试那个被调用的子存储q程。如果需要保持Debug信息Q在~译的时候应该选择Compile Dependencies with Debug InformationQ就是Procedure Editor工具栏最双的那个按??/font> </p> <p> <font style="FONT-SIZE: 13px">     7Q?支持对变量实时追t:使用WatchQ可以在q行前,或者运行过E中Ҏ个变量进行实时跟t:Add WatchQ把鼠标定位到该变量上,然后点击Debug ->Add Watch At CursorQ该变量׃出现在Debug状态窗口上Q而且实时反应该变量的当前倹{如上图中的变量v_empname。可以运行时M?</font> </p> <p> <font style="FONT-SIZE: 13px">     8Q?断点支持Q单d储过E需要加断点的地方的行号Q该行颜色变U,输入参数Q单L行按?Q可以直接运行到断点处,可以不必逐行q踪Q更加高效率的进行调试?</font> </p> <p> <font style="FONT-SIZE: 13px">     Debug Optionq支持条件断点,只有当满x件的时候才会在那个地方停止Q否则就好像不存在这个断点一Ll运行?/font> </p> <p> <font style="FONT-SIZE: 13px">     注意DBMS_OUTPUT.PUT_LINE的结果只有当E序执行完成以后才会出现Q在E序执行q程中是没有l果的?/font> </p> <p> </p> <h3> <b>  4Q?SQLab Xpert</b> </h3> <p> <font style="FONT-SIZE: 13px">     我们知道QOralce数据库的优化Q最主要的步骤就在于SQL的优化。而在没有专门的工P如ToadQ的帮助下,q行SQL优化是一仉常困隑֒乏味的事情,q且需要对Oracle的深入理解和高超的Oracle调优技巧。用Toad的SQLab Xpert Tuning模块Q可以我们普通开发h员也能够非常快速,_的对SQLq行专家U的分析</font> </p> <p> <font style="FONT-SIZE: 13px">     在SQL Editor和Procedure Editor里面Q选中需要调试的SQL语句QSQLab Xpert只能调试Select,Insert, Update,Delete语句Q,复制到SQL Editor里面Q然后点dh上的调优按钮 QToad会自动打开SQLab xpert H口Q捕获当前的SQL语句Qƈ且把它{化ؓW合explain plan格式的语句?/font> </p> <p> <font style="FONT-SIZE: 13px">     W一ơ打开Xpert的时候,Toad会提CZQ需要安装一些Server端的表、视囑֒包等对象Q可以把表存储到某个指定的表I间(如Tools)里面。可以简单的按照提示一步一步做可以了。如果系l设定不允许Job的话QJob_queue_process=0Q?Toad提示有些部g不会现在安装Q可以忽略。安装完成以后,可以选择让某些非DBA用户也可以用Toad的SQLab Xpert调优功能?/font> </p> <p> <font style="FONT-SIZE: 13px">     安装完成以后QToad会提CZ一些关于优化目标方面的问题Q你可以选择每次优化都可以重新设定,或者一ơ设定,以后一直用这个设定。当然如果需要,q是可以更改的,在SQLab Option xpert的窗口的Administration和Preference下面重新讑֮?/font> </p> <p> <font style="FONT-SIZE: 13px">     例子Q?/font> </p> <p> <font style="FONT-SIZE: 13px">     下面q个SQL语句涉及到多表之间的兌Q有一定的复杂性,我们可以借助Toad的SQLab Xpert Option来帮助分析:</font> </p> <p> <font style="FONT-SIZE: 13px">     select a.name. b.name, c.emp_name from dep a, manager b,emp c where a.dep_no=c.DEP_NO and b.manag_id=c.manag_id and c.emp_no=3</font> </p> <p> <font style="FONT-SIZE: 13px">     我们把这个SQL复制到SQL Editor里面Q单M面的调优按钮QToad打开SQLab Xpert OptionH口?/font> </p> <p> <font style="FONT-SIZE: 13px">     从上面的图中我们可以斚w的看刎ͼ在各U优化模式下Q该SQL语句的执行计划分别是什么样的,Toadl出了每一U执行计划的具体每一个步骤,每个步骤的成本,该表涉及的相关的数据{,如果SQL存取的表q没有经q分析,Toad会以U色警告昄Qƈ且很方便的帮助你对该表进行分析,攉l计数据Q重建烦引等Q以有助于优化器作出最好的选择。可以把当前的分析结果保存到它的资料库里边,以备以后再次调用之需?/font> </p> <p> <font style="FONT-SIZE: 13px">     我们q可以求助与SQLab 的自动优化功能:点击Original SQL下面的auto tune按钮QToad会对执行l果按照tkprofq行分析Q当Ӟq需要你在initsid.ora里面讄好utl_file_dirQ如果服务器是在Unix机器上的话,q需要通过FTP方式得到Trace文gQ有一些小的讄Q?/font> </p> <p> <font style="FONT-SIZE: 13px">     自动优化非常高效的对所有执行计划进行实际运行比较,q且l出实际执行的时间的ҎQ如下图Q?/font> </p> <p> <font style="FONT-SIZE: 13px">      我们q可以让Toadl出实际的优化徏议:点击Original SQL,单击下面的Advice按钮QToadҎ对SQL的分析和执行l果l出合理的徏议:</font> </p> <p> <font style="FONT-SIZE: 13px">     1Q?把表和烦引分别放C个不同的表空_因ؓ我们在创Q加上约束的时候没有指定USING INDEX子句Q所以表和烦引都建立在了用户的默认表I间上了?/font> </p> <p> <font style="FONT-SIZE: 13px">     2Q?对表EMPQDEP和MANAGERq行分析Q收集最新的l计数据Q有利于CBO得到最优的执行计划</font> </p> <p> <font style="FONT-SIZE: 13px">     3Q?在合适的列上创徏索引QEMP的manag_id和dep_no。当表中存在大量的数据的时候,q样可以大大减少׃全表扫描带来的成本?/font> </p> <p> </p> <h3> <b>  5Q?SQL ModelerQ?/b> </h3> <p> <font style="FONT-SIZE: 13px">     SQL Modeler可以帮助开发h员很Ҏ的写出各U复杂的SQL语句Q只需通过单的拖动鼠标Q就能够写出复杂的SQL语句来?/font> </p> <p> <font style="FONT-SIZE: 13px">     打开SQL Modeler的几个途径Q?/font> </p> <p> <font style="FONT-SIZE: 13px"> <ul> <li>a) 打开存储q程~写器的几个途径Q? <p><font style="FONT-SIZE: 13px"><ul><li>菜单?Database -> SQL Modeler Q打开H口 </li><li>单击工具栏第四个按钮 Q打开SQL ModelerH口 </li></ul></font></p><p></p><p><font style="FONT-SIZE: 13px">     H口׃个主要部分组成:</font></p><p><font style="FONT-SIZE: 13px"><ul><li>a) 打开存储q程~写器的几个途径Q? <p><font style="FONT-SIZE: 13px"><ul><li>表选择区域Q最双的那个部分,用来选择From子句中用到的表。拖动到左边的区域或者双d选择了该表? </li><li>表模型区域:用来囑Ş化的昄选择的表和表之间的关联关pR? </li><li>生成SQL区域Q这里显C用囑Ş化方式创建的查询对应的SQL语句 </li></ul></font></p><p></p><p><font style="FONT-SIZE: 13px">     在SQL Modeler里面Q还支持对生成的SQLq行Explain PlanQ调试SQL的性能Q运行SQLQ看是否得到了希望的l果Q保存生成的语句Q或者把语句_脓到SQL Editor里面?/font></p><p><font style="FONT-SIZE: 13px">     有了SQL Modeler的帮助,即是初U的E序员也能编写出复杂而又高效的SQL查询来。比如下面的例子</font></p><p><font style="FONT-SIZE: 13px">     生成步骤Q?/font></p><p><font style="FONT-SIZE: 13px">     1Q?选出表emp, dep, manager</font></p><p><font style="FONT-SIZE: 13px">     2Q?用鼠标拖住emp的emp_name和emp_no, dep的name,manager的name</font></p><p><font style="FONT-SIZE: 13px">     3Q?双击criteriaH口的emp_no condition列,弹出H口Q输入查询条Ӟ比如emp_no=3</font></p><p><font style="FONT-SIZE: 13px">     4Q?׃l果里面不希望emp_no出现Q双击emp_no列的visibleQ设|ؓfalse</font></p><p><font style="FONT-SIZE: 13px">     5Q?q样出来了需要的查询Q现在可以运行查询得到结果,Ҏ询SQLq行分析Q或者在SQL Editor里面打开q个SQLQ或者保存ؓSQL Model文gQ或者再q一步处理,比如加排序, 汇ȝ?/font></p><p><font style="FONT-SIZE: 13px">     DBA斚w的功能:</font></p><p><font style="FONT-SIZE: 13px">     Toad在DBA日常理斚w的能力是非常强大的,可以帮助DBA安全快速地完成许多日常工作Q还有ToadҎ的一些小工具能完成一些普通方法很隑ց到的功能。下面大概讲qC各个常用模块的主要功能:</font></p><p><font style="FONT-SIZE: 13px">     a) Database Monitor</font></p><p><font style="FONT-SIZE: 13px">     提供直观的Oracle数据库运行状况,包括下面q些详细信息Q可以看到逻辑IOQ物理IOQ各个状态的session数目QSGA的利用率Q共享池的用状况,各类事g的等待状况,以及各类事g随着旉的变化情?/font></p><p><font style="FONT-SIZE: 13px">     b) Instance Monitor</font></p><p><font style="FONT-SIZE: 13px"><ul><li>可以用来查本地tnsnames.ora文g里面定义的所有节炏VListener和数据库的运行状态和版本{相关信息? </li><li>可以q程启动、关闭数据库Q如果设|了password验证方式Q?</li></ul></font></p><p></p><p><font style="FONT-SIZE: 13px">     c) Unix MonitorQ?/font></p></li><li>可以监控Unix机器的运行状冉|如详l的机器启动旉QCPU利用率,主要的进E以及这些进E占用的资源Q主要的盘IO{? <p><font style="FONT-SIZE: 13px">     d) Trace/Kill session</font></p><p><font style="FONT-SIZE: 13px"><ul><li>方便的查看所有的q接用户相关信息Q比如终端,E序Q连接时间等 </li><li>Ҏ个用戯行跟t,查看用户执行的SQL语句Q查看语句的执行计划 </li><li>方便的查阅系l的Lock对象Q有没有什么等待别的事务释N的情况,q能够轻易查出等待什么用L什么事件结束,那个用户执行的是什么SQL? </li><li>查看回滚D늚使用状态,什么用P什么语句,使用的什么回滚段Q多读写量{?</li></ul></font></p><p></p><p><font style="FONT-SIZE: 13px">     e) Oracle Parameter</font></p></li><li>可以方便的查看Oraclepȝ的参敎ͼ是否默认|参数作用的简要描qͼ是否可以用alter session/alter system来动态改变,对于那些可以动态改变的参数Q可以双击鼠标来q行修改 <p><font style="FONT-SIZE: 13px">     f) NLS_PARAMETER:</font></p><p><font style="FONT-SIZE: 13px"><ul><li>方便的查看sessionQinstanceQdatabase一U的NLS参数? </li><li>可以动态修改session的NLS参数?</li></ul></font></p><p></p><p><font style="FONT-SIZE: 13px">     g) Extents</font></p><p><font style="FONT-SIZE: 13px"><ul><li>可以查看某个用户下的表和索引的详l的存储情况 </li><li>发现那些占用大量I间的表和烦引,可以考虑使用相应的对{,比如分区 </li><li>发现那些卛_辑ֈmax_extents的表和烦引ƈ可以及时U正 </li><li>发现那些索引和表处于同一个表I间的情况,q可以及时纠正?</li></ul></font></p><p></p><p><font style="FONT-SIZE: 13px">     h) Tablespace</font></p><p><font style="FONT-SIZE: 13px"><ul><li>直观的查看每个表I间的利用率Qȝ_已用空_剩余可是用空间以及默认存储参敎ͼ和表I间是否需要整理等信息 </li><li>查看每个表空间的状态,l成的数据文Ӟ 以及每个数据文g的详l信? </li><li>查看每个表空间里面存在的对象和这些对象的详细存储Ҏ?</li></ul></font></p><p></p><p><font style="FONT-SIZE: 13px">     i) Tablespace MapQ?/font></p></li><li>囑Ş化的昄表空间里面各个表/索引所占用的空_各个segment的大,segment是否q箋{信息,非常直观 <p><font style="FONT-SIZE: 13px">     j) Server Statistics:</font></p><p><font style="FONT-SIZE: 13px"><ul><li>可以非常直观的看到系lMq行情况Q迅速定位系l瓶颈所? </li><li>可以查看pȝ范围内各cȝ待事件的状况Q查看每个连接会话的状况 </li></ul></font></p><p></p><p><font style="FONT-SIZE: 13px">     k) Pinned CodeQ?/font></p><p><font style="FONT-SIZE: 13px"><ul><li>我们知道Q频J执行的大的存储q程最好PinhQ这样可以避免被Oracle在内存不的情况下换出内存,避免动态加载,也避免flush shared pool的时候被清出内存? </li><li>Ҏ每个模块的大,执行ơ数Q决定是否要把某个存储过EPINh。一个按钮就搞定了?</li></ul></font></p><p></p><p><font style="FONT-SIZE: 13px">     l) Control Files:</font></p><p><font style="FONT-SIZE: 13px">     可以查看当前pȝ有哪几个控制文gQ以及控制文件内部记录的详细信息。(实际上就是V$CONTROLFILE, V$CONTROLFILE_RECORD_SECTIONQ?/font></p><p><font style="FONT-SIZE: 13px">     m) Redo Log Manager:</font></p><p><font style="FONT-SIZE: 13px"><ul><li>可以方便的查看LOG的组Q当前日志,每个l里面的成员名字Q大,方便的增加、删除logl,切换当前日志Q对日志归q行具体的控制? </li><li>可以在这个界面里完成几乎所有的对redo log的操作?</li></ul></font></p><p></p><p><font style="FONT-SIZE: 13px">     n) Repair chained rows:</font></p></li><li>Chained rows影响pȝ性能Q处于系l性能的考虑Q需要把chained rows修复成普通的表的行。用repaie chained rows,可以比较容易的做到q一炏V选择需要分析的表,然后分析一下,看有没有chained rowsQ如果有Q点击repairQToad帮你把那些chained rowsl修复了? <p><font style="FONT-SIZE: 13px">     o) Identify Space Deficits</font></p><p><font style="FONT-SIZE: 13px">     如果pȝ出现1659,1653错误Q就是一个不合格的DBA。但是要x预见q些错误Q还是有一定的隑ֺ的。有了Toad的这个小工具之后Q一Ҏ个表I间Q就知道q个表空间里面的剩余自由I间是否允许M表能够扩展到下一个extent。ƈ能够在发现问题之后,直接Ҏ问题?/font></p><p><font style="FONT-SIZE: 13px">     p) Estimate Table/Index Size</font></p><p><font style="FONT-SIZE: 13px"><ul><li>数据库的物理规划中,?索引的存储子句的定义是非帔R要的Q媄响系l。但是没有什么工L话,要ؓ表定义合理的存储子句也不Ҏ? </li><li>在Toad里面Q专门有工具帮助你合理定义表/索引的存储情况: <p><font style="FONT-SIZE: 13px">     1. 自己可以定义来表中需要存储的数据的数?/font></p><p><font style="FONT-SIZE: 13px">     2. 多种估计方式Q?/font></p><p><font style="FONT-SIZE: 13px"><ul><li>Ҏ对已有的数据的分析来定义表的大小Q最_Q但是比较慢Q? </li><li>Ҏ表定义数据类型来定义表的大小 </li><li>Ҏ数据字典中以前分析过的数据来估计大小Q需要近期分析过该表Q?</li></ul></font></p><p></p></li></ul></font></p><p></p><p><font style="FONT-SIZE: 13px">     q) Analyze All Tables</font></p><p><font style="FONT-SIZE: 13px"><ul><li>ZCBO的SQL需要CBO提供最优化的执行\径来提高E序的执行效率,但是假如对表q行大量的DML操作之后Q不及时更新表的l计数据Q这时候CBO׃能选择最为有效的执行路径Q导致程序执行效率低? </li><li>手工分析表比较麻烦,一个一个做? </li><li>用Toad的Analyze Alltablesq个工具Q可以一ơ分析整个模式下面的所有表Q有丰富的控刉项Q包括是采用估计q是完全Q是否同时分析烦引,估计的话Q采用多大的癑ֈ比等?</li></ul></font></p><p></p><p><font style="FONT-SIZE: 13px">     r) Rebuild Table</font></p><p><font style="FONT-SIZE: 13px"><ul><li>当表中的数据被反复大量的DML之后Q而且PCTFREE和PCTUSED定义的不合理的情况下Q表可能会变得非常破,占用大量的extentQ烦引也会相当破,D效率相当低下? </li><li>传统的方式是通过exp/imp来解册个问题,但是步骤实在比较ȝQ手工操作也有一定的危险性? </li><li>使用Rebuild Table工具Q轻松搞定,而且可以手工修改一些通过EXP/IMP无法修改的参敎ͼ比如freelists ,freelists group, tablespaceQinitial{,q能够更改列的名字?</li></ul></font></p><p></p><p><font style="FONT-SIZE: 13px">     s) Relocate Index</font></p><p><font style="FONT-SIZE: 13px"><ul><li>我们知道Q表和烦引一般都需要分开存放C同的表空_q样比较便于理Q性能上也会有一定的提高Q因为可以对表和索引同时存取? </li><li>但是实际上很多时候,׃q样那样的原因,常常忽略了烦引单独存放这个基本概念,比如建立主键U束的时候没有加USING INDEX子句Q后来disable/enable了主键约?唯一性约束等Q都会导致把索引直接存放到和表同一个表I间里面? </li><li>手工发现q些索引Q再逐个Ud非常ȝQ容易出错,在Toad里面Q就很容易根据用?表空间来发现那些不恰当存攄索引Q可以批量移动这些烦引,q且允许重新定义索引的存储子句?</li></ul></font></p><p></p><p><font style="FONT-SIZE: 13px">     t) Generate Schema ScriptsQ?/font></p><p><font style="FONT-SIZE: 13px"><ul><li>可以用来生成整个用户下所?部分对象的DDL语句。可以把l果保存为sql语句或者保存ؓTOAD的自定义格式? </li><li>可以用来复制表结构,QEXP/IMP有非怸重的~陷Q就是从一个大的数据库倒出的表l构Q无法导入到一个小的数据库里面Q因为里面包含了原来表的存储信息Q即佉K择rows=NQ也要在导入数据库里面占用相当大的空_ </li></ul></font></p><p></p><p><font style="FONT-SIZE: 13px">     u) Compare SchemaQ?/font></p><p><font style="FONT-SIZE: 13px"><ul><li>在开发的时候,有时候同时在几个开发库上开发,但是最后两个库的结构不完全一P很难比较 </li><li>用TOAD的这个功能,可以对两个数据库的模式(用户Q下面的所有对象(包括存储q程Q进行比较,可以选择具体的比较内宏V? </li><li>可以通过直接打开两个到各自数据库的连接,或者根据Toad generate schame scripts生成的文件进行对比? </li><li>可以直接生成同步两个数据库的sql脚本Q给出汇ȝ区别要和详细报告{?</li></ul></font></p><p><br /></p></li></ul></font></p></li> </ul> </font> </p> </div> </div> <img height="1" alt="" src="http://c.services.spaces.live.com/CollectionWebService/c.gif?space=21958978&page=RSS%ef%bc%9aToad%e5%bf%ab%e9%80%9f%e5%85%a5%e9%97%a8&referrer=" width="1" border="0" /> <img style="POSITION: absolute" height="0px" alt="" src="http://c.live.com/c.gif?NC=31263&NA=1149&PI=81873&RF=&DI=3919&PS=85545&TP=21958978.spaces.live.com&GT1=21958978;2052" width="0px" /> <br />文章来源:<a >http://21958978.spaces.live.com/Blog/cns!A7DF246804AD47BB!210.entry</a><img src ="http://www.tkk7.com/zilong/aggbug/107596.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zilong/" target="_blank">阿伟</a> 2007-03-31 10:49 <a href="http://www.tkk7.com/zilong/archive/2007/03/31/107596.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入]SQL Server SQL语句调优技?/title><link>http://www.tkk7.com/zilong/archive/2007/03/31/107597.html</link><dc:creator>阿伟</dc:creator><author>阿伟</author><pubDate>Sat, 31 Mar 2007 02:49:00 GMT</pubDate><guid>http://www.tkk7.com/zilong/archive/2007/03/31/107597.html</guid><wfw:comment>http://www.tkk7.com/zilong/comments/107597.html</wfw:comment><comments>http://www.tkk7.com/zilong/archive/2007/03/31/107597.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zilong/comments/commentRss/107597.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zilong/services/trackbacks/107597.html</trackback:ping><description><![CDATA[ <div> <div>SQL Server SQL语句调优技?br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><font style="FONT-SIZE: 11px">        www.InnovateDigital.com 整理</font><font size="3"><br /></font><p><br /></p><p>      通过例子和解析计划,本文展示了在Microsoft SQL Server上提高查询效率有效的一些技巧。在~程中有很多提C和技巧。了解这些技巧可以扩展你在性能优化上的可用。在q部分里我们所有的例子都选择使用Microsoft SHOWPLAN_ALL输出Q因为它更紧凑ƈ且展C典型的信息。(Sybase的查询计划基本与此相同,可能包含其它一些信息)大部分的例子都是要么ZPUBS数据库,要么Z标准pȝ表的。我们在PUBS数据库中对用到的表进行了很大扩充Q对很多表增加了好几万行?br /></p><h3>      子查询优?/h3><br /><p>      一条好的值得U赞的规则是量用连接代替所有的子查询。优化器有时可以自动子查询“扁q_”,q且用常规或外连接代ѝ但那样也不L有效。明的q接寚w择表的序和找到最可能的计划给Z更多的选项。当你优化一个特D查询时Q了解一下是否去掉自查询可生很大的差异?br /></p><p>      CZ<br />      下面查询选择了pubs数据库中所有表的名字,以及每个表的聚集索引Q如果存在)。如果没有聚集烦引,表名仍然昄在列表中Q在聚集索引列中昄Uѝ两个查询返回同Ll果集,但第一个用了一个子查询Q而第二个使用一个外q接时。比较Microsoft SQL Server产生的查询计? </p><dl></dl></tr></tbody></table><table height="317" width="600" border="0"><tbody><tr><td><p>      <b>SUBQUERY SOLUTION</b></p><p>      ---------------------- </p><p>      SELECT st.stor_name AS 'Store', </p><p>      (SELECT SUM(bs.qty) </p><p>      FROM big_sales AS bs </p><p>      WHERE bs.stor_id = st.stor_id), 0) </p><p>      AS 'Books Sold' </p><p>      FROM stores AS st </p><p>      WHERE st.stor_id IN </p><p>      (SELECT DISTINCT stor_id </p><p>      FROM big_sales) </p></td><td><p><b>JOIN SOLUTION</b></p><p>---------------------- </p><p>SELECT st.stor_name AS 'Store', </p><p>SUM(bs.qty) AS 'Books Sold' </p><p>FROM stores AS st </p><p>JOIN big_sales AS bs </p><p>ON bs.stor_id = st.stor_id </p><p>WHERE st.stor_id IN </p><p>(SELECT DISTINCT stor_id </p><p>FROM big_sales) </p><p>GROUP BY st.stor_name </p></td></tr></tbody></table><dl></dl><dl><table height="317" width="600" border="0"><tbody><tr><td><p>      <b>SUBQUERY SOLUTION</b></p><p>      ---------------------- </p><p>      SQL Server parse and compile time: </p><p>          CPU time = 28 ms </p><p>          elapsed time = 28 ms </p><p>      SQL Server Execution Times: </p><p>          CPU time = 145 ms </p><p>          elapsed time = 145 ms </p><p></p><p>      Table 'big_sales'. Scan count 14, logical reads </p><p>      1884, physical reads 0, read-ahead reads 0. </p><p>      Table 'stores'. Scan count 12, logical reads 24, <br />      physical reads 0, read-ahead reads 0. <br /></p></td><td><p><b>JOIN SOLUTION</b></p><p>---------------------- </p><p>SQL Server parse and compile time: </p><p>    CPU time = 50 ms </p><p>    elapsed time = 54 ms </p><p>SQL Server Execution Times: </p><p>    CPU time = 109 ms </p><p>    elapsed time = 109 ms </p><p></p><p>Table 'big_sales'. Scan count 14, logical reads </p><p>966, physical reads 0, read-ahead reads 0. </p><p>Table 'stores'. Scan count 12, logical reads 24, <br />physical reads 0, read-ahead reads 0. </p></td></tr></tbody></table></dl><p>      不必更深探烦Q我们可以看到在CPU和ȝ实耗时间方面连接更快,仅需要子查询Ҏ逻辑ȝ一半。此外,q两U情况伴随着相同的结果集Q虽然排序的序不同Q这是因接查询(׃它的GROUP BY子句Q有一个隐含的ORDER BY: </p><dl><table><tbody><tr><td><p>      Store Books Sold </p><p>      ------------------------------------------------- </p><p>      Barnum's 154125 </p><p>      Bookbeat 518080 </p><p>      Doc-U-Mat: Quality Laundry and Books 581130 </p><p>      Eric the Read Books 76931 </p><p>      Fricative Bookshop 259060 </p><p>      News & Brews 161090 </p><p>      (6 row(s) affected) <br /></p><p>      Store Books Sold </p><p>      ------------------------------------------------- </p><p>      Eric the Read Books 76931 </p><p>      Barnum's 154125 </p><p>      News & Brews 161090 </p><p>      Doc-U-Mat: Quality Laundry and Books 581130 </p><p>      Fricative Bookshop 259060 </p><p>      Bookbeat 518080 </p><p>      (6 row(s) affected) </p></td></tr></tbody></table></dl>      查看q个子查询方法展C的查询计划:<br /><dl><table><tbody><tr><td><p>      |--Compute Scalar(DEFINE:([Expr1006]=isnull([Expr1004], 0))) </p><p>      |--Nested Loops(Left Outer Join, OUTER REFERENCES:([st].[stor_id])) </p><p>      |--Nested Loops(Inner Join, OUTER REFERENCES:([big_sales].[stor_id])) </p><p>         | |--Stream Aggregate(GROUP BY:([big_sales].[stor_id])) </p><p>            | | |--Clustered Index Scan(OBJECT:([pubs].[dbo].[big_sales]. </p><p>            [UPKCL_big_sales]), ORDERED FORWARD) </p><p>         | |--Clustered Index Seek(OBJECT:([pubs].[dbo].[stores].[UPK_storeid] </p><p>      AS [st]), </p><p>      SEEK:([st].[stor_id]=[big_sales].[stor_id]) ORDERED FORWARD) </p><p>       |--Stream Aggregate(DEFINE:([Expr1004]=SUM([bs].[qty]))) </p><p>      |--Clustered Index Seek(OBJECT:([pubs].[dbo].[big_sales]. </p><p>        [UPKCL_big_sales] AS [bs]), </p><p>      SEEK:([bs].[stor_id]=[st].[stor_id]) ORDERED FORWARD) </p></td></tr></tbody></table></dl>      反之Q求和查询操作我们可以得刎ͼ<br /><dl><table><tbody><tr><td><p>      |--Stream Aggregate(GROUP BY:([st].[stor_name]) </p><p>        DEFINE:([Expr1004]=SUM([partialagg1005]))) </p><p>      |--Sort(ORDER BY:([st].[stor_name] ASC)) </p><p>      |--Nested Loops(Left Semi Join, OUTER REFERENCES:([st].[stor_id])) </p><p>      |--Nested Loops(Inner Join, OUTER REFERENCES:([bs].[stor_id])) </p><p>        | |--Stream Aggregate(GROUP BY:([bs].[stor_id]) </p><p>          DEFINE:([partialagg1005]=SUM([bs].[qty]))) </p><p>             | | |--Clustered Index Scan(OBJECT:([pubs].[dbo].[big_sales]. </p><p>            [UPKCL_big_sales] AS [bs]), ORDERED FORWARD) </p><p>        | |--Clustered Index Seek(OBJECT:([pubs].[dbo].[stores]. </p><p>            [UPK_storeid] AS [st]), </p><p>        SEEK:([st].[stor_id]=[bs].[stor_id]) ORDERED FORWARD) </p><p>      |--Clustered Index Seek(OBJECT:([pubs].[dbo].[big_sales]. </p><p>          [UPKCL_big_sales]), </p><p>        SEEK:([big_sales].[stor_id]=[st].[stor_id]) ORDERED FORWARD) </p></td></tr></tbody></table></dl><br />      使用q接是更有效的方案。它不需要额外的聚合(stream aggregateQ,卛_查询所需在big_sales.qty列的求和?br /><br /><br /><br /><p></p><h3>      UNION vs UNION ALL</h3><p><br />      无论何时可能用UNION ALL 代替UNION。其中的差异是因为UNION有排除重复行q且对结果进行排序的副作用,而UNION ALL不会做这些工作。选择无重复行的结果需要徏立时工作表Q用它排序所有行q且在输Z前排序。(在一个select distinct 查询中显C查询计划将发现存在一个流聚合Q消耗百分之三十多的资源处理查询Q。当你确切知道你得需要时Q可以用UNION。但如果你估计在l果集中没有重复的行Q就使用UNION ALL吧。它只是从一个表或一个连接中选择Q然后从另一个表中选择Q附加在W一条结果集的底部。UNION ALL不需要工作表和排序(除非其它条g引v的)。在大部分情况下UNION ALL更具效率。一个有潜在危险的问题是使用UNION会在数据库中产生巨大的泛滥的临时工作表。如果你期望从UNION查询中获得大量的l果集时Q这可能发生?br /><br /></p><p>      CZ<br />      下面的查询是选择pubs数据库中的表sales的所有商店的IDQ也选择表big_sales中的所有商店的IDQ这个表中我们加入了70Q?00多行数据。在q两个方案间不同之处仅仅是UNION 与UNION ALL的用比较。但在这个计划中加入ALL关键字生了三大不同。第一个方案中Q在q回l果集给客户端之前需要流聚合q且排序l果。第二个查询更有效率Q特别是对大表。在q个例子中两个查询返回同Ll果集,虽然序不同。在我们的测试中有两个时表。你的结果可能会E有差异?br /></p><dl><table width="600" border="0"><tbody><tr><td>      <b>UNION SOLUTION </b><p>      ----------------------- </p></td><td><b>      UNION ALL SOLUTION</b><p>      ----------------------- </p></td></tr><tr><td><p>      SELECT stor_id FROM big_sales </p><p>      UNION </p><p>      SELECT stor_id FROM sales </p><p>      ---------------------------- </p></td><td><p>      SELECT stor_id FROM big_sales </p><p>      UNION ALL </p><p>      SELECT stor_id FROM sales </p><p>      ---------------------------- </p></td></tr><tr><td><p>      |--Merge Join(Union) </p><p>       |--Stream Aggregate(GROUP BY: </p><p>      ([big_sales].[stor_id])) </p><p>      | |--Clustered Index Scan </p><p>      (OBJECT:([pubs].[dbo]. </p><p>      [big_sales]. </p><p>      [UPKCL_big_sales]), </p><p>      ORDERED FORWARD) </p><p>      |--Stream Aggregate(GROUP BY: </p><p>      ([sales].[stor_id])) </p><p>       |--Clustered Index Scan </p><p>       (OBJECT:([pubs].[dbo]. </p><p>       [sales].[UPKCL_sales]), </p><p>       ORDERED FORWARD) </p></td><td><p>      |--Concatenation </p><p>      |--Index Scan </p><p>      (OBJECT:([pubs].[dbo]. </p><p>       [big_sales].[ndx_sales_ttlID])) </p><p>      |--Index Scan </p><p>      (OBJECT:([pubs].[dbo]. </p><p>      [sales].[titleidind])) </p></td></tr></tbody></table></dl><table width="600"><tbody><tr><td><p>      <b>UNION SOLUTION</b></p><p>      ----------------------- </p><p>      Table 'sales'. Scan count 1, logical </p><p>      <b>reads 2</b>, physical reads 0, </p><p>      read-ahead reads 0. </p><p>      Table 'big_sales'. Scan count 1, </p><p>      logical </p><p>      <b>reads 463</b>, physical reads 0, </p><p>      read-ahead reads 0. </p></td><td><p>      <b>UNION ALL SOLUTION</b></p><p>      ----------------------- </p><p>      Table 'sales'. Scan count 1, logical </p><p>      <b>reads 1</b>, physical reads 0, </p><p>      read-ahead reads 0. </p><p>      Table 'big_sales'. Scan count 1, </p><p>      logical </p><p>      <b>reads 224</b>, physical reads 0, </p><p>      read-ahead reads 0. </p></td></tr></tbody></table><br />      虽然在这个例子的l果集是可互换的Q你可以看到UNION ALL语句比UNION语句消耗一半的资源。所以应当预料你的结果集q且定已经没有重复Ӟ使用UNION ALL子句?br /><br /><br /><br /><h3>      函数和表辑ּU束索引</h3><br />      当你在烦引列上用内|的函数或表辑ּӞ优化器不能用这些列的烦引。尽量重写这些条Ӟ在表辑ּ中不要包含烦引列?br /><br /><p>      CZ </p><p>      你应该帮助SQL ServerU除M在烦引数值列周围的表辑ּ。下面的查询是从表jobs通过唯一的聚集烦引的唯一键值选择出的一行。如果你在这个列上用表辑ּQ这个烦引就不v作用了。但一旦你条件’job_id-2=0?该成‘job_id=2’,优化器将在聚集烦引上执行seek操作?br /></p><table width="600"><tbody><tr><td>      <b>QUERY WITH SUPPRESSED INDEX </b><p>      ----------------------- </p></td><td>      <b>OPTIMIZED QUERY USING INDEX </b><p>      ----------------------- </p></td></tr><tr><td><p>      SELECT * </p><p>      FROM jobs </p><p>      WHERE (job_id-2) = 0 </p></td><td><p>      SELECT * </p><p>      FROM jobs </p><p>      WHERE job_id = 2 </p></td></tr><tr><td><p>      |--Clustered Index Scan(OBJECT: </p><p>      ([pubs].[dbo].[jobs]. </p><p>      [PK__jobs__117F9D94]), </p><p>      WHERE:(Convert([jobs].[job_id])- </p><p>      2=0)) </p></td><td><p>      |--Clustered Index Seek(OBJECT: </p><p>      ([pubs].[dbo].[jobs]. </p><p>      [PK__jobs__117F9D94]), </p><p>      SEEK:([jobs].[job_id]=Convert([@1])) </p><p>      ORDERED FORWARD) </p><p>      Note that a SEEK is much better than a SCAN, </p><p>      as in the previous query. </p></td></tr></tbody></table><br /><p>      下面表中列出了多U不同类型查询示例,其被止使用列烦引,同时l出改写的方法,以获得更优的性能?br /><br /></p><table width="600"><tbody><tr><td><b>      QUERY WITH SUPPRESSED INDEX</b><p>      --------------------------------------- </p></td><td><b>      OPTIMIZED QUERY USING INDEX </b><p>      -------------------------------------- </p></td></tr><tr><td><p>      DECLARE @job_id VARCHAR(5) </p><p>      SELECT @job_id = ?? </p><p>      SELECT * </p><p>      FROM jobs </p><p>      WHERE CONVERT( VARCHAR(5), </p><p>      job_id ) = @job_id </p><p>      ------------------------------- </p></td><td><p>      DECLARE @job_id VARCHAR(5) </p><p>      SELECT @job_id = ?? </p><p>      SELECT * </p><p>      FROM jobs </p><p>      WHERE job_id = CONVERT( </p><p>      SMALLINT, @job_id ) </p><p>      ------------------------------- </p></td></tr><tr><td><p>      SELECT * </p><p>      FROM authors </p><p>      WHERE au_fname + ' ' + au_lname </p><p>      = 'Johnson White' </p><p>      ------------------------------- </p></td><td><p>      SELECT * </p><p>      FROM authors </p><p>      WHERE au_fname = 'Johnson' </p><p>      AND au_lname = 'White' </p><p>      ------------------------------- </p></td></tr><tr><td><p>      SELECT * </p><p>      FROM authors </p><p>      WHERE SUBSTRING( au_lname, 1, 2 ) = 'Wh' </p><p>      ------------------------------- </p></td><td><p>      SELECT * </p><p>      FROM authors </p><p>      WHERE au_lname LIKE 'Wh%' </p><p>      ------------------------------- </p></td></tr><tr><td><p>      CREATE INDEX employee_hire_date </p><p>      ON employee ( hire_date ) </p><p>      GO </p><p>      -- Get all employees hired </p><p>      -- in the 1st quarter of 1990: </p><p>      SELECT * </p><p>      FROM employee </p><p>      WHERE DATEPART( year, hire_date ) = 1990 </p><p>      AND DATEPART( quarter, hire_date ) = 1 </p><p>      ------------------------------- </p></td><td><p>      CREATE INDEX employee_hire_date </p><p>      ON employee ( hire_date ) </p><p>      GO </p><p>      -- Get all employees hired </p><p>      -- in the 1st quarter of 1990: </p><p>      SELECT * </p><p>      FROM employee </p><p>      WHERE hire_date >= ?/1/1990? </p><p>      AND hire_date < ?/1/1990? </p><p>      ------------------------------- </p></td></tr><tr><td><p>      -- Suppose that hire_date may </p><p>      -- contain time other than 12AM </p><p>      -- Who was hired on 2/21/1990? </p><p>      SELECT * </p><p>      FROM employee </p><p>      WHERE CONVERT( CHAR(10), </p><p>      hire_date, 101 ) = ?/21/1990?</p></td><td><p>      -- Suppose that hire_date may </p><p>      -- contain time other than 12AM </p><p>      -- Who was hired on 2/21/1990? </p><p>      SELECT * </p><p>      FROM employee </p><p>      WHERE hire_date >= ?/21/1990? </p><p>      AND hire_date < ?/22/1990?/p></td></tr></tbody></table><br /><br /><br /><h3>      SET NOCOUNT ON</h3><br />      使用SET NOCOUNT ON 提高T-SQL代码速度的现象SQL Server开发者和数据库系l管理者惊讉解。你可能已经注意到成功的查询q回了关于受影响的行数的pȝ信息。在很多情况下,你不需要这些信息。这个SET NOCOUNT ON命o允许你禁止所有在你的会话事务中的子查询的信息Q直C发出SET NOCOUNT OFF?br />      q个选项不只在于其输出的装饰效果。它减少了从服务器端到客L传递的信息量。因此,它帮助降低了|络通信量ƈ提高了你的事务整体响应时间。传递单个信息的旉可以忽略Q但考虑到这U情况,一个脚本在一个@环里执行一些查询ƈ且发送好几千字节无用的信息给用户?br /><p>      为做个例子,一个文件含T-SQL批处理,其在big_sales表插入了9999行?br /></p><table><p>      -- Assumes the existence of a table called BIG_SALES, a copy of pubs..sales </p><p></p><p>      SET NOCOUNT ON </p><p>      DECLARE @separator VARCHAR(25), </p><p>      @message VARCHAR(25), </p><p>      @counter INT, </p><p>      @ord_nbr VARCHAR(20), </p><p>      @order_date DATETIME, </p><p>      @store_nbr INT, </p><p>      @qty_sold INT, </p><p>      @terms VARCHAR(12), </p><p>      @title CHAR(6), </p><p>      @starttime DATETIME </p><p>      SET @STARTTIME = GETDATE() </p><p>      SELECT @counter = 0, </p><p>      @separator = REPLICATE( '-', 25 ) </p><p>      WHILE @counter < 9999 </p><p>      BEGIN </p><p>      SET @counter = @counter + 1 </p><p>      SET @ord_nbr = 'Y' + CAST(@counter AS VARCHAR(5)) </p><p>      SET @order_date = DATEADD(hour, (@counter * 8), 'Jan 01 1999') </p><p>      SET @store_nbr = </p><p>      CASE WHEN @counter < 999 THEN '6380' </p><p>      WHEN @counter BETWEEN 1000 AND 2999 THEN '7066' </p><p>      WHEN @counter BETWEEN 3000 AND 3999 THEN '7067' </p><p>      WHEN @counter BETWEEN 4000 AND 6999 THEN '7131' </p><p>      WHEN @counter BETWEEN 7000 AND 7999 THEN '7896' </p><p>      WHEN @counter BETWEEN 8000 AND 9999 THEN '8042' </p><p>      ELSE '6380' </p><p>      END </p><p>      SET @qty_sold = </p><p>      CASE WHEN @counter BETWEEN 0 AND 2999 THEN 11 </p><p>      WHEN @counter BETWEEN 3000 AND 5999 THEN 23 </p><p>      ELSE 37 </p><p>      END </p><p>      SET @terms = </p><p>      CASE WHEN @counter BETWEEN 0 AND 2999 THEN 'Net 30' </p><p>      WHEN @counter BETWEEN 3000 AND 5999 THEN 'Net 60' </p><p>      ELSE 'On Invoice' </p><p>      END </p><p>      -- SET @title = (SELECT title_id FROM big_sales WHERE qty = (SELECT MAX(qty) </p><p>      FROM big_sales)) </p><p>      SET @title = </p><p>      CASE WHEN @counter < 999 THEN 'MC2222' </p><p>      WHEN @counter BETWEEN 1000 AND 1999 THEN 'MC2222' </p><p>      WHEN @counter BETWEEN 2000 AND 3999 THEN 'MC3026' </p><p>      WHEN @counter BETWEEN 4000 AND 5999 THEN 'PS2106' </p><p>      WHEN @counter BETWEEN 6000 AND 6999 THEN 'PS7777' </p><p>      WHEN @counter BETWEEN 7000 AND 7999 THEN 'TC3218' </p><p>      ELSE 'PS1372' </p><p>      END </p><p>      -- PRINT @separator </p><p>      -- SELECT @message = STR( @counter, 10 ) -- + STR( SQRT( CONVERT( FLOAT, </p><p>      @counter ) ), 10, 4 ) </p><p>      -- PRINT @message </p><p>      BEGIN TRAN </p><p>      INSERT INTO [pubs].[dbo].[big_sales]([stor_id], [ord_num], [ord_date], </p><p>      [qty], [payterms], [title_id]) </p><p>      VALUES(@store_nbr, CAST(@ord_nbr AS CHAR(5)), @order_date, @qty_sold, </p><p>      @terms, @title) </p><p>      COMMIT TRAN </p><p>      END </p><p>      SET @message = CAST(DATEDIFF(ms, @starttime, GETDATE()) AS VARCHAR(20)) </p><p>      PRINT @message </p><p>      /* </p><p>      TRUNCATE table big_sales </p><p>      INSERT INTO big_sales </p><p>      SELECT * FROM sales </p><p>      SELECT title_id, sum(qty) </p><p>      FROM big_sales </p><p>      group by title_id </p><p>      order by sum(qty) </p><p>      SELECT * FROM big_sales </p><p>      */ </p><p></p><tbody></tbody></table><br />      当带SET NOCOUNT OFF命oq行Q实耗时间是5176毫秒。当带SET NOCOUNT ON命oq行Q实耗时间是1620毫秒。如果不需要输Z的行C息,考虑在每一个存储过E和脚本开始时增加SET NOCOUNT ON 命o?br /><h3>      TOP ?SET ROWCOUNT</h3><br /><p>      SELECT 语句中的TOP子句限制单个查询q回的行敎ͼ而SET ROWCOUNT限制所有后l查询媄响的行数。在很多~程d中这些命令提供了高效率?br />      SET ROWCOUNT在SELECTQINSERTQUPDATE OR DELETE语句中设|可以被影响的最大行数。这些设|在命o执行旉上生效ƈ且只影响当前的会话。ؓ了移除这个限制执行SET ROWCOUNT 0?br />一些实际的d用TOP or SET ROWCOUNT比用标准的SQL命o对编E是更有效率的。让我们在几个例子中证明Q?br /></p><p><b>      TOP n</b></p><p>      在几乎所有的数据库中最行的一个查询是h一个列表中的前NV在 pubs数据库案例中Q我们可以查N售最好CD的前五项。比较用TOPQSET ROWCOUNT和用ANSI SQL的三U方案?br /></p><p>      U?ANSI SQL: </p><p>      Select title,ytd_sales </p><p>      From titles a </p><p>      Where (select count(*) </p><p>      From titles b </p><p>      Where b.ytd_sales>a.ytd_sales </p><p>      )<5 </p><p>      Order by ytd_sales DESC </p><p>      q个UANSI SQLҎ执行一个效率可能很低的兌子查询,特别的在q个例子中,在ytd_sales上没有烦引支持。另外,q个U的标准SQL命o没有qo掉在ytd_sales的空?也没有区别多个CD间有兌的情c? </p><p><br /></p><p><b>      使用 SET ROWCOUNT:</b></p><p>      SET ROWCOUNT 5 </p><p>      SELECT title, ytd_sales </p><p>      FROM titles </p><p>      ORDER BY ytd_sales DESC </p><p>      SET ROWCOUNT 0 </p><p><b>      使用 TOP n:</b></p><p>      SELECT TOP 5 title, ytd_sales </p><p>      FROM titles </p><p>      ORDER BY ytd_sales DESC </p><p>      W二个方案用SET ROWCOUNT来停止SELECT查询Q而第三个Ҏ是当它找到前五行时用TOP n来停止。在q种情况下,在获得结果之前我们也要有一个ORDER BY子句强制Ҏ个表q行排序。两个查询的查询计划实际上是一L。然而,TOP优于SET ROWCOUNT的关键点是SET必须处理ORDER BY子句所需的工作表Q而TOP 不用?br /></p><p>      在一个大表上Q我们可以在ytd_sales上创Z个烦引以避免排序。查询将使用该烦引找到前5行ƈ停止。与W一个方案相比较Q其扫描了整个表QƈҎ一行执行了一个关联子查询。在表上,性能的差异是很小的。但是在一个大表上Q第一个方案的处理旉可能是数个小Ӟ而后两个Ҏ是数U?br /></p><p>      当确定查询需要时Q请考虑是否只需要其中几行,如果是,使用TOP子句节U大量时间?br /><br /></p><p>     <font color="#cc6600">Q北京铸锐数码科技有限公司 www.InnovateDigital.comQ?</font></p></div> </div> <img height="1" alt="" src="http://c.services.spaces.live.com/CollectionWebService/c.gif?space=21958978&page=RSS%ef%bc%9aSQL+Server+SQL%e8%af%ad%e5%8f%a5%e8%b0%83%e4%bc%98%e6%8a%80%e5%b7%a7&referrer=" width="1" border="0" /> <img style="POSITION: absolute" height="0px" alt="" src="http://c.live.com/c.gif?NC=31263&NA=1149&PI=81873&RF=&DI=3919&PS=85545&TP=21958978.spaces.live.com&GT1=21958978;2052" width="0px" /> <br />文章来源:<a >http://21958978.spaces.live.com/Blog/cns!A7DF246804AD47BB!208.entry</a><img src ="http://www.tkk7.com/zilong/aggbug/107597.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zilong/" target="_blank">阿伟</a> 2007-03-31 10:49 <a href="http://www.tkk7.com/zilong/archive/2007/03/31/107597.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入]inner join&left outer join&right outer join 的区?/title><link>http://www.tkk7.com/zilong/archive/2007/03/31/107604.html</link><dc:creator>阿伟</dc:creator><author>阿伟</author><pubDate>Sat, 31 Mar 2007 02:49:00 GMT</pubDate><guid>http://www.tkk7.com/zilong/archive/2007/03/31/107604.html</guid><wfw:comment>http://www.tkk7.com/zilong/comments/107604.html</wfw:comment><comments>http://www.tkk7.com/zilong/archive/2007/03/31/107604.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zilong/comments/commentRss/107604.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zilong/services/trackbacks/107604.html</trackback:ping><description><![CDATA[ <div> <div> <table style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" width="100%" align="center" border="0"> <tbody> <tr> <td align="middle" bgcolor="#bbf0ff"> <font style="FONT-SIZE: 14pt" color="#000066"> <b>inner join&left outer join&right outer join</b> </font> </td> </tr> <tr> <td> <table style="BORDER-COLLAPSE: collapse" bordercolor="#bbf0ff" cellspacing="1" cellpadding="0" width="100%" border="1"> <tbody> <tr> <td align="middle"> <table style="BORDER-COLLAPSE: collapse; WORD-WRAP: break-word" cellspacing="0" cellpadding="0" width="650" border="0"> <tbody> <tr> <td align="middle"> <table style="BORDER-COLLAPSE: collapse; WORD-WRAP: break-word" cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td width="650"> <div> <div> <div> <font color="#ff0000">left outer join === left join</font> </div> <div> <font color="#ff0000">rirht outer join === right join</font> </div> <div> <font color="#ff0000">full outer join === full join</font> </div> <div> <font color="#ff0000">inner join  === A = B</font> </div> <div> <font color="#ff0000"> </font> </div> <div> <font color="#ff0000">no full inner join</font> </div> <div> <font color="#ff0000">no left inner join</font> </div> <div> <font color="#ff0000">no right inner join</font> </div> <div> <font color="#ff0000"> </font> </div> <div> <font color="#ff0000">they are the same as the "inner join"</font> </div> <div> </div> <div> </div> <div> </div> <div> </div> <div>Join types </div> <div> <a> </a> <a> </a> <a> </a> <a> </a> <a> </a> <a> </a> </div> <p>By default, a join is assumed to be an inner join. You can also request other types of joins by clicking <span>Join Type</span> on the Joins page of SQL Assist. The following types of joins are available: </p> <ul> <li> <font color="#0000ff">Inner join </font> </li> <li> <font color="#0000ff">Left outer join </font> </li> <li> <font color="#0000ff">Right outer join </font> </li> <li> <font color="#0000ff">Full outer join </font> </li> </ul> <p> <span>7 </span>An <span>inner join</span> is join method in which <span>7 </span>a column that is not common to all of the tables being joined is dropped from <span>7 </span>the resultant table. If your database supports the OUTER JOIN keywords, you <span>7 </span>can extend the inner join to add rows from one table that have no matching <span>7 </span>rows in the other table. </p> <p>For example, you want to join two tables to get the last name of the manager for each department. The first table is a Department table that lists the employee number of each department manager. The second table is an Employee table that lists the employee number and last name of each employee. However, some departments do not have a manager; in these cases, the employee number of the department manager is null. To include all departments regardless of whether they have a manager, and the last name of the manager, if one exists, you create a <span>left outer join</span>. The left outer join includes rows in the first table that match the second table or are null. The resulting SQL statement is as follows: </p> <pre>SELECT DEPTNO, DEPTNAME, EMPNO, LASTNAME FROM DEPARTMENT LEFT OUTER JOIN EMPLOYEE ON MGRNO = EMPNO </pre> <p>A <span>right outer join</span> is the same as a left outer join, except that it includes rows in the second table that match the first table or are null. A <span>full outer join</span> includes matching rows and null rows from both tables. </p> <p>For example, you have two tables, Table 1 and Table 2, with the following data: <a></a></p> <table rules="all" width="100%" summary="" border="1"> <caption>Table 1. Table 1</caption> <thead valign="bottom"> <tr> <th valign="top" align="left">Column A </th> <th valign="top" align="left">Column B </th> </tr> </thead> <tbody valign="top"> <tr> <td headers="wq37">1 </td> <td headers="wq38">A </td> </tr> <tr> <td headers="wq37">2 </td> <td headers="wq38">B </td> </tr> <tr> <td headers="wq37">3 </td> <td headers="wq38">C </td> </tr> </tbody> </table> <a> </a> <table rules="all" width="100%" summary="" border="1"> <caption>Table 2. Table 2</caption> <thead valign="bottom"> <tr> <th valign="top" align="left">Column C </th> <th valign="top" align="left">Column D </th> </tr> </thead> <tbody valign="top"> <tr> <td headers="wq40">2 </td> <td headers="wq41">X </td> </tr> <tr> <td headers="wq40">4 </td> <td headers="wq41">2 </td> </tr> </tbody> </table> <p>You specify a join condition of Column A = Column C. The result tables for the different types of joins are as follows: </p> <dl> <dt>Inner join </dt> <dd> <a> </a> <table rules="all" width="100%" summary="" border="1"> <caption>Table 3.<font color="#0000ff"> Inner join</font> result table</caption> <thead valign="bottom"> <tr> <th valign="top" align="left">Column A </th> <th valign="top" align="left">Column B </th> <th valign="top" align="left">Column C </th> <th valign="top" align="left">Column D </th> </tr> </thead> <tbody valign="top"> <tr> <td headers="wq43">2 </td> <td headers="wq44">B </td> <td headers="wq45">2 </td> <td headers="wq46">X </td> </tr> </tbody> </table> </dd> <dt>Left outer join </dt> <dd> <a> </a> <table rules="all" width="100%" summary="" border="1"> <caption>Table 4. <font color="#0000ff">Left outer join</font> result table</caption> <thead valign="bottom"> <tr> <th valign="top" align="left">Column A </th> <th valign="top" align="left">Column B </th> <th valign="top" align="left">Column C </th> <th valign="top" align="left">Column D </th> </tr> </thead> <tbody valign="top"> <tr> <td headers="wq48">1 </td> <td headers="wq49">A </td> <td headers="wq50">null </td> <td headers="wq51">null </td> </tr> <tr> <td headers="wq48">2 </td> <td headers="wq49">B </td> <td headers="wq50">2 </td> <td headers="wq51">X </td> </tr> <tr> <td headers="wq48">3 </td> <td headers="wq49">C </td> <td headers="wq50">null </td> <td headers="wq51">null </td> </tr> </tbody> </table> </dd> <dt>Right outer join </dt> <dd> <a> </a> <table rules="all" width="100%" summary="" border="1"> <caption>Table 5. <font color="#0000ff">Right outer join</font> result table</caption> <thead valign="bottom"> <tr> <th valign="top" align="left">Column A </th> <th valign="top" align="left">Column B </th> <th valign="top" align="left">Column C </th> <th valign="top" align="left">Column D </th> </tr> </thead> <tbody valign="top"> <tr> <td headers="wq53">2 </td> <td headers="wq54">B </td> <td headers="wq55">2 </td> <td headers="wq56">X </td> </tr> <tr> <td headers="wq53">null </td> <td headers="wq54">null </td> <td headers="wq55">4 </td> <td headers="wq56">2 </td> </tr> </tbody> </table> </dd> <dt>Full outer join </dt> <dd> <a> </a> <table rules="all" width="100%" summary="" border="1"> <caption>Table 6. <font color="#0000ff">Full outer join</font> result table</caption> <thead valign="bottom"> <tr> <th valign="top" align="left">Column A </th> <th valign="top" align="left">Column B </th> <th valign="top" align="left">Column C </th> <th valign="top" align="left">Column D </th> </tr> </thead> <tbody valign="top"> <tr> <td headers="wq58">1 </td> <td headers="wq59">A </td> <td headers="wq60">null </td> <td headers="wq61">null </td> </tr> <tr> <td headers="wq58">2 </td> <td headers="wq59">B </td> <td headers="wq60">2 </td> <td headers="wq61">X </td> </tr> <tr> <td headers="wq58">3 </td> <td headers="wq59">C </td> <td headers="wq60">null </td> <td headers="wq61">null </td> </tr> <tr> <td headers="wq58">null </td> <td headers="wq59">null </td> <td headers="wq60">4 </td> <td headers="wq61">2 </td> </tr> </tbody> </table> </dd> </dl> <p>If you specify value (a,c), you obtain the following result: <a></a></p> <table rules="all" width="100%" summary="" border="1"> <caption>Table 7. Result of value (a,c)</caption> <thead valign="bottom"> <tr valign="bottom"> <th align="middle" width="100%">Value (a,c) </th> </tr> </thead> <tbody valign="top"> <tr valign="bottom"> <td align="middle" headers="wq63">1 </td> </tr> <tr valign="bottom"> <td align="middle" headers="wq63">2 </td> </tr> <tr valign="bottom"> <td align="middle" headers="wq63">3 </td> </tr> <tr valign="bottom"> <td align="middle" headers="wq63">4 </td> </tr> </tbody> </table> <div> <div> <span>Related concepts</span> <ul> <li> <a > <font color="#800080"> <u>Star joins</u> </font> </a> </li> </ul> </div> </div> </div> </div> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> </div> </div> <img height="1" alt="" src="http://c.services.spaces.live.com/CollectionWebService/c.gif?space=21958978&page=RSS%ef%bc%9ainner+join%26left+outer+join%26right+outer+join+%e7%9a%84%e5%8c%ba%e5%88%ab&referrer=" width="1" border="0" /> <img style="POSITION: absolute" height="0px" alt="" src="http://c.live.com/c.gif?NC=31263&NA=1149&PI=81873&RF=&DI=3919&PS=85545&TP=21958978.spaces.live.com&GT1=21958978;2052" width="0px" /> <br />文章来源:<a >http://21958978.spaces.live.com/Blog/cns!A7DF246804AD47BB!197.entry</a><img src ="http://www.tkk7.com/zilong/aggbug/107604.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zilong/" target="_blank">阿伟</a> 2007-03-31 10:49 <a href="http://www.tkk7.com/zilong/archive/2007/03/31/107604.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://ccc321.com" target="_blank">޾ƷƵ</a>| <a href="http://zbhongtai.com" target="_blank">ĻѸƵ</a>| <a href="http://zgnyxx.com" target="_blank">AV벻</a>| <a href="http://caoporg.com" target="_blank">hsѸ߹ۿ</a>| <a href="http://jyzs888.com" target="_blank">վѹۿ</a>| <a href="http://66cws.com" target="_blank">ѹۿ</a>| <a href="http://0415ss.com" target="_blank">ɫˬ1000</a>| <a href="http://littlevv.com" target="_blank">˳ɵӰվ</a>| <a href="http://dukane1688.com" target="_blank">޹˾Ʒþ</a>| <a href="http://nyminer.com" target="_blank">þƷAV鶹Ƭ</a>| <a href="http://tpwelert.com" target="_blank">Ƭһһ߹ۿ </a>| <a href="http://116com.com" target="_blank">޾Ʒ岻</a>| <a href="http://saozib.com" target="_blank">ŮëƬƵ</a>| <a href="http://boyipark.com" target="_blank">18δֹѹۿ</a>| <a href="http://www-84243.com" target="_blank">ĻƵ</a>| <a href="http://8k91.com" target="_blank">2019Ļ</a>| <a href="http://haha02.com" target="_blank">99Ʒһ</a>| <a href="http://9haolc.com" target="_blank">Ʒۿ˳</a>| <a href="http://8x6c.com" target="_blank">Ȼר</a>| <a href="http://52xdc.com" target="_blank">AVվ</a>| <a href="http://kelingdq.com" target="_blank">츾avһ</a>| <a href="http://dw168cn.com" target="_blank">ۺС˵þ </a>| <a href="http://266hd.com" target="_blank">þþþþþƷͼƬ</a>| <a href="http://65123456.com" target="_blank">a߹ۿƵ</a>| <a href="http://hwafarda.com" target="_blank">ƷëٸAVѾþ</a>| <a href="http://mp4888.com" target="_blank">һaƬɫëƬվ </a>| <a href="http://516698.com" target="_blank">Ƶ</a>| <a href="http://0359puju.com" target="_blank">ԻƵ30ӳ</a>| <a href="http://xyzch.com" target="_blank">ֳִִֺƵ</a>| <a href="http://116603a.com" target="_blank">91ڹӰ</a>| <a href="http://whyandroid.com" target="_blank">91ʪ</a>| <a href="http://guanxianedu.com" target="_blank">Ƶ</a>| <a href="http://mt569.com" target="_blank">2020þþƷ</a>| <a href="http://niu44.com" target="_blank">߶</a>| <a href="http://scienfood.com" target="_blank">ҹAëƬ</a>| <a href="http://118762.com" target="_blank">ֻѸۿ</a>| <a href="http://sese3366.com" target="_blank">ҹƷѹۿ</a>| <a href="http://hnkangshi.com" target="_blank">ִִֺƵ </a>| <a href="http://ccc998.com" target="_blank">һa뼺Ӳִѿ51Ʒ </a>| <a href="http://quxx28.com" target="_blank">avһ</a>| <a href="http://5r7b.com" target="_blank">޳avƬ߹ۿ벻</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>