2008年2月19日
#
摘要: 網(wǎng)易微博最近也開(kāi)放了它的開(kāi)發(fā)平臺(tái)http://open.t.163.com,其中java版的oauth認(rèn)證和新浪微博的很類似(貌似都是從twitter那邊copy過(guò)來(lái)的)。但說(shuō)句實(shí)話,網(wǎng)易java版的sdk和新浪微博的比起來(lái),的確上手比較麻煩,里面提供的example都是把a(bǔ)ccess token寫(xiě)死,作為參數(shù),具體的代碼如下:
public&nb...
閱讀全文
摘要: 在springside3.*中的showcase案例中,有一個(gè)把log4j的日志存入數(shù)據(jù)庫(kù)的演示,下面是我對(duì)這個(gè)案例的學(xué)習(xí)筆記。
1、我們首先來(lái)看下log4j相關(guān)日志的配置:
#Async Database Appender (Store business&n...
閱讀全文
一直聽(tīng)到的都是說(shuō)盡量用exists不要用in,因?yàn)閑xists只判斷存在而in需要對(duì)比值,所以exists比較快,但看了看網(wǎng)上的一些東西才發(fā)現(xiàn)根本不是這么回事。
下面這段是抄的
Select * from T1 where x in ( select y from T2 )
執(zhí)行的過(guò)程相當(dāng)于:
select *
from t1, ( select distinct y from t2 ) t2
where t1.x = t2.y;
select * from t1 where exists ( select null from t2 where y = x )
執(zhí)行的過(guò)程相當(dāng)于:
for x in ( select * from t1 )
loop
if ( exists ( select null from t2 where y = x.x )
then
OUTPUT THE RECORD
end if
end loop
從我的角度來(lái)說(shuō),in的方式比較直觀,exists則有些繞,而且in可以用于各種子查詢,而exists好像只用于關(guān)聯(lián)子查詢(其他子查詢當(dāng)然也可以用,可惜沒(méi)意義)。
由于exists是用loop的方式,所以,循環(huán)的次數(shù)對(duì)于exists影響最大,所以,外表要記錄數(shù)少,內(nèi)表就無(wú)所謂了,而in用的是hash join,所以內(nèi)表如果小,整個(gè)查詢的范圍都會(huì)很小,如果內(nèi)表很大,外表如果也很大就很慢了,這時(shí)候exists才真正的會(huì)快過(guò)in的方式。
下面這段還是抄的
not in 和not exists
如果查詢語(yǔ)句使用了not in 那么內(nèi)外表都進(jìn)行全表掃描,沒(méi)有用到索引;
而not extsts 的子查詢依然能用到表上的索引。
所以無(wú)論那個(gè)表大,用not exists都比not in要快。
也就是說(shuō),in和exists需要具體情況具體分析,not in和not exists就不用分析了,盡量用not exists就好了。
在pl/sql developer中,直接寫(xiě)條sql,按F5,就可以調(diào)出執(zhí)行計(jì)劃,但在只有sql plus的情況下,只能用下面這個(gè)語(yǔ)句了,
explain plan for select ....
然后再來(lái)一句
select * from table(dbms_xplan.display());
就會(huì)出現(xiàn)一個(gè)類似下面的信息
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | |
| 1 | NESTED LOOPS | | | | |
| 2 | TABLE ACCESS FULL | AC01 | | | |
| 3 | TABLE ACCESS BY INDEX ROWID| AB01 | | | |
| 4 | INDEX UNIQUE SCAN | PK_AB01 | | | |
----------------------------------------------------------------------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Note: rule based optimization, PLAN_TABLE' is old version
就能看到執(zhí)行計(jì)劃了。
在oracle中如果列在sql中操作,是很正常的事,比如:
select col1,col2,col1+col2 from table1;
但如果使用了別名,情況就不同了:
select col1 a,col2 b,a+b from table1;
會(huì)報(bào)以下的錯(cuò)誤:
ORA-00904: "B": invalid identifier
怎么解決呢,就是套一個(gè)select在外面:
select a,b,a+b from (select col1 a,col2 b from table1);
這樣就沒(méi)有問(wèn)題了。