多个连接或多个选择,具有更好的性能

时间:2013-12-04 11:19:17

标签: postgresql

下面的图片显示了我的架构。

enter image description here

在我的java jdbc应用程序中,我需要从T1表中选择一些行。为此,我使用where,limit和offset子句。对于每个选定的行,我从T2中选择行,从T3中选择行。 我认为有两种可能性:

  1. 使用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=?
    
  2. 对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;
    
  3. 我想知道哪种方式更有效率。也许有更好的方法?

3 个答案:

答案 0 :(得分:1)

确定哪个更适合您的数据库的最佳方法几乎肯定是使用Postgresql的ExplainThis 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语句将是最好的。这只需要一次访问数据库,一次返回数据。假设你的三个表上有适当的索引,我没有看到三个表连接对任何关系数据库造成问题。如果你向我展示了一百个表连接,那么事情就会发生变化,多个查询将是更好的方法。

最佳答案: 这取决于,在您的设置下测试这两种方法,看看哪一种方法产生了最好的结果并与之相配。