首页 > 解决方案 > 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不适合我的场景。

如果可能,请提供其他选项。

标签: sqloracleplsqldeveloperclob

解决方案


您可以使用以下语句:

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

推荐阅读