我有个查询要花20分钟才能执行.我记得在一个项目中,我们使用了/*+并行(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;
发布于 2013-11-08 16:01:48
如果你想要数据
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-08 15:56:27
试试这个,可能会更快:
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引擎可以将联接优化为并行。当无法优化子查询时,它通常能够优化联接。
发布于 2013-11-09 06:53:49
SELECT /*+ PARALLEL */ ...
您不想使用魔术数字,也不想列出任何对象。
在您的膝上型计算机上,8的并行性可能太高,而在生产服务器上的并行度可能太低。如果查询只是指定PARALLEL
,那么Oracle将自动确定DOP是否配置为自动并行。或者默认为每个CPU的CPU*线程数*实例数。从所有的手册、特性和白皮书来看,Oracle已经对并行性的程度进行了大量的思考。如果您不打算对其进行基准测试,则应该信任缺省值。
在11gR 2中,当不列出任何对象时,使用语句级并行而不是对象级并行。不需要尝试准确地确定哪些对象和访问路径需要并行化。如果稍后更改查询或别名,则提示不起作用的可能性不大。
这是一个快速介绍并行提示。还有VLDB和分区指南的使用并行执行章节。
https://stackoverflow.com/questions/19862777
复制相似问题