有时你会因为你认为正确的SQL查询看似不合理的结果而挣扎数小时。
事实证明,它实际上是一个Oracle错误,而且你的SQL是正确的。
是否有任何捷径可以知道是否是这种情况 - 为您节省大量时间和挫折感?
答案 0 :(得分:1)
您可以做的一件事是应用Oracle 10g中引入的NO_QUERY_TRANSFORMATION提示。
如果这会产生所需的结果,您知道您正面临Oracle错误,因为没有提示应该更改查询的实际结果。
与此同时,您可能已经解决了您的问题,但您的执行计划可能不会令人满意。
您面临的错误(我不知道它是否是已知错误)是Oracle优化器在转换查询以获得更好的执行计划(合并视图等)时可能无法正确解释原始查询的意图)。通过使用提示,您可以指示优化器不这样做。
这种现象最常见于涉及内联性能视图的复杂查询。
目前我没有任何代码示例来重现此问题,但我正在努力。
更新: 事实上这似乎是暗示的意思 - 我发现了这个:
最后,对于查询块,请注意视图合并或子查询取消可能会影响我们看到的结果,从而查询块可以“消失”"完全。这意味着我们的命名查询块将被转换为"查询和系统生成的查询块名称在其位置使用。我们可以在上面的第一个详细解释计划中看到系统生成的查询块和别名的示例。当然,这意味着对命名查询块的一些提示可能无法正常工作,因为命名块并不存在。
然而,我们确实有几个选择。首先,我们可以使用详细的解释计划识别系统生成的查询块/别名,然后在我们的提示中使用这些标识符。 Jonathan Lewis在这里对这种技术进行了很好的讨论。或者,Oracle提供NO_QUERY_TRANSFORMATION提示以避免导致命名查询块的转换消失"。但是,这是一个非常激烈的方法,因为这意味着Oracle将完全根据我们的编写方式优化查询。丢失转换的成本可能远远超过我们首先应用于消失的查询块所需的提示的好处。