Create Table t1 (
table_id number,
dose_detail clob,
CONSTRAINT t1_pk PRIMARY KEY (table_id)
);
Create Table t2 (
table_id number,
dose_detail clob,
CONSTRAINT t2_pk PRIMARY KEY (table_id)
);
此clob列包含1400万个数据,我需要在这两个表之间执行MINUS操作。
我用于减法的这种方法:
SELECT table_id,
DBMS_OBFUSCATION_TOOLKIT.MD5(input=> UTL_RAW.CAST_TO_RAW(dose_detail))
FROM t1
MINUS
SELECT table_id,
DBMS_OBFUSCATION_TOOLKIT.MD5(input =>UTL_RAW.CAST_TO_RAW(dose_detail))
FROM t2;
这种方法需要更长的执行时间,例如1小时,但我想减少5-10分钟的执行时间。
DBMS_LOB.compare
不适合我的情况。
如果可能,请选择其他选项。
答案 0 :(得分:1)
您可以使用以下语句:
SELECT table_id, DBMS_OBFUSCATION_TOOLKIT.MD5(input=> UTL_RAW.CAST_TO_RAW(dose_detail)) FROM t1 WHERE table_id IN (
SELECT table_id FROM (
SELECT table_id, DBMS_CRYPTO.HASH(dose_detail,2)
FROM t1
MINUS
SELECT table_id, DBMS_CRYPTO.HASH(dose_detail,2)
FROM t2));
因为DBMS_CRYPTO支持CLOBS,而DBMS_OBFUSCATION_TOOLKIT不支持,但是这种改进取决于内部MINUS语句返回的数据量和其他因素。如果创建实例化视图,则以下语句会更好:
CREATE MATERIALIZED VIEW mv_t
BUILD IMMEDIATE
REFRESH FAST
ON COMMIT
AS
SELECT table_id FROM (
SELECT table_id, DBMS_CRYPTO.HASH(dose_detail,2)
FROM t1
MINUS
SELECT table_id, DBMS_CRYPTO.HASH(dose_detail,2)
FROM t2);
这样,您可以使用以下语句访问数据:
SELECT table_id,
DBMS_OBFUSCATION_TOOLKIT.MD5(input=> UTL_RAW.CAST_TO_RAW(dose_detail))
FROM t1
答案 1 :(得分:0)
您可以使用实例化视图来实例化CLOB哈希:
CREATE MATERIALIZED VIEW LOG ON t1;
CREATE MATERIALIZED VIEW mv_t1
BUILD IMMEDIATE
REFRESH FAST
ON COMMIT
AS
SELECT table_id,
DBMS_OBFUSCATION_TOOLKIT.MD5(input=> UTL_RAW.CAST_TO_RAW(dose_detail)) AS dd_hash
FROM t1;
与第二张表和最终查询相同:
SELECT table_id, dd_hash FROM mv_t1
MINUS
SELECT table_id, dd_hash FROM mv_t2;
第二种方法是使用INSERT / UPDATE触发器处理CLOB哈希。
ALTER TABLE t1 ADD dd_hash VARCHAR2(100);
create trigger t1_trg
before update or insert on t1
for each row
begin
:new.dd_hash := DBMS_OBFUSCATION_TOOLKIT.MD5(input=>
UTL_RAW.CAST_TO_RAW(:new.dose_detail));
end t1_trg;