1. 程式人生 > >Oracle刪除表中資料的時候應該注意的問題 Oracle與MySql他們一些表之間的區別

Oracle刪除表中資料的時候應該注意的問題 Oracle與MySql他們一些表之間的區別

1. 刪除表的注意事項
在刪除一個表中的全部資料時,須使用TRUNCATE TABLE 表名;因為用DROP TABLE,DELETE * FROM 表名時,TABLESPACE表空間該表的佔用空間並未釋放,反覆幾次DROP,DELETE操作後,該TABLESPACE上百兆的空間就被耗光了。
2.having 子句的用法
having 子句對 group by 子句所確定的行組進行控制,having 子句條件中只允許涉及常量,聚組函式或group by 子句中的列.

3.外部聯接"+"的用法
外部聯接"+"按其在"="的左邊或右邊分左聯接和右聯接.若不帶"+"運算子的表中的一個行不直接匹配於帶"+"預算符的表中的任何行,則前者的行與後者中的一個空行相匹配並被返回.若二者均不帶’+’,則二者中無法匹配的均被返回.利用外部聯接"+",可以替代效率十分低下的 not in 運算,大大提高執行速度.例如,下面這條命令執行起來很慢
用外聯接提高表連線的查詢速度
在作表連線(常用於檢視)時,常使用以下方法來查詢資料:

SELECT PAY_NO, PROJECT_NAME
  FROM A
  WHERE A.PAY_NO NOT IN (SELECT PAY_
  NO FROM B WHERE VALUE >=120000);

  但是若表A有10000條記錄,表B有10000條記錄,則要用掉30分鐘才能查完,主要因為NOT IN要進行一條一條的比較,共需要10000*10000次比較後,才能得到結果。該用外聯接後,可以縮短到1分左右的時間:

SELECT PAY_NO,PROJECT_NAME
  FROM A,B
  WHERE A.PAY_NO=B.PAY_NO(+)
  AND B.PAY_NO IS
NULL   AND B.VALUE >=12000;

 

4.set transaction 命令的用法
在執行大事務時,有時oracle會報出如下的錯誤:
ORA-01555:snapshot too old (rollback segment too small)
這說明oracle給此事務隨機分配的回滾段太小了,這時可以為它指定一個足夠大的回滾段,以確保這個事務的成功執行.例如

set transaction use rollback segment roll_abc;
  delete from table_name where ...
  
commit;

 

5.資料庫重建應注意的問題
在利用import進行資料庫重建過程中,有些檢視可能會帶來問題,因為結構輸入的順序可能造成檢視的輸入先於它低層次表的輸入,這樣建立檢視就會失敗.要解決這一問題,可採取分兩步走的方法:首先輸入結構,然後輸入資料.命令舉例如下 (uesrname:jfcl,password:hfjf,host sting:ora1,資料檔案:expdata.dmp):
imp jfcl/[email protected] file=empdata.dmp rows=N
imp jfcl/[email protected] file=empdata.dmp full=Y buffer=64000
commit=Y ignore=Y

      第一條命令輸入所有資料庫結構,但無記錄.第二次輸入結構和資料,64000位元組提交一次.ignore=Y選項保證第二次輸入既使物件存在的情況下也能成功.

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

倘若利用外部聯接,改寫命令如下:

複製程式碼
select a.empno from emp a ,emp1 b
  
  where a.empno=b.empno(+)
  
  and b.empno is null
  
  and b.job=’SALE’;
複製程式碼

可以發現,執行速度明顯提高.

6.從已知表新建另一個表:

CREATE TABLE b
  AS SELECT * (可以是表a中的幾列)
  FROM a
  WHERE a.column = ...;

7.查詢、刪除重複記錄:

法一: 用Group by語句 此查詢很快的

select count(num), max(name) from student --查詢表中num列重複的,列出重複的記錄數,並列出他的name屬性
  group by num
  having count(num) >1 --按num分組後找出表中num列重複,即出現次數大於一次
  delete from student(上面Select的)
  這樣的話就把所有重複的都刪除了。-----慎重

法二:當表比較大(例如10萬條以上)時,這個方法的效率之差令人無法忍受,需要另想辦法:

複製程式碼
  ---- 執行下面SQL語句後就可以顯示所有DRAWING和DSNO相同且重複的記錄
  SELECT * FROM EM5_PIPE_PREFAB
  WHERE ROWID!=(SELECT MAX(ROWID) FROM EM5_PIPE_PREFAB D --D相當於First,Second
  WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND
  EM5_PIPE_PREFAB.DSNO=D.DSNO);
 ---- 執行下面SQL語句後就可以刪除所有DRAWING和DSNO相同且重複的記錄
  DELETE FROM EM5_PIPE_PREFAB
  WHERE ROWID!=(SELECT MAX(ROWID) FROM EM5_PIPE_PREFAB D
  WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND
  EM5_PIPE_PREFAB.DSNO=D.DSNO);