Oracle查询:如何影响WHERE条件的验证顺序?

时间:2014-09-16 07:19:21

标签: sql oracle

我的问题最好通过以下Oracle SQL中的查询示例来说明:

SELECT A.id 
FROM A, B
WHERE A.primary_key = B.foreign_key
AND B.primary_key = 'specific value'
AND A.some_expensive_attribute = '1'

我们假设A不是一个表,而是一个视图,考虑到为{{{}}的单行计算它所需的时间,A.some_expensive_attribute的计算成本很高1}}。

在我的特定应用程序中,视图A非常庞大,而A中的B行只有B.primary_key = 'specific value'。因此,计算结果最多需要10分钟。

但是,当我将最后一行/条件更改为以下(完全)冗余子选择时:

AND (
     SELECT some_expensive_attribute 
        FROM A as A2 
     where A2.primary_key = A.primary_key
    ) = '1'

......只需不到一秒钟。我认为在A - 行上实现冗余子选择会改变顺序以检查where条件。

我的问题是:是否有可能告诉Oracle"最后检查这个条件!" ?

请注意,在实际应用程序(PDM系统)中,我无法像这样替换最后一行。因此,这种解决方法不是真正的解决方案。

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以尝试一下提示:

SELECT /*+ ordered */ A.id 
FROM B, A -- order changed
WHERE A.primary_key = B.foreign_key
AND B.primary_key = 'specific value'
AND A.some_expensive_attribute = '1'

它不会改变where子句的条件计算方式,但会改变连接的方式,这里B在A之前。这值得一试。

答案 1 :(得分:0)

通常,Oracle会根据成本考虑因素选择最佳计划。

如果计划不是优秀的,那么您应该在查询中的基础表上收集统计信息。对于统计信息收集,您可以使用dbms_stats.gather_table_stats过程。