刪除表中多余的重復記錄,重復記錄是根據單個字段(peopleId)來判斷,只留有rowid最小的記錄
delete
from tb_user_add_serv_fee a
where a.register_id in (select t.register_id
from tb_user_add_serv_fee t
where t.ubill_month = '201007'
group by t.register_id, t.region_no
having count(1) > 1)
and rowid not in (select min(rowid)
from tb_user_add_serv_fee t
where t.ubill_month = '201007'
group by t.register_id
having count(1) > 1)
and a.ubill_month = '201007';
Oracle刪除重復記錄的最好的方
法:
DELETE
FROM EMP E WHERE E.ROWID > (SELECT MIN(y.ROWID)
FROM EMP y
WHERE
y.EMPNO = E.EMPNO )
1、子查詢找出某員工最低的ROWID(肯定只有一個),其它大于這條記錄ROWID的,全部刪除。
2、Oracle中使用ROWID刪除重復記錄最快,因為Rowid對應這條記錄在磁盤上的位置
面試:性能
優化
規則:SELECT子句中避免使用 ‘
* ‘
規則:使用
exists語句代替in語句;
使用not exists代替not in
規則:使用truncate代替delete from
表語句
規則:減少訪
問數據庫的次數
規
則:減少訪問數據庫的次數
規則:使用表的別名(Alias)
規則:盡快使用COMMIT
規則:數據庫冗余字段的設計
其它:Oracle與性能有關的幾個特征(三個緩沖區)
面試:企業為什么經常使用Oracle?
Oracle為什么這么牛?
回答:從三個緩沖區入手
一、日志緩沖區
·在添加一條記錄時,數據庫在后臺同時也要記錄一條日志
·Oracle
能夠先將日志寫在內存中,緩沖區滿后再一次性寫入磁盤
二、塊緩沖區
·如果一個表(如部門表)很少更新但經常使用,那么可以將該表保存
在內存中,從而避免頻繁訪問磁盤。
·訪問內存的速度大于高于訪問磁盤的速度。
三、SQL緩沖區
·數據庫執行步驟:語法分
析、語義分析、編譯、優化……
·所以SQL在執行以前所消耗的時間是很長的
·Oracle數據庫會將sql保存在SQL緩沖區,如果
執行的是相同SQL,則無論執行多少次,都只會編譯分析一次。從而減少分析和優化時間。
原貼:http://mamaoyuan625.javaeye.com/blog/394796