java - 这些 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 的对象中是一对多的关系,无论如何它们都是由休眠加载的。这意味着从长远来看,我可能不会随时储蓄。我的想法在这里正确吗?
谢谢!
解决方案
如果我理解正确,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)
。
推荐阅读
- java - Android Listview 按字母顺序排列
- genexus - Genexus:在 For Each 中使用集合变量
- python - 来自csv文件的Python实时绘图
- system.reactive - 使用 Rx,如何获取每个唯一键的最新值?
- json - 如何在 SwiftUI URLSession 中显示来自服务器的错误消息
- javascript - Javascript函数返回数组为空
- python - 附加到字典数组只放最后一条记录
- linux - ubuntu20.04 netplan apply write syslog
- npm - npm WARN @ octokit / plugin-request-log @ 1.0.3 需要 @ octokit / core @> = 3 的对等点,但没有安装。您必须安装对等依赖项
- c++ - 一旦触发中断,对象的成员值就会改变