我有一个巨大的Oracle Trace文件。该应用程序生成此文件,运行时间为1小时15分钟。 在这个Tracefile中,我发现了4个选择,一小时运行一小时。 问题是优化程序对这些选择进行了采样。
SELECT /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHERE_CLAUSE
NO_PARALLEL(SAMPLESUB) opt_param('parallel_execution_enabled', 'false')
NO_PARALLEL_INDEX(SAMPLESUB) NO_SQL_TUNE */ NVL(SUM(C1),:"SYS_B_00"),
NVL(SUM(C2),:"SYS_B_01")
FROM
(SELECT /*+ IGNORE_WHERE_CLAUSE NO_PARALLEL("LST_G") FULL("LST_G")
NO_PARALLEL_INDEX("LST_G") */ :"SYS_B_02" AS C1, CASE WHEN
"LST_G"."SENDUNG_TIX"=:"SYS_B_03" AND "LST_G"."LST_K"=:"SYS_B_04" AND
"LST_G"."LST_ART"=:"SYS_B_05" AND "LST_G"."FAK_TIX"=(-:"SYS_B_06") THEN
:"SYS_B_07" ELSE :"SYS_B_08" END AS C2 FROM "TMS1033"."LST_G" SAMPLE BLOCK
(:"SYS_B_09" , :"SYS_B_10") SEED (:"SYS_B_11") "LST_G") SAMPLESUB
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 56076 3.93 4.21 0 0 0 0
Execute 56076 1.98 1.80 0 0 0 0
Fetch 56076 1127.54 1122.77 222 46487004 0 56076
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 168228 1133.45 1128.79 222 46487004 0 56076
这是四个中的一个,它们看起来几乎相同。我想我找到了原始陈述,这些是从Uniface-Service执行的。我不知道Uniface是如何工作的,我只是数据库的人。
问题是我不知道优化器为什么要重建这个语句。原始的不使用dynamic_sample
提示。此外,我在跟踪文件中另外发现了这些,我认为是原始状态。
select count(*)
from
lst_g where sendung_tix = 10330805990396 and lst_k = 'E' and lst_art = 'G'
and fak_tix = -4
这就是为什么我不确定这些抽样陈述是什么。有什么想法吗?
非常感谢。
答案 0 :(得分:1)
为该查询启用动态采样。任
/*+ DYNAMIC_SAMPLING */
提示alter session set optimizer_dynamic_sampling=
命令例如
alter session set OPTIMIZER_DYNAMIC_SAMPLING = 2;
然后针对具有非常有选择性(但不完全)的条件的大表发出查询,该条件可以使用索引。
select * from mtl_system_items /* biiig table */
where organization_id = 92
and segment1 LIKE 'DY_' /* very selective condition with index */
运行它,您可以快速恢复数据。但是,
alter session set OPTIMIZER_DYNAMIC_SAMPLING = 10;
并重新运行相同的SELECT
,然后出去吃午饭,对表格中的每个区块进行抽样。
答案 1 :(得分:-1)
我认为这些是Statistics Gathering jobs用于更新数据库对象统计信息的查询。请检查生成跟踪文件时是否正在运行任何统计信息收集/更新作业。
在您的情况下,从发布的SQL中,似乎正在收集统计数据" TMS1033"。" LST_G"。您发现的其他3个SQL也是如此。
希望这有帮助。