如何手动更改oracle解释sql查询的计划

时间:2014-09-25 10:05:52

标签: oracle

我有一个oracle sql查询,它附加了访问计划。如何在不更改sql查询的情况下更改访问计划。我认为oracle有存储sql id和plan id的数据库表,将计划id更新为新的计划id会强制sql查询使用不同的解释计划。

我正在使用Oracle 10,在这种情况下,我不想触及现有的查询。我将使用提示编写另一个查询并创建所需的解释计划。现在我将使用新标记作为解释计划并将其附加到原始的sql id。这是如何执行此操作的逻辑,但我不知道所有表需要更新才能实现此目的。第1步:SQLI_D1 - > PLAN_ID1;第2步:SQL_ID2 - > PLAN_ID2; STep3:SQL_ID1 - > PLAN_ID2

2 个答案:

答案 0 :(得分:1)

答案太多了,因为你的问题太宽泛了。你还没有提到数据库版本。

你说:

  

将计划ID更新为新计划ID将强制使用sql查询   不同的解释计划。

没有。 PLAN_HASH_VALUE由Oracle分配。这是将EXECUTION PLAN与相应SQL_ID相关联的标记。如果您想强制OPTIMIZER采取您选择的其他执行计划,可以在查询中使用HINTS

如果您使用stored outlines固定或保留了SQL的执行计划,也称为PLAN STABILITY,那么您需要删除它,以便Oracle能够在下次执行中找到合适的执行计划。然后,如果需要,您可以按照自己的想法稳定更好的计划。

答案 1 :(得分:0)

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

但我不明白你强迫oracle重新计算解释计划的意图,Oracle知道如何根据你提供的统计数据访问你的表。不要使用像INDEX这样的提示告诉oracle如何访问表。你可以给oracle一个提示,告诉oracle你只需要前5行,而oracle会尽可能快地将它们返回给你。