CLOB列之间的减号操作

问题描述 投票:0回答:2
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不适合我的场景。

其他选择请尽可能。

sql oracle plsqldeveloper clob
2个回答
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

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;
© www.soinside.com 2019 - 2024. All rights reserved.