作者:風(fēng)未起時(shí) 來(lái)源:中國站長(cháng)學(xué)院 發(fā)布時(shí)間:2005-4-5 10:18:17 發(fā)布人:admin
增大字體
1.having 子句的用法
having 子句對 group by 子句所確定的行組進(jìn)行控制,having 子句條件中只允許涉及常量,聚組函數或group by 子句中的列.
2.外部聯(lián)接"+"的用法
外部聯(lián)接"+"按其在"="的左邊或右邊分左聯(lián)接和右聯(lián)接.若不帶"+"運算符的表中的一個(gè)行不直接匹配于帶"+"預算符的表中的任何行,則前者的行與后者中的一個(gè)空行相匹配并被返回.若二者均不帶’+’,則二者中無(wú)法匹配的均被返回.利用外部聯(lián)接"+",可以替代效率十分低下的 not in 運算,大大提高運行速度.例如,下面這條命令執行起來(lái)很慢
4.set transaction 命令的用法
在執行大事務(wù)時(shí),有時(shí)oracle會(huì )報出如下的錯誤:
ORA-01555:snapshot too old (rollback segment too small)
這說(shuō)明oracle給此事務(wù)隨機分配的回滾段太小了,這時(shí)可以為它指定一個(gè)足夠大的回滾段,以確保這個(gè)事務(wù)的成功執行.例如
set transaction use rollback segment roll_abc;
delete from table_name where ...
commit;
回滾段roll_abc被指定給這個(gè)delete事務(wù),commit命令則在事務(wù)結束之后取消了回滾段的指定.
5.使用索引的注意事項
select,update,delete 語(yǔ)句中的子查詢(xún)應當有規律地查找少于20%的表行.如果一個(gè)語(yǔ)句查找的行數超過(guò)總行數的20%,它將不能通過(guò)使用索引獲得性能上的提高.
索引可能產(chǎn)生碎片,因為記錄從表中刪除時(shí),相應也從表的索引中刪除.表釋放的空間可以再用,而索引釋放的空間卻不能再用.頻繁進(jìn)行刪除操作的被索引的表,應當階段性地重建索引,以避免在索引中造成空間碎片,影響性能.在許可的條件下,也可以階段性地truncate表,truncate命令刪除表中所有記錄,也刪除索引碎片.
6.數據庫重建應注意的問(wèn)題
在利用import進(jìn)行數據庫重建過(guò)程中,有些視圖可能會(huì )帶來(lái)問(wèn)題,因為結構輸入的順序可能造成視圖的輸入先于它低層次表的輸入,這樣建立視圖就會(huì )失敗.要解決這一問(wèn)題,可采取分兩步走的方法:首先輸入結構,然后輸入數據.命令舉例如下 (uesrname:jfcl,password:hfjf,host sting:ora1,數據文件:expdata.dmp):
imp jfcl/hfjf@ora1 file=empdata.dmp rows=N
imp jfcl/hfjf@ora1 file=empdata.dmp full=Y buffer=64000
commit=Y ignore=Y
第一條命令輸入所有數據庫結構,但無(wú)記錄.第二次輸入結構和數據,64000字節提交一次.ignore=Y選項保證第二次輸入既使對象存在的情況下也能成功.
select a.empno from emp a where a.empno not in
(select empno from emp1 where job=’SALE’);
倘若利用外部聯(lián)接,改寫(xiě)命令如下:
select a.empno from emp a ,emp1 b
where a.empno=b.empno(+)
and b.empno is null
and b.job=’SALE’;
可以發(fā)現,運行速度明顯提高.
3.刪除表內重復記錄的方法
可以利用這樣的命令來(lái)刪除表內重復記錄:
delete from table_name a
where rowid< (select max(rowid) from table_name
where column1=a.column1 and column2=a.column2
and colum3=a.colum3 and ...);
不過(guò),當表比較大(例如50萬(wàn)條以上)時(shí),這個(gè)方法的效率之差令人無(wú)法忍受,需要另想辦法