实际案例: 有以下几种不同的场景,对应使用不同的删除策略。
第一种: 100万数据中删除部门10的数据。
分析: 量级比较少,直接可以用Delete和Where搭配删除。
第二种:将6000万的数据全部删除,Delete和Where搭配删除都可以,但是考虑到效率问题,直接用Truncate语法:Truncate table 表名.
第三种:将6000万的数据中删除部门10,Delete 可以用,但是删除的效率相当低,必须要循环6000万次,每次进行判断,然后才有效果。
这里需要引用Merge Into , 相当于增量同步插入后,增量更新数据,这个更新也包含删除。
语法格式:MERGE(不是所有数据库都通用)
MERGE INTO 目标表 USING (增量)
ON (匹配字段)
WHEN MATCHED THEN UPDATE SET --UPDATE和SET之间不需要加表名
WHEN NOT MATCHED THEN INSERT VALUE --INSERT和VALUES之间不需要加INTO 表名
Q: 请问这个不能直接用DELETE 语句?
A: 不行,因为当用匹配字段搭配后,我们必须要用Update语句。
Q:为什么一般来说,这个会比Delete加Where语句一起更好?
A: (我的个人理解,之后也许会更正)因为,自己和自己一起连接。
这里面把部门10看做了一个整体,当有匹配到这表里面部门10,有点像索引的意思。 那就判断如果匹配成功后就直接删除。
MERGE INTO EMP E
USING (SELECT * FROM EMP WHERE DEPTNO = 10) S
ON (S.EMPNO = E.EMPNO)
WHEN MATCHED THEN
UPDATE SET E.COMM = E.COMM DELETE WHERE 1 = 1;
第四种:本身部门10的数据量也很多,占据整个总表的95%以上。如果直接删除则很久才能执行。 思路在于:我们先创建一张临时表,然后只选择查询部门20,部门30,部门40即可。