下面的图片显示了我的架构。
在我的java jdbc应用程序中,我需要从T1表中选择一些行。为此,我使用where,limit和offset子句。对于每个选定的行,我从T2中选择行,从T3中选择行。 我认为有两种可能性:
使用Java进行多次查询
select * form T1 where whereField=5 order by whereField limit 5 offset 5
//in java, for each selected row from T1:
select * from T2 where id=?
select * from T3 where id=?
对db的一个查询:
select * from T1 join T2 on T1.t2=T2.id join T3 on T2.t3=T3.id
where T1.whereField=5 order by T1.whereField limit 5 offset 5;
我想知道哪种方式更有效率。也许有更好的方法?
答案 0 :(得分:1)
确定哪个更适合您的数据库的最佳方法几乎肯定是使用Postgresql的Explain。 This PDF是一组幻灯片,是EXPLAIN的一个很好的演练。
性能取决于表中的数据(具有给定键的行数),索引的位置等。使用EXPLAIN将帮助您了解数据库正在做什么,受影响的行数并为您提供深入了解如何提高性能(Postgres配置,索引,操作员类等)。
答案 1 :(得分:1)
3选择和加入java最有可能慢于一个选择与db中的所有连接! SQL数据库针对此类工作进行了优化。
类似的问题: Is it faster to programmatic join tables or use SQL Join statements when one table is much smaller?
http://java.dzone.com/articles/myth-slow-sql-join-operations
答案 2 :(得分:1)
理想情况下,一个SQL语句将是最好的。这只需要一次访问数据库,一次返回数据。假设你的三个表上有适当的索引,我没有看到三个表连接对任何关系数据库造成问题。如果你向我展示了一百个表连接,那么事情就会发生变化,多个查询将是更好的方法。
最佳答案: 这取决于,在您的设置下测试这两种方法,看看哪一种方法产生了最好的结果并与之相配。