内部联接与执行where子句

时间:2017-01-13 03:21:04

标签: postgresql

假设我的查询返回了大约10-30行:

select * from users where location=10;

以下是否有任何区别:

  select * 
  from users u 
      inner join location l on u.location = l.id 
  where location=10; 

select * from users where location=10;  # say this returns 1,2,3,4,5
select * from location where id IN (1,2,3,4,5)

基本上我想知道在执行内连接和执行WHERE IN子句之间是否存在任何性能差异。

2 个答案:

答案 0 :(得分:3)

发出一个查询和发出两个查询之间有区别吗?嗯,我当然希望如此。 SQL引擎正在工作,它为两个查询做了两倍的工作(从某个角度来看)。

通常,解析单个查询比解析一个查询,返回中间结果集,然后将其反馈给另一个查询要快。查询编译和来回传递数据都有开销。

对于此查询:

if (is.list(f)) 
    f <- interaction(f, drop = drop, sep = sep)

您需要select * from users u inner join location l on u.location = l.id where u.location = 10; users(location)上的索引。

我确实想要指出别的东西。查询不等同。真正的比较查询是:

location(id)

您对select l.* from location l where l.id = 10; where使用了相同的列。因此,这将是最有效的版本,您需要on上的索引。

答案 1 :(得分:0)

比较不同查询性能的一种方法是使用postgresql的EXPLAIN命令,例如:

EXPLAIN select * 
from users u inner join
     location l
     on u.location = l.id 
where u.location = 10; 

这将告诉您数据库将如何获取数据。注意顺序扫描等事情,这表明您可以从索引中受益。它还可以估算每个操作的成本以及可能运行的行数。某些操作可以产生比预期更多的行,然后数据库会减少到它返回给您的集合。

您还可以使用EXPLAIN ANALYZE [query],它将实际运行查询并为您提供计时信息。

有关详细信息,请参阅postgresql documentation