我的问题最好通过以下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系统)中,我无法像这样替换最后一行。因此,这种解决方法不是真正的解决方案。
谢谢!
答案 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
过程。