0

我有一个需要 20 分钟才能执行的查询...我记得在一个项目中我们使用了 /*+ PARALLEL(T,8) / 或者我们会使用 with 子句和 / + materialize */ 它会使查询响应时间真的很快,只有几秒钟。我该如何对此查询执行此操作?

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

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 优化为并行。当它不能优化子查询时,它通常能够优化连接。

于 2013-11-08T15:56:27.450 回答
0
SELECT /*+ PARALLEL */ ...

不想使用幻数,也不想列出任何对象。

8 的并行度在您的笔记本电脑上可能太高,但在您的生产服务器上却太低。如果查询仅指定PARALLEL,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';

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

于 2013-11-08T16:01:48.980 回答