首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

merge、delete、/*+ BYPASS_UJVC*/,剔除效率

2012-12-15 
merge、delete、/*+ BYPASS_UJVC*/,删除效率--删除的数据量为2万条 --table1 数据量为百万级,table2为时间窗

merge、delete、/*+ BYPASS_UJVC*/,删除效率


--删除的数据量为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.01s

delete 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表,有时候俩个表的数据都被删除了。
[最优解释]
引用:
引用:SQL code12345678910111213--对于你第一种方法,我测试了一下--删除起作用的是右面的表,这种写法删除的是 B表DELETE /*+ BYPASS_UJVC*/FROM (SELECT        A.*        FROM table1 A, table2 B       WHERE A.INSER……


存储过程封装,让etl 调用存储过程。

[其他解释]
路过关注下,共求结果。顶下!
[其他解释]
这样不行么:
delete from table1 a where exists(select 1 from table2 B where A.INSERTDATE >= B.ETLNOWSTATDATE  AND A.INSERTDATE <= B.ETLLASTENDDATE) 
[其他解释]
引用:
这样不行么:
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表
--没有测试出来两个表数据全部被删除的情况



[其他解释]
引用:
SQL code12345678910111213--对于你第一种方法,我测试了一下--删除起作用的是右面的表,这种写法删除的是 B表DELETE /*+ BYPASS_UJVC*/FROM (SELECT        A.*        FROM table1 A, table2 B       WHERE A.INSERTDATE >= B.ETLNOWSTATD……

嗯,我在plsql中测试的结果也是这样的,
然后以为就是这样的原理,但是我将它放到etl工具中去调用执行的时候,AB俩张表的记录都被删除了。
我表示,不淡定了。
[其他解释]
引用:
引用:引用:SQL code12345678910111213--对于你第一种方法,我测试了一下--删除起作用的是右面的表,这种写法删除的是 B表DELETE /*+ BYPASS_UJVC*/FROM (SELECT        A.*        FROM table1 A, tabl……


这种删除数据的方式,没有理论可以参考。不太敢用,您那儿有相关的说明吗?
[其他解释]
没有。
如果你担心删除掉B表的数据,在B表上加个触发器,不让ETL删除就是了。


引用:
引用:引用:引用:SQL code12345678910111213--对于你第一种方法,我测试了一下--删除起作用的是右面的表,这种写法删除的是 B表DELETE /*+ BYPASS_UJVC*/FROM (SELECT        A.*     ……

[其他解释]
引用:
没有。
如果你担心删除掉B表的数据,在B表上加个触发器,不让ETL删除就是了。


引用:引用:引用:引用:SQL code12345678910111213--对于你第一种方法,我测试了一下--删除起作用……

--删除的数据量为2万条 
--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表的记录。





[其他解释]
引用:
引用:没有。
如果你担心删除掉B表的数据,在B表上加个触发器,不让ETL删除就是了。


引用:引用:引用:引用:SQL code12345678910111213--……

热点排行