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



我的问题可以通过以下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计算它所需的时间,A.some_expensive_attribute的计算成本很高。

在我的特定应用程序中,视图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 条件的顺序。

我的问题是:是否可以告诉甲骨文"最后检查此条件!

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

谢谢!

你可以尝试一个提示:

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 之前。这值得一试。

通常,

Oracle 会根据成本考虑选择最佳计划。

如果计划不是最佳计划,则应在查询中收集基础表的统计信息。对于统计数据收集,您可以使用dbms_stats.gather_table_stats程序。

最新更新