產品表:優化存儲過程的循環來提高性能
PID START_DATE END_DATE PRODUCT_SET_ID CREATED_DATE UPDATED_DATE PRODUCT_NAME COMPANY_NM PRICE
1 04/01/11 06/30/11 12 09/06/16 09/06/16 Apple ABC 50
2 04/01/10 06/30/10 12 09/06/16 09/06/16 Toothpaste PQR 80
3 07/01/11 09/30/11 12 09/06/16 09/06/16 Soap DOVE 53
4 04/01/12 06/30/12 12 09/06/16 09/06/16 TV ONIDA 50000
Order表:
OID PID PRODUCT_ID SEQ_ID TYPE_ID CREATED_DATE UPDATED_DATE NUMBER_VALUE TEXT_VALUE
11 1 1 1 1 09/06/16 09/06/16 5
12 1 2 1 6 09/06/16 09/06/16 50
13 2 1 1 3 09/06/16 09/06/16 3
14 2 2 1 7 09/06/16 09/06/16 80
VA表:
Product_ID Product_Name
1 Apple
2 Orange
3 Toothpaste
4 Soap
5 TV
6 ABC
7 PQR
8 DOVE
9 ONIDA
VA_IN_TB
TB_NM COL_NM PRODUCT_ID SEQ_ID
Product_TB Apple 1 1
Product_TB Orange 2 1
Product_TB Toothpaste 3 1
Product_TB Soap 4 1
Product_TB TV 5 1
Product_TB ABC 6 1
Product_TB PQR 7 1
Product_TB DOVE 8 1
Product_TB ONIDA 9 1
我還添加索引產品表:
CREATE INDEX INDX_PID ON PRODUCT_TABLE(PID);
存儲過程來生成訂單表:
REC_COUNT:= SELECT COUNT(*) FROM PRODUCT_TABLE;
Loop_CT :=(REC_COUNT/2000000) +1;
SELECT MIN(PID) INTO LOWER_LIMIT FROM PRODUCT_TABLE;
UPPER_LIMIT := LOWER_LIMIT +2000000;
FOR i in 1..LOOP_COUNT LOOP
Create Table Temp_1 Nologging as
SELECT ORDER_SEQ.NEXTVAL OID,
A.PID,A.PRODUCT_ID,
A.SEQ_ID,
A.VALUE,
B.TYPE_ID
FROM
(
SELECT A.PID,
A.VA_ID,
A.SEQ_ID,
A.VALUE,
B.TYPE_NAME
FROM
(
select A.PID,
B.PRODUCT_ID,
B.SEQ_ID,
PRODUCT_NAME VALUE
from PRODUCT_TABLE A
JOIN VA_IN_TB B
ON REPLACE(A.PRODUCT_NAME,'''','')=REPLACE(B.COL_NM,'''','')
AND A.PID BETWEEN LOWER_LIMIT AND UPPER_LIMIT
union all
select A.PID,
B.PRODUCT_ID,
B.SEQ_ID,
PRICE VALUE
from PRODUCT_TABLE A
JOIN VA_IN_TB B
ON REPLACE(A.COMPANY_N,'''','')=REPLACE(B.COL_NM,'''','')
AND A.PID BETWEEN LOWER_LIMIT AND UPPER_LIMIT
) A
LEFT JOIN VA_TB B
ON A.PRODUCT_ID=B.PRODUCT_ID
) A
LEFT JOIN VA_TB B
ON A.TYPE_NAME=B.PRODUCT_NAME
Insert INTO ORDER_TB
SELECT * FROM TEMP_1;
Commit;
DROP TABLE TEMP_1;
LOWER_LIMIT := UPPER_LIMIT + 1;
UPPER_LIMIT := UPPER_LIMIT + 2000000;
End LOOP;
我們有20個萬條記錄,在產品表,我需要根據產品生成順序表表使用上述存儲過程。我儘可能地儘可能優化,但在Oracle Standard One上執行仍需要8個多小時。我如何優化這段代碼?
是實際工作的代碼??? – XING
@Raj_Te - 是的,它的工作原理。 – dang
解釋計劃說什麼?代碼中存在一些拼寫錯誤,這意味着它可能沒有達到您期望的效果,並且我很難看到您的循環添加的值。 –