2017-11-06 21 views
0

列内に含まれる一連の '動的' SQL問合せ(DYNAMIC_SQL)がありますが、 '動的'問合せ自体はかなり基本的です。Oracle - 動的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

ありがとうございます。私は実装と検証を行います(純粋なSQL以外のものは全く新しくないので、私がテストしている間、私にご負担ください:D)。再度ありがとう - 非常に感謝します。 – MAndrews

関連する問題