0

実行に 20 分かかるクエリがあります... あるプロジェクトで /*+ PARALLEL(T,8) / または with 句を使用して / + マテリアライズ */を使用したことを覚えています。秒単位で非常に速い時間。このクエリに対してこれを行うにはどうすればよいですか?

select count(*) from (                          
       select hdr.ACCESS_IND,        
            hdr.SID,    
             hdr.CLLI,    
             hdr.DA,    
             hdr.TAPER_CODE,    
             hdr.CFG_TYPE  as CFG_TYPE,    
             hdr.IP_ADDR,    
             hdr.IOS_VERSION,    
             hdr.ADMIN_STATE,    
             hdr.WIRE_CENTER,    
             substr(hdr.SID_IO_PRI, 1, 8)    PRI_IO_CLLI,    
             substr(hdr.SID_IO_SEC, 1, 8)    SEC_IO_CLLI,    
             hdr.VHO_CLLI ,   
             hdr.CFG_TYPE ,
          --   dtl.MULTIPURPOSE_IND,
             lkup.code3 as shelf_type
     from      RPT_7330_HDR    hdr  
     INNER JOIN   RPT_7330_DTL dtl on hdr.EID = dtl.EID
     INNER JOIN CODE_LKUP2 lkup ON LKUP.CODE1 = hdr.ACCESS_IND
     where    LKUP.CATEGORY='ACCESS_MAPPING' and  hdr.DT_MODIFIED = (select DT_MODIFIED    
                                from     LS_DT_MODIFIED    
                                where NAME = 'RPT_7330_HDR')) n;

説明プランはこちら

4

3 に答える 3

0
SELECT /*+ PARALLEL */ ...

マジック ナンバーを使用したくない、オブジェクトを一覧表示したく ない場合。

並列度 8 はラップトップではおそらく高すぎますが、運用サーバーでは低すぎます。クエリで を指定するだけの場合PARALLEL、DOP が自動並列処理用に構成されている場合、Oracle は DOP を自動的に決定します。または、デフォルトで CPU 数 * CPU あたりのスレッド数 * インスタンス数になります。すべてのマニュアル、機能、およびホワイトペーパーから判断すると、Oracle は並列処理の程度について多くのことを考えてきました。ベンチマークしない場合は、デフォルトを信頼する必要があります。

11gR2 では、オブジェクトをリストしない場合、オブジェクト レベルの並列処理ではなくステートメント レベルの並列処理を使用します。どのオブジェクトとアクセス パスを並列化する必要があるかを正確に判断しようとする必要はありません。後でクエリまたはエイリアス名を変更しても、ヒントが機能しない可能性はありません。

ここでは、並列ヒントについて簡単に紹介します。VLDB and Partitioning Guide のUsing Parallel Executionの章もあります。

于 2013-11-09T06:53:49.597 に答える
0

データが欲しいなら

SELECT /*+ PARALLEL(DTL,4) */
            HDR.ACCESS_IND,
            HDR.SID,
            HDR.CLLI,
            HDR.DA,
            HDR.TAPER_CODE,
            HDR.CFG_TYPE AS CFG_TYPE,
            HDR.IP_ADDR,
            HDR.IOS_VERSION,
            HDR.ADMIN_STATE,
            HDR.WIRE_CENTER,
            SUBSTR ( HDR.SID_IO_PRI, 1, 8 ) PRI_IO_CLLI,
            SUBSTR ( HDR.SID_IO_SEC, 1, 8 ) SEC_IO_CLLI,
            HDR.VHO_CLLI,
            HDR.CFG_TYPE,
            LKUP.CODE3 AS SHELF_TYPE
       FROM
            RPT_7330_HDR HDR INNER JOIN RPT_7330_DTL DTL ON HDR.EID = DTL.EID
            INNER JOIN CODE_LKUP2 LKUP ON LKUP.CODE1 = HDR.ACCESS_IND
            INNER JOIN LS_DT_MODIFIED ON HDR.DT_MODIFIED = DT_MODIFIED
       WHERE
                LKUP.CATEGORY = 'ACCESS_MAPPING'
            AND NAME = 'RPT_7330_HDR';

カウントしたい場合は

SELECT /*+ PARALLEL(DTL,4) */
            COUNT (*)
       FROM
            RPT_7330_HDR HDR INNER JOIN RPT_7330_DTL DTL ON HDR.EID = DTL.EID
            INNER JOIN CODE_LKUP2 LKUP ON LKUP.CODE1 = HDR.ACCESS_IND
            INNER JOIN LS_DT_MODIFIED ON HDR.DT_MODIFIED = DT_MODIFIED
       WHERE
                LKUP.CATEGORY = 'ACCESS_MAPPING'
            AND NAME = 'RPT_7330_HDR';

注: FTS により多くのコストがかかっている DTL テーブルで使用されるヒント。番号 4 は、8 つの CPU で並列に実行されたクエリを意味します。クエリ プランから問題点を特定し、並列またはその他のヒントを決定します。複数のテーブルで並列ヒントを使用することもできます/*+ PARALLEL(table1 4) PARALLEL(table2 4) PARALLEL(table3 4) PARALLEL(table4 4)*/。また、これは Enterprise エディションでのみ機能し、Standard エディションでは機能しません。

于 2013-11-08T16:01:48.980 に答える