2016-05-17 32 views
0

実行に時間がかかっているクエリがあり、実行されないこともあります。次のようにクエリは次のとおりです。クエリ実行に非常に長い時間がかかるクエリ

SELECT id , MULTILIST01 as str from PAGE_TWO where MULTILIST01 is not null 

SELECT id, trim(regexp_substr(str, '[^,]+', 1, LEVEL)) str 
FROM (SELECT id , MULTILIST01 as str from PAGE_TWO where MULTILIST01 is not null) 
WHERE trim(regexp_substr(str, '[^,]+', 1, LEVEL)) is not null 
CONNECT BY instr(str, ',', 1, LEVEL -1) > 0; 

結果セットは以下の通りである:私のようにすべてのコンマ区切り値を作成しようとしています外側のクエリで

ID  MULTILIST01 
295285 ,3434925,3434442,3436781, 
212117 ,3434925,3434442,3436781, 
212120 ,3434925,3434442,3436781, 
6031650 ,3436781, 
. 
. 
. 

ユニークな価値外部クエリを実行すると、実行に数時間かかります。私はそれを最適化しようとしましたが、それは役に立たなかったのです。

どうすれば最適化できますか。

Oracleのバージョン情報

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production 
PL/SQL Release 12.1.0.2.0 - Production 
CORE 12.1.0.2.0 Production 
TNS for 64-bit Windows: Version 12.1.0.2.0 - Production 
NLSRTL Version 12.1.0.2.0 - Production 

テーブル情報

Plan hash value: 4097679000 

------------------------------------------------------------------------------------------ 
| Id | Operation      | Name  | Rows | Bytes | Cost (%CPU)| Time  | 
------------------------------------------------------------------------------------------ 
| 0 | SELECT STATEMENT    |   | 1429 | 11432 | 840 (2)| 00:00:01 | 
|* 1 | FILTER      |   |  |  |   |   | 
|* 2 | CONNECT BY WITHOUT FILTERING|   |  |  |   |   | 
|* 3 | TABLE ACCESS FULL   | PAGE_TWO | 1429 | 11432 | 840 (2)| 00:00:01 | 
------------------------------------------------------------------------------------------ 

Query Block Name/Object Alias (identified by operation id): 
------------------------------------------------------------- 

    1 - SEL$F5BB74E1 
    3 - SEL$F5BB74E1/[email protected]$2 

Predicate Information (identified by operation id): 
--------------------------------------------------- 

    1 - filter(TRIM(REGEXP_SUBSTR ("MULTILIST01",'[^,]+',1,LEVEL)) IS NOT NULL) 
    2 - filter(INSTR("MULTILIST01",',',1,LEVEL-1)>0) 
    3 - filter("MULTILIST01" IS NOT NULL) 

Column Projection Information (identified by operation id): 
----------------------------------------------------------- 

    1 - "ID"[NUMBER,22], "MULTILIST01"[VARCHAR2,1020], LEVEL[4] 
    2 - "ID"[NUMBER,22], "MULTILIST01"[VARCHAR2,1020], LEVEL[4] 
    3 - "ID"[NUMBER,22], "MULTILIST01"[VARCHAR2,1020] 

表は、インデックスは、プライマリキー列(ID、CLASS)にある225個の列が含まれています説明。

この表はアジャイルPLMのものです。

+0

[こちら](http://stackoverflow.com/questions/34975406/how-to-describe-performance-issue-in-relational-database?answertab=active#tab-top)を確認してくださいあなたが提供する必要があります.... –

+0

私は質問を編集して、確認してください。 –

答えて

2

このアプローチは、1行のテーブルのみで動作します。二列のテーブルを皮切り

SELECT id, trim(regexp_substr(str, '[^,]+', 1, LEVEL)) str 
FROM (SELECT id , MULTILIST01 as str from PAGE_TWO where MULTILIST01 is not null and rownum <= 1) 
WHERE trim(regexp_substr(str, '[^,]+', 1, LEVEL)) is not null 
CONNECT BY instr(str, ',', 1, LEVEL -1) > 0 
order by 1,2; 

     ID STR      
---------- ------------------------- 
    295285 3434442     
    295285 3434925     
    295285 3436781 

あなたが得る期待(おそらく)より多くの結果:クエリのこの再製剤はあなたが(probalbly)欲しいものを得るでしょう

SELECT id, trim(regexp_substr(str, '[^,]+', 1, LEVEL)) str 
FROM (SELECT id , MULTILIST01 as str from PAGE_TWO where MULTILIST01 is not null and rownum <= 2) 
WHERE trim(regexp_substr(str, '[^,]+', 1, LEVEL)) is not null 
CONNECT BY instr(str, ',', 1, LEVEL -1) > 0 
order by 1,2; 

     ID STR      
---------- ------------------------- 
    212117 3434442     
    212117 3434442     
    212117 3434925     
    212117 3436781     
    212117 3436781     
    212117 3436781     
    212117 3436781     
    295285 3434442     
    295285 3434442     
    295285 3434925     
    295285 3436781     
    295285 3436781     
    295285 3436781     
    295285 3436781   
; 

。 部分文字列(1 .. N)のインデックスを配信するサブクエリを使用します。分割される部分文字列の最大数を定義する必要があります。あなたがSUBSTR/INSTR抽出して正規表現を置き換える場合 を効果的

with substr_idx as (
select rownum colnum from dual connect by level <= 3 /* max number of substrings */) 
SELECT id, trim(regexp_substr(str, '[^,]+', 1, colnum)) str 
FROM (SELECT id , MULTILIST01 as str from PAGE_TWO where MULTILIST01 is not null), substr_idx 
WHERE trim(regexp_substr(str, '[^,]+', 1, colnum)) is not null 
order by 1,2; 

     ID STR      
---------- ------------------------- 
    212117 3434442     
    212117 3434925     
    212117 3436781     
    212120 3434442     
    212120 3434925     
    212120 3436781     
    295285 3434442     
    295285 3434925     
    295285 3436781     
    6031650 3436781 

さらに(マイナー)のパフォーマンスの向上が期待されている行回数Nを掛けるために、あなたのテーブルで、このテーブルに参加します。例えば、この物語のhere

一つの教訓は、あなたが取得しない場合ビッグデータとの結果が小さなデータ(上記rownum <= 2制限を確認してください)にしてみてください、結果が予想されるかどうかを確認します。

関連する問題