[SQL ] 如何對一個欄位建置 hash table

看板Database作者 (老子我最神)時間11年前 (2013/07/23 17:50), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
大家好,目前我有一個很大的 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)
文章代碼(AID): #1Hxb7uqO (Database)