与硬编码值相比,Oracle SQL In Subquery花费了太多时间

时间:2019-06-21 11:55:50

标签: sql oracle subquery query-optimization

我有一个简单的查询,运行大约需要2分钟,而使用硬编码值执行则需要8秒。

SELECT * 
FROM TABLE_A
WHERE TRANSACTION_DATE = (SELECT PREV_WORKING_DAY 
                          FROM TABLE_B )

SELECT PREV_WORKING_DAY FROM TABLE_B返回“ 2019年6月20日”。

TRANSACTION_DATE和PREV_WORKING_DAY均为日期格式。

当我们在查询输出中对日期进行硬编码为100毫秒时

SELECT * 
FROM TABLE_A
WHERE TRANSACTION_DATE = '20-JUN-2019'

总记录= 82,000

任何想法都会导致使用子查询时的延迟以及如何优化延迟。

我知道我可以在PL / SQL中将其转换并将值分配给变量,但是我仍然想了解是什么导致了延迟。 谢谢

2 个答案:

答案 0 :(得分:1)

我的猜测是您没有TABLE_B的统计信息或它的统计信息很陈旧,因此Oracle不知道它只有一行。因此,它选择了效率低下的计划。 解释计划将告诉您子查询的基数。

如果是这样,解决方案是:

dbms_stats.gather_table_stats(user, 'TABLE_B');

您应该阅读the documentation on gathering statistics

答案 1 :(得分:0)

如果切换到JOIN,会发生什么?

SELECT A.*
FROM TABLE_A A JOIN
     TABLE_B B
     ON A.TRANSACTION_DATE B.PREV_WORKING_DAY;