2014-09-25 53 views
1

我有一个oracle sql查询,它有访问计划附加到它。如何在不更改sql查询的情况下更改访问计划。我认为甲骨文有数据库表存储SQL ID和计划ID,更新计划ID到新计划ID将强制SQL查询使用不同的解释计划。如何更改oracle解释计划为sql查询手动

我使用Oracle 10,在这种情况下,我不想触摸现有的查询。我将用提示编写另一个查询并获得所需的解释计划。现在我将使用解释计划的新标记并将其附加到原始的sql id。这是如何做到这一点的逻辑,但我不知道所有表需要更新来实现这一点。第一步:SQLI_D1 - > PLAN_ID1;第二步:SQL_ID2 - > PLAN_ID2; STep3:SQL_ID1 - > PLAN_ID2

+0

为什么你想这样做 - 因为你认为Oracle选择了一个次优计划? Oracle是否拥有制定合理计划所需的所有信息 - 特别是统计信息是否最新?或者,如果你使用10g,你是否可能受到绑定变量窥视的困扰? (这对11g来说不是问题)。您可以向优化器提供提示,但这会改变语句,并且通常会隐藏一个潜在问题。 – 2014-09-25 10:19:42

回答

0

答案太多,因为你的问题太广泛了。而你甚至没有提到数据库版本。

你说:

更新计划ID,以新的计划ID将强制SQL查询使用 不同的解释计划。

编号PLAN_HASH_VALUE由Oracle分配。这是将EXECUTION PLAN与各自的SQL_ID关联的标记。如果您想强制OPTIMIZER采取您选择的不同执行计划,则可以在查询中使用HINTS

如果你有固定或保藏的使用stored outlines等为SQL执行计划,也被称为PLAN STABILITY,那么你需要在它的旁边,将其删除,因此,甲骨文将能够找到一个妥善的执行计划执行。然后,如果需要,您可以按照您的想法稳定更好的计划。

+0

我正在使用Oracle 10,在这种情况下,我不想触摸现有查询。我将用提示编写另一个查询并获得所需的解释计划。现在我将使用解释计划的新标记并将其附加到原始的sql id。这是如何做到这一点的逻辑,但我不知道所有表需要更新来实现这一点。第一步:SQLI_D1 - > PLAN_ID1;第二步:SQL_ID2 - > PLAN_ID2; STep3:SQL_ID1 - > PLAN_ID2 – sorab 2014-09-25 12:19:20

0

解释计划取决于其查询和统计数据。例如,如果表中只有一条记录,oracle将不会使用索引,但如果表中有很多记录,并且只提取其中的几条,它将使用索引。所以你需要尽可能地收集统计数据。

但我不明白你打算强制oracle重新计算解释计划,Oracle知道如何根据你提供的统计信息访问你的表。不要使用像INDEX和其他告诉oracle如何访问表的提示。你可以给甲骨文一个提示,告诉甲骨文你只需要5行,而甲骨文会尽快将它们还给你。

+0

>如果表中只有一条记录,oracle将不会使用索引.... ***你确定吗?***我可以告诉你,Oracle将使用索引在表中只有一行。 – 2014-09-25 10:36:15

+1

[Tottaly](http:// pastebin。com/2ZM0Srxx) – zaratustra 2014-09-25 10:39:25

+0

@LalitKumarB - 如果它的选择性意味着做一个单独的索引和表提取会更昂贵,它通常不会使用索引。为什么只有两个I/O只能使用一个?单排只是一个极端的例子。 (我忘记了什么时候能够更有效地达到索引的阈值,但我曾经使用10-15%作为经验法则)。 zaratustra的演示也使用了明确的'gather_schema_stats()'。 – 2014-09-25 10:41:50