Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与硬编码值相比,子查询中的Oracle SQL占用的时间太长_Sql_Oracle_Subquery_Query Optimization - Fatal编程技术网

与硬编码值相比,子查询中的Oracle SQL占用的时间太长

与硬编码值相比,子查询中的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

我有一个简单的查询,运行大约需要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 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保存了我上一个工作日、今天和下一个工作日的记录。你能为这两个查询提供执行计划吗