暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 在函数内部使用standard_hash

ASKTOM 2019-06-12
1276

问题描述

嗨,汤姆,

我们有一个包含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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论