我有一个需要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;
答案 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章。