在下面的两个sql查询中,建议哪一个更好。单个查询加入或两个简单查询?

时间:2011-07-01 06:37:21

标签: sql function postgresql join

假设A)中的第一个查询结果(envelopecontrolnumber,partnerid,docfileid)=(000000400,31,35)

A)

select envelopecontrolnumber, partnerid, docfileid 
from envelopeheader 
where envelopeid ='LT01ENV1107010000050';

select count(*) 
from envelopeheader 
where envelopecontrolnumber = '000000400' 
  and partnerid= 31 and docfileid<>35 ;

B)

select count(*)  
from envelopeheader a 
join envelopeheader b on a.envelopecontrolnumber = b.envelopecontrolnumber 
                       and a.partnerid= b.partnerid 
                       and a.envelopeid = 'LT01ENV1107010000050' 
                       and b.docfileid <> a.docfileid;

我在sql函数中使用上面的查询。我在pgAdmin(postgres)中尝试了查询,它显示了16ms(A)和B)。当我在pgadmin上分别尝试B)的查询时。它仍然分别为每一个显示16毫秒 - 为B)制作32毫秒 - 这是错误的,因为当你从B中一次运行两个查询时,它显示16毫秒。请建议哪一个更好。我正在使用postgres数据库。

4 个答案:

答案 0 :(得分:5)

显示的时间包括以下时间:

  • 向服务器发送查询
  • 解析查询
  • 计划查询
  • 执行查询
  • 将结果发送回客户
  • 处理所有结果

尝试像“SELECT 1”这样的简单查询。你可能也会得到16毫秒。

您很可能只是测量服务器的ping时间。

如果您想知道查询使用的服务器上有多少时间,则需要EXPLAIN ANALYZE。

答案 1 :(得分:2)

选项1:

 Run query A.
 Get results.

 Use these results to create query B.

 Send query B.
 Get results.

选项2:

 Run combined query AB.
 Get results.

因此,如果您从客户端使用此连接,连接到Postgres,请使用第二个选项。将查询发送到数据库并获取结果会产生开销。

如果您在SQL函数或过程中使用它,差异可能是微不足道的。我仍然会使用第二个选项。在任何一种情况下,我都会检查查询B或AB是否已经过优化(检查查询计划,如果使用索引等)。

答案 2 :(得分:0)

转到选项1:两个查询不相关,因此单独执行这些查询会更有效。

答案 3 :(得分:0)

选项A会更快,因为您对计数感兴趣。

连接将创建一个临时结构,用于根据条件连接数据,然后执行计数操作。 因此选项A更好更快。