我有一个简单的查询,运行大约需要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中将其转换并将值分配给变量,但是我仍然想了解是什么导致了延迟。 谢谢
答案 0 :(得分:1)
我的猜测是您没有TABLE_B的统计信息或它的统计信息很陈旧,因此Oracle不知道它只有一行。因此,它选择了效率低下的计划。 解释计划将告诉您子查询的基数。
如果是这样,解决方案是:
dbms_stats.gather_table_stats(user, 'TABLE_B');
答案 1 :(得分:0)
如果切换到JOIN
,会发生什么?
SELECT A.*
FROM TABLE_A A JOIN
TABLE_B B
ON A.TRANSACTION_DATE B.PREV_WORKING_DAY;