[SQL ] 如何對一個欄位建置 hash table
大家好,目前我有一個很大的 table 要做批次處理
是用 ORACLE 資料庫
因為牽扯到 DB_LINK,所以無法用 NEST LOOP,時間會爆掉
所以是使用 HASH JOIN ... 但是表格太大了... 連 SWAP + PGA 都不夠用
目前想到的是對表格用雜湊做 partition,這樣 PGA 才夠用
預想是把 PKEY 做一個雜湊表,並且寫一個 function 來雜湊
例如可以這樣用 (雜湊0~6,取0的雜湊值)
SELECT * FROM (SELECT * FROM TABLE1 WHERE HASH(FKEY,7) = 0) t1
INNER JOIN (SELECT * FROM TABLE2 WHERE HASH(PKEY,7) = 0) t2
ON t1.FKEY = t2.PKEY
PKEY 可能又英文可能有數字,所以我想寫一個 CUSTOM 的 HASH 來達成,我使用方
法如下
FUNCTION HASH_CUSTOM(VAL IN VARCHAR2,HASH_NUM IN NUMBER) RETURN VARCHAR2 IS
TEMP VARCHAR2(30) DEFAULT '0';
TEMP_N NUMBER;
RETURN_VAL VARCHAR2(30) DEFAULT '0';
BEGIN
IF TRIM(VAL) IS NULL THEN
RETURN NULL;
END IF;
FOR i in 1..LENGTH(VAL) LOOP
CASE SUBSTR(VAL,i,1)
WHEN '0' THEN TEMP := TEMP || '0';
WHEN '1' THEN TEMP := TEMP || '1';
WHEN '2' THEN TEMP := TEMP || '2';
WHEN '3' THEN TEMP := TEMP || '3';
WHEN '4' THEN TEMP := TEMP || '4';
WHEN '5' THEN TEMP := TEMP || '5';
WHEN '6' THEN TEMP := TEMP || '6';
WHEN '7' THEN TEMP := TEMP || '7';
WHEN '8' THEN TEMP := TEMP || '8';
WHEN '9' THEN TEMP := TEMP || '9';
ELSE
NULL;
END CASE;
END LOOP;
TEMP_N := TO_NUMBER(TEMP);
RETURN_VAL := TO_CHAR(MOD(TEMP_N,HASH_NUM));
RETURN RETURN_VAL;
END;
但是這樣做實際跑之後,CPU炸了... 因為每一個值都要用 loop 去做 hash ...
而且要使用除法...
也找不到內建好用的方法...
有人有想法嗎?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.218.64.133
※ 編輯: cyclone350 來自: 61.218.64.133 (07/23 17:52)