Product table:
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 table:
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 table:
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
I also added an index to the product table:
CREATE INDEX INDX_PID ON PRODUCT_TABLE(PID);
Saved order table creation procedure:
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;
We have 20 million entries in the product table, and I need to create an order table based on the product table using the above stored procedure. I tried to optimize as much as I could, but Oracle Standard One still needs more than 8 hours. How can I optimize this code?