首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL使用并行或with子句缩短响应时间。

SQL使用并行或with子句缩短响应时间。
EN

Stack Overflow用户
提问于 2013-11-08 15:33:48
回答 3查看 906关注 0票数 0

我有个查询要花20分钟才能执行.我记得在一个项目中,我们使用了/*+并行(T,8)/或者我们使用with子句和/+物化*/,这会使查询响应的时间非常快。如何对此查询执行此操作?

代码语言:javascript
运行
复制
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;

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-08 16:01:48

如果你想要数据

代码语言:javascript
运行
复制
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';

如果你想数的话

代码语言:javascript
运行
复制
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)*/ )上使用并行提示。而且,这只适用于企业版,而不适用于标准版本。

票数 0
EN

Stack Overflow用户

发布于 2013-11-08 15:56:27

试试这个,可能会更快:

代码语言:javascript
运行
复制
  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引擎可以将联接优化为并行。当无法优化子查询时,它通常能够优化联接。

票数 1
EN

Stack Overflow用户

发布于 2013-11-09 06:53:49

代码语言:javascript
运行
复制
SELECT /*+ PARALLEL */ ...

您不想使用魔术数字,也不想列出任何对象。

在您的膝上型计算机上,8的并行性可能太高,而在生产服务器上的并行度可能太低。如果查询只是指定PARALLEL,那么Oracle将自动确定DOP是否配置为自动并行。或者默认为每个CPU的CPU*线程数*实例数。从所有的手册、特性和白皮书来看,Oracle已经对并行性的程度进行了大量的思考。如果您不打算对其进行基准测试,则应该信任缺省值。

在11gR 2中,当不列出任何对象时,使用语句级并行而不是对象级并行。不需要尝试准确地确定哪些对象和访问路径需要并行化。如果稍后更改查询或别名,则提示不起作用的可能性不大。

这是一个快速介绍并行提示。还有VLDB和分区指南的使用并行执行章节。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19862777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档