select a.empno from emp a where a.empno not in
  (select empno from emp1 where job=´SALE´);

—- 倘若利用外部聯(lián)接,改寫命令如下:

以下是代碼片段:
    select a.empno from emp a ,emp1 b
  where a.empno=b.empno(+)
  and b.empno is null
  and b.job=´SALE´;

—- 可以發(fā)現(xiàn),運行速度明顯提高.

—- 3.刪除表內(nèi)重復(fù)記錄的方法

—- 可以利用這樣的命令來刪除表內(nèi)重復(fù)記錄:

以下是代碼片段:
    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 …);

—- 不過,當(dāng)表比較大(例如50萬條以上)時,這個方法的效率之差令人無法忍受,需要另想辦法(可參看拙文《電信計費中長途重復(fù)話單的技術(shù)處理》,《計算機與通信》,1999-07).

—- 4.set transaction 命令的用法

—- 在執(zhí)行大事務(wù)時,有時oracle會報出如下的錯誤:

ORA-01555:snapshot too old (rollback segment too small)

—- 這說明oracle給此事務(wù)隨機分配的回滾段太小了,這時可以為它指定一個足夠大的回滾段,以確保這個事務(wù)的成功執(zhí)行.例如

以下是代碼片段:
    set transaction use rollback segment roll_abc;
  delete from table_name where …
  commit;

—- 回滾段roll_abc被指定給這個delete事務(wù),commit命令則在事務(wù)結(jié)束之后取消了回滾段的指定.

—- 5.使用索引的注意事項

—- select,update,delete 語句中的子查詢應(yīng)當(dāng)有規(guī)律地查找少于20%的表行.如果一個語句查找的行數(shù)超過總行數(shù)的20%,它將不能通過使用索引獲得性能上的提高.

—- 索引可能產(chǎn)生碎片,因為記錄從表中刪除時,相應(yīng)也從表的索引中刪除.表釋放的空間可以再用,而索引釋放的空間卻不能再用.頻繁進行刪除操作的被索引的表,應(yīng)當(dāng)階段性地重建索引,以避免在索引中造成空間碎片,影響性能.在許可的條件下,也可以階段性地truncate表,truncate命令刪除表中所有記錄,也刪除索引碎片.

—- 6.數(shù)據(jù)庫重建應(yīng)注意的問題

—- 在利用import進行數(shù)據(jù)庫重建過程中,有些視圖可能會帶來問題,因為結(jié)構(gòu)輸入的順序可能造成視圖的輸入先于它低層次表的輸入,這樣建立視圖就會失敗.要解決這一問題,可采取分兩步走的方法:首先輸入結(jié)構(gòu),然后輸入數(shù)據(jù).命令舉例如下

以下是代碼片段:
    (uesrname:jfcl,password:hfjf,host sting:ora1,數(shù)據(jù)文件: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

—- 第一條命令輸入所有數(shù)據(jù)庫結(jié)構(gòu),但無記錄.第二次輸入結(jié)構(gòu)和數(shù)據(jù),64000字節(jié)提交一次.ignore=Y選項保證第二次輸入既使對象存在的情況下也能成功.

分享到

wangyao

相關(guān)推薦