Join中的顺序确实是一个大麻烦



我做了这个查询

select L.some_variable, C.id from l_table L
left join c_table C using (some_variable)
where C.id is null

然后查看上面查询的更完整的版本

select L.*, C.* from l_table L
left join c_table C using (some_variable)
where C.id is null
order by L.some_variable

第二个用了8倍的时间。我确信l *, c *不是"有罪的"。some_variable是一个字符串字段。但订购这个不可能是20分钟的事。是什么造成了如此多的差异?

some_variable也不是索引,但这会影响两个操作,或者排序需要某种索引才能在连接中表现良好?

如果这是您的查询:

select L.*, C.*
from l_table L left join
     c_table C
     using (some_variable)
where C.id is null
order by L.some_variable;

我倾向于这样写:

select l.*
from l_table l
where not exists (select 1 from c_table c where () )
order by l.some_variable;

table_c中的列在select中似乎是多余的,因为它们可能是NULL

对于这个查询,l_table(l.some_variable, <variables in where>)上的索引可能能够防止花费这么多时间的排序。

相关内容

  • 没有找到相关文章

最新更新