Минус Операция Между столбцом CLOB - PullRequest
0 голосов
/ 15 сентября 2018
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 содержит 14 миллионов данных, и мне нужно выполнить операцию 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 голосов
/ 15 сентября 2018

Вы можете использовать следующее утверждение:

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 голосов
/ 15 сентября 2018

Вы можете материализовать хеш 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;

Второй подход - обработка хэша CLOB с использованием INSERT./ ОБНОВЛЕНИЕ триггера.

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...