--删除的数据量为2万条
--table1 数据量为百万级,table2为时间窗 仅一条记录
DELETE /*+ BYPASS_UJVC*/
FROM (SELECT
A.*
FROM table1 A, table2 B
WHERE A.INSERTDATE >= B.ETLNOWSTATDATE
AND A.INSERTDATE <= B.ETLLASTENDDATE) ;
--执行0.01sdelete from table1 a
where a.INSERTDATE >= (select b.statdate from table2 b)
and a.INSERTDATE <= (select b.enddate from table2 b)
--执行90s如上,执行的时间差距非常大。
但是第一中删除的方法,不能确定删除的是A表还是B表。
在我自己测试的时候,有时候只删除A表,有时候俩个表的数据都被删除了。
解决方案 »
- 查看Oracle的连接数,以及每增加一个连接数,所消耗的CPU。
- oracle 导入导出数据
- oracle 触发器的问题!
- 100分求救,我把Oracle 的一个用户删除了,又导入了新的数据,如何恢复上次删除的用户的表结构啊!!!!!!!!!!!!!!????????
- 我想学一下数据库,然后搜一下,myspl。为什么它总是和php联系在一起,我想找数据库的教学视频,但是没有找到合适的,希望有人推荐一下,谢谢
- 请问如何执行数据库链路上的过程?急
- 最最菜鸟的问题:oracle的循环控制语句中有没有break和continue语句,要是没有有什么替代语句?
- DDE.Initiate 在XP系统中无法执行
- oracle8.16(或8.17)向低版本建数据链路问题
- ping 1521
- oracle索引问题
- 用简洁的sql 查询出平均值的最大值
delete from table1 a where exists(select 1 from table2 B where A.INSERTDATE >= B.ETLNOWSTATDATE AND A.INSERTDATE <= B.ETLLASTENDDATE)
--对于你第一种方法,我测试了一下
--删除起作用的是右面的表,这种写法删除的是 B表
DELETE /*+ BYPASS_UJVC*/
FROM (SELECT
A.*
FROM table1 A, table2 B
WHERE A.INSERTDATE >= B.ETLNOWSTATDATE
AND A.INSERTDATE <= B.ETLLASTENDDATE) ;--把A和B调换位置,删除的是A表
--没有测试出来两个表数据全部被删除的情况
然后以为就是这样的原理,但是我将它放到etl工具中去调用执行的时候,AB俩张表的记录都被删除了。
我表示,不淡定了。
存储过程封装,让etl 调用存储过程。
如果你担心删除掉B表的数据,在B表上加个触发器,不让ETL删除就是了。
--table1 数据量为百万级,table2为时间窗 仅一条记录
今儿又找了一个环境,在plsql中进行了测试。
测试结果如下:
DELETE /*+ BYPASS_UJVC*/
FROM (SELECT
A.*
FROM table1 A, table2 B
WHERE A.INSERTDATE >= B.ETLNOWSTATDATE
AND A.INSERTDATE <= B.ETLLASTENDDATE) ;
--第一种删除方式,删除AB俩张表的记录;
--~~~~~~~~~~~~~~~~~~~~~~~
DELETE /*+ BYPASS_UJVC*/
FROM (SELECT
A.*
FROM table2 B, table1 A
WHERE A.INSERTDATE >= B.ETLNOWSTATDATE
AND A.INSERTDATE <= B.ETLLASTENDDATE) ;
--调换AB的顺序,只删除了达标A表的记录。