SQL使用parallel或with子句缩短响应时间

时间:2013-11-08 15:33:48

标签: sql performance oracle

我有一个需要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;

Here is the explain plan

3 个答案:

答案 0 :(得分:1)

试试这个,可能会更快:

  select count(*) 
  from RPT_7330_HDR hdr  
  JOIN LS_DT_MODIFIED LS ON LS.NAME = 'RPT_7330_HDR' AND hdr.DT_MODIFIED = LS.DT_MODIFIED
  JOIN RPT_7330_DTL dtl on hdr.EID = dtl.EID
  JOIN CODE_LKUP2 lkup ON LKUP.CODE1 = hdr.ACCESS_IND AND LKUP.CATEGORY='ACCESS_MAPPING' 

如果您拥有正确的索引等,SQL引擎可以优化JOINS并行。当它无法优化子查询时,它通常能够优化连接。

答案 1 :(得分: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';

注意:提示在DTL表上使用,这为FTS带来了更多的成本。 4号表示并行查询8个CPU的查询。从查询计划中确定您的痛点,并确定您的并行或其他任何提示。您还可以在多个表/*+ PARALLEL(table1 4) PARALLEL(table2 4) PARALLEL(table3 4) PARALLEL(table4 4)*/上使用并行提示。此外,这仅适用于企业版,而不适用于标准版。

答案 2 :(得分:0)

SELECT /*+ PARALLEL */ ...

想要使用幻数而你想要列出任何对象。

笔记本电脑的并行度可能过高,但生产服务器上的平行度太低。如果查询只是指定PARALLEL,则Oracle会自动确定DOP是否配置为自动并行。或者它将默认为CPU数*每个CPU的*线程数*实例数。从所有手册,功能和白皮书来看,Oracle已经对并行度进行了大量思考。如果您不打算对其进行基准测试,则应该信任默认值。

在11gR2中,当您没有列出任何对象时,您使用语句级并行而不是对象级并行。没有必要尝试确切地确定 哪些对象和访问路径需要并行化。如果您稍后更改查询或别名,则提示无法正常工作。

这是一个quick introduction to the parallel hint。还有 VLDB和分区指南的Using Parallel Execution章。