Sql查询将永远无法执行

Sql查询将永远无法执行,sql,performance,oracle,sql-in,Sql,Performance,Oracle,Sql In,下面是我正在尝试执行的查询,它需要花费很长时间才能执行 SELECT DISTINCT (CLN_CLNDR_DT)FROM CLN_CLNDR CLN, SYG_SYSTEM_GLOBALS SYG,CTD_CSH_TRNSCTN_DTLS CTD WHERE CLN.CLN_BP_ID = SYG.SYG_BP_ID AND CLN.CLN_ENTITY_ID = CTD.CTD_ENTITY_ID AND CLN_DT_SEQ_NUM IN (SELECT DISTINCT (CL

下面是我正在尝试执行的查询,它需要花费很长时间才能执行

SELECT DISTINCT (CLN_CLNDR_DT)FROM CLN_CLNDR CLN,
SYG_SYSTEM_GLOBALS SYG,CTD_CSH_TRNSCTN_DTLS CTD WHERE CLN.CLN_BP_ID = SYG.SYG_BP_ID AND CLN.CLN_ENTITY_ID = CTD.CTD_ENTITY_ID AND CLN_DT_SEQ_NUM  
IN 
 (SELECT DISTINCT (CLN1.CLN_DT_SEQ_NUM) 
 FROM CLN_CLNDR CLN1,
 SBD_SYS_BSNS_DTS SBD,
 SYG_SYSTEM_GLOBALS SYG,
 CTD_CSH_TRNSCTN_DTLS CTR
WHERE SBD.SBD_BSNS_DT  = CLN1.CLN_CLNDR_DT
AND CLN1.OU_ID         = SBD.OU_ID
AND CLN1.CLN_BP_ID     = SYG.SYG_BP_ID
AND CLN1.CLN_ENTITY_ID = CTR.CTD_ENTITY_ID
);
当我尝试在中运行查询时,它很容易返回结果 522470419417553582305361

SELECT DISTINCT (CLN1.CLN_DT_SEQ_NUM) 
 FROM CLN_CLNDR CLN1,
 SBD_SYS_BSNS_DTS SBD,
 SYG_SYSTEM_GLOBALS SYG,
 CTD_CSH_TRNSCTN_DTLS CTR
WHERE SBD.SBD_BSNS_DT  = CLN1.CLN_CLNDR_DT
AND CLN1.OU_ID         = SBD.OU_ID
AND CLN1.CLN_BP_ID     = SYG.SYG_BP_ID
AND CLN1.CLN_ENTITY_ID = CTR.CTD_ENTITY_ID;
另外,当我尝试直接执行完整查询时,会替换块中的查询 内部查询结果为522470419417553582305361

它工作得很好

因为我是新手,我不知道发生了什么。
请帮我解决这个问题。

我认为您不需要子查询中的所有表,因为您已经在使用它们筛选外部查询中的行。试试这个:

SELECT DISTINCT (CLN_CLNDR_DT)
FROM CLN_CLNDR CLN,
SYG_SYSTEM_GLOBALS SYG,
CTD_CSH_TRNSCTN_DTLS CTD 
WHERE CLN.CLN_BP_ID = SYG.SYG_BP_ID 
AND CLN.CLN_ENTITY_ID = CTD.CTD_ENTITY_ID 
AND CLN_DT_SEQ_NUM  
IN 
 (SELECT DISTINCT (CLN1.CLN_DT_SEQ_NUM) 
 FROM CLN_CLNDR CLN1,
 SBD_SYS_BSNS_DTS SBD,
WHERE SBD.SBD_BSNS_DT  = CLN1.CLN_CLNDR_DT
AND CLN1.OU_ID         = SBD.OU_ID
);

看起来乐观者会感到困惑,并为完整查询选择了一个较差的执行计划。你能把三个变量的执行计划部分地加上吗?完全查询和完全查询,部分地替换为常数。你能详细说明你现在的要求吗。您希望我们向您提供这三个查询吗?或者其他。在查询之前添加EXPLAIN以获取所选查询的执行计划它将向您显示SQL执行查询所需的步骤。似乎优化者确实选择了一个较低的计划,我认为您可能需要使用提示来准确地告诉您要使用哪个查询执行。您还应该考虑从表1、表2、表3中替换…对于FROM Table1,请将Table2连接到Table2.ParentId=Table1.Id。。。。逗号分隔表列表是SQL92中为联接而替换的旧SQL89标准语法。我们现在是SQL2011…使用SQL92语法而不是SQL89进行连接可能更好,也就是说,在where子句中声明了连接条件的多个FROM表。改用连接语法。