我正在使用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
答案 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