与硬编码值相比,子查询中的Oracle SQL占用的时间太长
我有一个简单的查询,运行大约需要2分钟,而使用硬编码值执行时需要8秒与硬编码值相比,子查询中的Oracle SQL占用的时间太长,sql,oracle,subquery,query-optimization,Sql,Oracle,Subquery,Query Optimization,我有一个简单的查询,运行大约需要2分钟,而使用硬编码值执行时需要8秒 SELECT * FROM TABLE_A WHERE TRANSACTION_DATE = (SELECT PREV_WORKING_DAY FROM TABLE_B ) 从表B中选择上一个工作日返回“2019年6月20日” 事务处理日期和上一个工作日均为日期格式 当我们硬编码时,查询输出中的日期是100毫秒 SELECT * FROM TABLE_A WHERE
SELECT *
FROM TABLE_A
WHERE TRANSACTION_DATE = (SELECT PREV_WORKING_DAY
FROM TABLE_B )
从表B中选择上一个工作日
返回“2019年6月20日”
事务处理日期和上一个工作日均为日期格式
当我们硬编码时,查询输出中的日期是100毫秒
SELECT *
FROM TABLE_A
WHERE TRANSACTION_DATE = '20-JUN-2019'
记录总数=82000
知道在使用子查询时是什么导致了延迟,以及我们如何对其进行优化吗
我知道我可以在PL/SQL中进行转换,并将值赋给一个变量,但我仍然想了解造成延迟的原因。
谢谢如果您切换到
加入
,会发生什么
SELECT A.*
FROM TABLE_A A JOIN
TABLE_B B
ON A.TRANSACTION_DATE B.PREV_WORKING_DAY;
我的猜测是,表B没有或非常陈旧的统计数据,所以Oracle不知道它只有一行。因此,它选择了一个低效的计划。 解释计划将告诉您子查询的基数 如果是这样,解决方案是:
dbms_stats.gather_table_stats(user, 'TABLE_B');
您应该阅读。表B只有一行吗?或者,这两个表之间是否存在您未显示的相关性?(另外,“2019年6月20日”不是日期,而是字符串,因此存在隐式转换)。您可能希望包含这两个查询的执行计划。是否有表_A上的索引?解释两个查询以查看第一个查询是否未使用索引。“从表B中选择上一个工作日”如何仅返回一行?表中只有一行吗?是的,表B只有一条上一个工作日的记录。@AlexPoole表A和表B之间的唯一关系是事务日期。基本上,表A保存了我所有交易的列表,表B保存了我上一个工作日、今天和下一个工作日的记录。你能为这两个查询提供执行计划吗