Ser*_*kov 7 oracle sql-execution-plan
我有一个参数化查询。根据参数值的不同,最优查询计划会有很大差异。问题在于:Oracle 将第一次查询调用的计划用于后续调用,从而导致性能不佳。我通过动态 SQL 处理它,但这种方式远非优雅。所以问题是:有没有办法告诉 Oracle 必须重新计算查询计划?
如果查询计划确实在参数值上发生了显着变化,也许您不应该为此参数使用绑定变量。
该参数可以采用多少个不同的值?如果只有几个,您最终会得到几个查询计划(每个值一个),这些计划有望表现良好并且可以重复使用。
或者,您可以在 SQL 语句中使用注释“/* THIS IS VALUE BRACKET ONE * /”来分隔它们(或查询分析器提示,如果您觉得自己知道哪些是合适的,例如 /*+ CARDINALITY */ 可能适用这里)。
无论哪种方式,我认为您希望拥有单独的 SQL 语句,以便您可以在 Statspack 和朋友中获得单独的报告,因为看起来您确实想要微调该查询。
对于 Oracle 10g,我们将选择查询中的任何表并执行
GRANT SELECT ON table1 TO user1;
Run Code Online (Sandbox Code Playgroud)
这将使引用该表的任何查询的计划无效。当然,您会希望选择一个对其他查询影响最小的表。另请参阅此页面以获取更多信息和示例列表。