首页 > 解决方案 > 这些 SQL 查询是否等效?哪个更好还是有更好的选择?

问题描述

我正在开发一个使用休眠连接到 DB2 数据库的 Spring Web 应用程序。我试图通过减少数据库查询的数量来优化在婚礼服务调用期间可能会被调用的服务方法。

所以我的问题是这个查询是否

SELECT DISTINCT a.* FROM TABLE_A a
LEFT JOIN TABLE_B b ON a.ID = b.FK_ID 
LEFT JOIN TABLE_C c ON a.ID = c.FK_ID
LEFT JOIN TABLE_D d ON c.DATA_RQST_ID = d.ID
WHERE (b.REQUEST_ID = 1234 AND b.TYPE = 'TYPE_A')
OR (c.REQUEST_ID = 1234 AND (c.TYPE = 'TYPE_A' OR c.TYPE = 'TYPE_B'))

与此查询等效/更好

SELECT * FROM TABLE_A a 
WHERE  a.ID IN 
(
    SELECT b.FK_ID FROM  TABLE_B b 
    WHERE b.REQUEST_ID = 1234 AND eb.TYPE = 'TYPE_A' 
)
OR a.ID IN 
(
    SELECT c.FK_ID FROM TABLE_C 
    WHERE ( c.REQUEST_ID = 1234 AND c.TYPE = 'TYPE_A' )
    OR 
        (
            c.TYPE = 'TYPE_B' AND c.REQUEST_ID IN 
                (
                    SELECT d.ID FROM TABLE_D d 
                    WHERE d.REQUEST_ID = 1234 AND v.TYPE = 'TYPE_A'
                )
        )
)

还是有更好的选择?

两个查询似乎在同一时间(<50 毫秒)运行,但这可能取决于结果数据。我需要测试更多才能确定。

这两个查询的目的是让其中一个查询替换其他三个查询,在这些查询中,它们的结果数据在 Java 中处理以获得所需的数据。

我还必须能够将 SQL 查询转换为 HQL。我正在努力转换第一个查询。

我有一种感觉,我可能会浪费我的时间,因为表 B 和 C 的 java 对象在表 A 的对象中是一对多的关系,无论如何它们都是由休眠加载的。这意味着从长远来看,我可能不会随时储蓄。我的想法在这里正确吗?

谢谢!

标签: javasqlspringhibernatedb2

解决方案


如果我理解正确,exists将是最好的解决方案:

SELECT a.*
FROM TABLE_A a
WHERE EXISTS (SELECT 1
              FROM TABLE_B b 
              WHERE a.ID = b.FK_ID AND b.REQUEST_ID = 1234 AND b.TYPE = 'TYPE_A'
             ) OR
      EXISTS (SELECT 1
              FROM TABLE_C c JOIN
                   TABLE_D d
                   ON c.DATA_RQST_ID = d.ID
              WHERE a.ID = c.FK_ID AND
                    c.REQUEST_ID = 1234 AND
                    (c.TYPE IN ('TYPE_A', 'TYPE_B'))
             );

一大收获就是删除了select distinct.

table_b(fk_id, request_id, type_id)然后为了性能,您需要在andtable_c(fk_id, request_id, type, DATA_RQST_ID)和上建立索引table_d(id)


推荐阅读