问题描述
嗨,汤姆,
我们有一个包含1000多个表的数据仓库,通过比较先前快照数据的哈希键和新快照的哈希键,将增量数据加载到每个表中。我们正在使用DBMS_CRYPTO.HASH方法来计算哈希键。将哈希键作为生成的列添加到表中,并将DBMS_CRYPTO.HASH放置在函数内部,如下所示。
使用Oracle 12c,我观察到standard_hash函数计算哈希的速度比DBMS_CRYPTO.HASH快得多。但是,当给出如下条件时,standard_hash似乎无法使用简单的return语句在函数内部工作
它的工作原理如下。
然而,这减慢了我的功能的性能。无论如何,我可以在函数内部使用standard_hash而不会影响性能吗?
我们有一个包含1000多个表的数据仓库,通过比较先前快照数据的哈希键和新快照的哈希键,将增量数据加载到每个表中。我们正在使用DBMS_CRYPTO.HASH方法来计算哈希键。将哈希键作为生成的列添加到表中,并将DBMS_CRYPTO.HASH放置在函数内部,如下所示。
CREATE TABLE FOO ( col1 .., col2 .., ... HASH_KEY VARCHAR2(4000) GENERATED ALWAYS AS COMPUTE_HASH_UDF(TO_CHAR(COL1)||TO_CHAR(COL2)..) )
CREATE OR REPLACE FUNCTION COMPUTE_HASH_UDF(IN_REC IN VARCHAR2) RETURN VARCHAR2 DETERMINISTIC PARALLEL IS BEGIN RETURN TO_CHAR(DBMS_CYPTO.HASH(...)) END COMPUTE_HASH_UDF
使用Oracle 12c,我观察到standard_hash函数计算哈希的速度比DBMS_CRYPTO.HASH快得多。但是,当给出如下条件时,standard_hash似乎无法使用简单的return语句在函数内部工作
return RAWTOHEX(STANDARD_HASH(....))
它的工作原理如下。
SELECT RAWTOHEX(STANDARD_HASH(....)) INTO X; RETURN X;
然而,这减慢了我的功能的性能。无论如何,我可以在函数内部使用standard_hash而不会影响性能吗?
专家解答
只需绕过PLSQL函数,直接放入定义
-- -- old -- SQL> create or replace 2 function COMPUTE_HASH_UDF(i varchar2) return varchar2 deterministic is 3 begin 4 return 'x'; -- just so we have a function 5 end; 6 / Function created. SQL> SQL> CREATE TABLE t 2 ( 3 col1 int, 4 col2 int, 5 HASH_KEY VARCHAR2(4000) GENERATED ALWAYS AS ( COMPUTE_HASH_UDF(TO_CHAR(COL1)||TO_CHAR(COL2)) ) 6 ); Table created. -- -- new -- SQL> CREATE TABLE t1 2 ( 3 col1 int, 4 col2 int, 5 HASH_KEY VARCHAR2(4000) GENERATED ALWAYS AS ( standard_hash(TO_CHAR(COL1)||TO_CHAR(COL2)) ) 6 ); Table created.
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




