在sql中加入订购事项吗?

时间:2011-07-25 06:02:56

标签: database postgresql

我正在使用postgresql,假设我有两个表,一个是用户(name,age,comment_id),另一个是comment(comment_id,text),现在有数十亿用户,但有数千条评论。连接的顺序是否写入where子句的重要性?

例如:查询1

select a.name, b.text 
from user as a, comment as b
where 
   b.comment_id = 1 and
   a.comment_id = b.comment_id

例如:查询2

select a.name, b.text 
from user as a, comment as b
where 
  a.comment_id = b.comment_id and
  b.comment_id = 1

3 个答案:

答案 0 :(得分:2)

连接顺序对于内部连接无关紧要,但它对外部连接很重要。

答案 1 :(得分:0)

就我读你的代码而言,你根本不使用任何联接。您创建整个笛卡尔积,然后使用WHERE进行过滤。我们希望您的查询优化器能够解决这个问题。

是的,这很重要。始终尝试更有选择性(从笛卡尔产品中杀死更多行)并查看DBMS的QEP。

您的查询应该是:

select a.name, b.text from
user as a
[left|right|inner|outer] join comment as b on a.comment_id = b.comment_id
where b.comment_id = 1

答案 2 :(得分:0)

加入订单无关紧要,直到达到阈值。一个阈值使Geqo启动,另外两个启动时显式和隐式连接的数量太大。

在where子句中,顺序无关紧要,PG保留根据布尔逻辑重新排序所有内容的权利。这使得此查询变得危险:

select 1 from stuff where x <> 0 and y / x > 1 -- should use case instead