oracle 合并高开销的笛卡尔连接

b91juud3  于 2023-02-18  发布在  Oracle
关注(0)|答案(2)|浏览(100)

我们正在查询数据库以填充一些记录的票证,但是查询形成了上述问题,并由我们的性能团队进行了沟通。
现在我正在学习Java编程,但对这些连接并没有太多的了解。我怎样才能重新构建下面的查询,以避免合并笛卡尔连接带来的高成本呢?

FROM
    SERVICE_REQ SR,
    SR_COBRAND_DATA SR_COB_DATA,
    REPOSITORY rep,
    SR_ASSIGNEE_INFO ASSIGNEE_INFO 
WHERE
    SR.SR_COBRAND_ID=rep.COBRAND_ID 
    AND SR.SERVICE_REQ_ID=SR_COB_DATA.SERVICE_REQ_ID (+) 
    AND SR.SERVICE_REQ_ID = ASSIGNEE_INFO.SERVICE_REQ_ID (+) 
    AND SR.SR_COBRAND_ID = 99
b5lpy0ml

b5lpy0ml1#

在表SERVICE_REQ的SR_COBRAND_ID和SERVICE_REQ_ID列上创建复合索引
--在服务请求(SR_COBRAND_ID,服务请求ID)上创建索引[索引名];

waxmsbnn

waxmsbnn2#

只是一个建议:不应使用旧的隐式连接语法,而应使用显式连接语法:

SELECT * 
FROM  SERVICE_REQ SR 
LEFT JOIN  SR_COBRAND_DATA SR_COB_DATA ON SR.SERVICE_REQ_ID=SR_COB_DATA.SERVICE_REQ_ID
INNER JOIN REPOSITORY rep  ON SR.SR_COBRAND_ID=rep.COBRAND_ID 
LEFT JOIN SR_ASSIGNEE_INFO ASSIGNEE_INFO  ON SR.SERVICE_REQ_ID = ASSIGNEE_INFO.SERVICE_REQ_ID
WHERE SR.SR_COBRAND_ID = 99

无论如何,基于这个条件,您在表之间没有笛卡尔积,而是SERVICE_REQ与SR_COBRAND_DATA和SR_ASSIGNEE_INFO的左连接,通过与REPOSITORY的内连接来减少。
也许为了解释你的目标,你应该添加适当的样本数据,预期的结果,和你的实际结果。

相关问题