I want to split row each column data based on delimiter and show in multiple rows. I need fastest way to achieve this. My schema and current query to split records as below:
CREATE TABLE APP_SPECS
(
SPEC_ID NUMBER PRIMARY KEY,
SPEC_NAME VARCHAR2(4000),
SPEC_DESCRIPTION VARCHAR2(4000),
SPEC_TYPE VARCHAR2(4000)
);
/
INSERT INTO APP_SPECS VALUES (1, 'SPEC 1' || CHR(10) || 'SPEC 2', 'SPEC DESC' || CHR(10) || 'SPEC DESC', 'TYPE 1' || CHR(10) || 'TYPE 2');
/
INSERT INTO APP_SPECS VALUES (2, 'SPEC 3' || CHR(10) || 'SPEC 4', 'SPEC DESC 3' || CHR(10) || 'SPEC DESC 4', 'TYPE 3' || CHR(10) || 'TYPE 4');
/
INSERT INTO APP_SPECS VALUES (3, 'SPEC 5' || CHR(10) || 'SPEC 6', CHR(10) || 'SPEC DESC 6', 'TYPE 5' || CHR(10) || 'TYPE 6');
/
INSERT INTO APP_SPECS VALUES (4, 'SPEC 7' || CHR(10) || 'SPEC 8' || CHR(10) || 'SPEC 9', 'SPEC DESC 7', 'TYPE 7' || CHR(10) || 'TYPE 8');
/
COMMIT;
/
Query to split using table:
WITH APP_SPECS_CTE AS
(SELECT REGEXP_SUBSTR(REPLACE(SPEC.SPEC_NAME,CHR(10),','), '[^,]+', 1, LEVEL) SPEC_NAME ,
REGEXP_SUBSTR(REPLACE(SPEC.SPEC_DESCRIPTION,CHR(10),','), '[^,]+', 1, LEVEL) SPEC_DESCRIPTION ,
REGEXP_SUBSTR(REPLACE(SPEC.SPEC_TYPE,CHR(10),','), '[^,]+', 1, LEVEL) SPEC_TYPE,
SPEC_ID
FROM APP_SPECS SPEC
CONNECT BY LEVEL <= LENGTH(REPLACE(SPEC.SPEC_NAME,CHR(10),',')) - LENGTH(REPLACE(REPLACE(SPEC.SPEC_NAME,CHR(10),','), ',')) + 1
AND PRIOR SPEC_ID = SPEC_ID
AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL
)
SELECT SPEC_ID, SPEC_NAME, SPEC_DESCRIPTION, SPEC_TYPE FROM APP_SPECS_CTE;
using above query we will get below output.
| SPEC_ID | SPEC_NAME | SPEC_DESCRIPTION | SPEC_TYPE |
|---------|-----------|------------------|-----------|
| 1 | SPEC 1 | SPEC DESC | TYPE 1 |
| 1 | SPEC 2 | SPEC DESC | TYPE 2 |
| 2 | SPEC 3 | SPEC DESC 3 | TYPE 3 |
| 2 | SPEC 4 | SPEC DESC 4 | TYPE 4 |
| 3 | SPEC 5 | SPEC DESC 6 | TYPE 5 |
| 3 | SPEC 6 | null | TYPE 6 |
| 4 | SPEC 7 | SPEC DESC 7 | TYPE 7 |
| 4 | SPEC 8 | null | TYPE 8 |
| 4 | SPEC 9 | null | null |
I have 3 Million records in my APP_SPEC table. when i execute it's taking 5+ mins. Can any one check my query and correct me if any thing wrong.
Oracle Instance Details: Octa core processor, 64 GB RAM.