假设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数据库。
答案 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更好更快。