CLOB列之间的减号运算

时间:2018-09-15 17:09:53

标签: sql oracle plsqldeveloper clob

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不适合我的情况。

如果可能,请选择其他选项。

2 个答案:

答案 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;