2017-11-06 5 views
0

열 (DYNAMIC_SQL)에 포함 된 일련의 '동적'SQL 쿼리가 있는데 '동적'쿼리 자체는 매우 기본입니다.오라클 - 동적 SQL/XMLTable 성능 저하

SELECT ROWID AS RECORD_ID, COLUMN_1 AS STR_VALUE, '-Undefined-' AS STR_IDENTIFIER_VALUE, 'DS_1319' AS DS_TABLE_NAME FROM DS_1319

그러면 XMLTABLEGETXML의 조합을 사용하여 결과를 추출하고 표시합니다.

그러나 쿼리가 실행되고 의도 한대로 작동하더라도 성능이 매우 좋지 않음을 알았습니다 (NB : DS_1319의 행 개수는 13,939입니다).

다음과 같이 내가 사용 쿼리는 다음과 같습니다

SELECT 
    T1.*, 
    T2.RECORD_ID, 
    T2.STR_VALUE, 
    T2.STR_IDENTIFIER_VALUE 
FROM 
    CP_RDN_IN_DYNAMIC_SQL_TMP T1, 
    XMLTABLE('/ROWSET /ROW' 
      PASSING XMLTYPE(DBMS_XMLGEN.GETXML(T1.DYNAMIC_SQL)) 
      COLUMNS RECORD_ID VARCHAR2(255) PATH 'RECORD_ID', 
        STR_VALUE VARCHAR2(255) PATH 'STR_VALUE', 
        STR_IDENTIFIER_VALUE VARCHAR2(255) PATH 'STR_IDENTIFIER_VALUE', 
        DS_TABLE_NAME VARCHAR2(255) PATH 'DS_TABLE_NAME') T2 
WHERE 
    T1.DS_TABLE_NAME = T2.DS_TABLE_NAME 

NB : DYNAMIC_SQL 다음과 같이 정의 된 열을;

'SELECT ROWID AS RECORD_ID, '|| 
     T1.FIELD_NAME||' AS STR_VALUE, '|| 
     T1.IDENTIFIER_FIELD_NAME||' AS STR_IDENTIFIER_VALUE, '''|| 
     T1.DS_TABLE_NAME||''' AS DS_TABLE_NAME 
FROM'||T1.DS_TABLE_NAME AS DYNAMIC_SQL 

다음은 데이터의 작은 추출물입니다.

<?xml version="1.0"?> 
<ROWSET> 
<ROW> 
    <RECORD_ID>AAAGU2AABAAAShJAAA</RECORD_ID> 
    <STR_VALUE>ORACLE</STR_VALUE> 
    <STR_IDENTIFIER_VALUE>-Undefined-</STR_IDENTIFIER_VALUE> 
    <DS_TABLE_NAME>DS_1319</DS_TABLE_NAME> 
</ROW> 
<ROW> 
    <RECORD_ID>AAAGU2AABAAAShJAAB</RECORD_ID> 
    <STR_VALUE>Oracle</STR_VALUE> 
    <STR_IDENTIFIER_VALUE>-Undefined-</STR_IDENTIFIER_VALUE> 
    <DS_TABLE_NAME>DS_1319</DS_TABLE_NAME> 
</ROW> 
<ROW> 
    <RECORD_ID>AAAGU2AABAAAShJAAC</RECORD_ID> 
    <STR_VALUE>Oracle 9i</STR_VALUE> 
    <STR_IDENTIFIER_VALUE>-Undefined-</STR_IDENTIFIER_VALUE> 
    <DS_TABLE_NAME>DS_1319</DS_TABLE_NAME> 
</ROW> 
<ROW> 
    <RECORD_ID>AAAGU2AABAAAShJAAD</RECORD_ID> 
    <STR_VALUE>Oracle 11g</STR_VALUE> 
    <STR_IDENTIFIER_VALUE>-Undefined-</STR_IDENTIFIER_VALUE> 
    <DS_TABLE_NAME>DS_1319</DS_TABLE_NAME> 
</ROW> 
<ROW> 
    <RECORD_ID>AAAGU2AABAAAShJAAE</RECORD_ID> 
    <STR_VALUE>Oracle CRM</STR_VALUE> 
    <STR_IDENTIFIER_VALUE>-Undefined-</STR_IDENTIFIER_VALUE> 
    <DS_TABLE_NAME>DS_1319</DS_TABLE_NAME> 
</ROW> 
<ROW> 
    <RECORD_ID>AAAGU2AABAAAShJAAF</RECORD_ID> 
    <STR_VALUE>oracle 10g</STR_VALUE> 
    <STR_IDENTIFIER_VALUE>-Undefined-</STR_IDENTIFIER_VALUE> 
    <DS_TABLE_NAME>DS_1319</DS_TABLE_NAME> 
</ROW> 
<ROW> 
    <RECORD_ID>AAAGU2AABAAAShJAAG</RECORD_ID> 
    <STR_VALUE>ORACLE, XE</STR_VALUE> 
    <STR_IDENTIFIER_VALUE>-Undefined-</STR_IDENTIFIER_VALUE> 
    <DS_TABLE_NAME>DS_1319</DS_TABLE_NAME> 
</ROW> 
<ROW> 
    <RECORD_ID>AAAGU2AABAAAShJAAH</RECORD_ID> 
    <STR_VALUE>XE</STR_VALUE> 
    <STR_IDENTIFIER_VALUE>-Undefined-</STR_IDENTIFIER_VALUE> 
    <DS_TABLE_NAME>DS_1319</DS_TABLE_NAME> 
</ROW> 
<ROW> 
    <RECORD_ID>AAAGU2AABAAAShJAAI</RECORD_ID> 
    <STR_VALUE>MS Windows</STR_VALUE> 
    <STR_IDENTIFIER_VALUE>-Undefined-</STR_IDENTIFIER_VALUE> 
    <DS_TABLE_NAME>DS_1319</DS_TABLE_NAME> 
</ROW> 
<ROW> 
    <RECORD_ID>AAAGU2AABAAAShJAAJ</RECORD_ID> 
    <STR_VALUE>Microsoft Windows Vista</STR_VALUE> 
    <STR_IDENTIFIER_VALUE>-Undefined-</STR_IDENTIFIER_VALUE> 
    <DS_TABLE_NAME>DS_1319</DS_TABLE_NAME> 
</ROW> 
<ROW> 
    <RECORD_ID>AAAGU2AABAAAShJAAK</RECORD_ID> 
    <STR_VALUE>Vista</STR_VALUE> 
    <STR_IDENTIFIER_VALUE>-Undefined-</STR_IDENTIFIER_VALUE> 
    <DS_TABLE_NAME>DS_1319</DS_TABLE_NAME> 
</ROW> 
<ROW> 
    <RECORD_ID>AAAGU2AABAAAShJAAL</RECORD_ID> 
    <STR_VALUE>MSOFT Win Vista</STR_VALUE> 
    <STR_IDENTIFIER_VALUE>-Undefined-</STR_IDENTIFIER_VALUE> 
    <DS_TABLE_NAME>DS_1319</DS_TABLE_NAME> 
</ROW> 
<ROW> 
    <RECORD_ID>AAAGU2AABAAAShJAAM</RECORD_ID> 
    <STR_VALUE>Microsoft Office</STR_VALUE> 
    <STR_IDENTIFIER_VALUE>-Undefined-</STR_IDENTIFIER_VALUE> 
    <DS_TABLE_NAME>DS_1319</DS_TABLE_NAME> 
</ROW> 
<ROW> 
    <RECORD_ID>AAAGU2AABAAAShJAAN</RECORD_ID> 
    <STR_VALUE>MS SQL Server</STR_VALUE> 
    <STR_IDENTIFIER_VALUE>-Undefined-</STR_IDENTIFIER_VALUE> 
    <DS_TABLE_NAME>DS_1319</DS_TABLE_NAME> 
</ROW> 
<ROW> 
    <RECORD_ID>AAAGU2AABAAAShJAAO</RECORD_ID> 
    <STR_VALUE>VISTA MS WINDOWS</STR_VALUE> 
    <STR_IDENTIFIER_VALUE>-Undefined-</STR_IDENTIFIER_VALUE> 
    <DS_TABLE_NAME>DS_1319</DS_TABLE_NAME> 
</ROW> 
<ROW> 
    <RECORD_ID>AAAGU2AABAAAShJAAP</RECORD_ID> 
    <STR_VALUE>Windows vista</STR_VALUE> 
    <STR_IDENTIFIER_VALUE>-Undefined-</STR_IDENTIFIER_VALUE> 
    <DS_TABLE_NAME>DS_1319</DS_TABLE_NAME> 
</ROW> 
<ROW> 
    <RECORD_ID>AAAGU2AABAAAShJAAQ</RECORD_ID> 
    <STR_VALUE>Microsoft Windows 2000</STR_VALUE> 
    <STR_IDENTIFIER_VALUE>-Undefined-</STR_IDENTIFIER_VALUE> 
    <DS_TABLE_NAME>DS_1319</DS_TABLE_NAME> 
</ROW> 
<ROW> 
    <RECORD_ID>AAAGU2AABAAAShJAAR</RECORD_ID> 
    <STR_VALUE>Macromedia</STR_VALUE> 
    <STR_IDENTIFIER_VALUE>-Undefined-</STR_IDENTIFIER_VALUE> 
    <DS_TABLE_NAME>DS_1319</DS_TABLE_NAME> 
</ROW> 
</ROWSET> 

내가 원하는 결과를 달성하기 위해보다 효율적인 접근 방식이 상당히 확실 해요, 그래서 몇 가지 조언/제안 거기에 어떤 큰 두뇌가있는 경우, 그것은 아주 많이 나는 열려있어 (주시면 감사하겠습니다 Pure SQL, PL/SQL 등)에 접근 할 수 있습니다.

미리 감사드립니다.

답변

1

결과를 XML로 변환하는 이유는 알지 못합니다. 동적 SELECT를 직접 작성하십시오.

cur SYS_REFCURSOR; 
BEGIN 
DYNAMIC_SQL := 'SELECT ROWID AS RECORD_ID, '|| 
     T1.FIELD_NAME||' AS STR_VALUE, '|| 
     T1.IDENTIFIER_FIELD_NAME||' AS STR_IDENTIFIER_VALUE, '''|| 
     T1.DS_TABLE_NAME||''' AS DS_TABLE_NAME 
FROM'||T1.DS_TABLE_NAME; 

OPEN CURSOR cur FOR DYNAMIC_SQL; 
FETCH ... 
+0

감사합니다; 구현하고 검증 할 것입니다 (Pure SQL 이외의 다른 것은 나에게 매우 새롭기 때문에 테스트하는 동안 나와 함께하시기 바랍니다 : D). 다시 한 번 감사드립니다 - 많이 감사드립니다. – MAndrews