我有一个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
答案 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会尽可能快地将它们返回给你。