加入订单真是个大麻烦吗?

时间:2015-05-25 22:01:20

标签: sql postgresql sqlperformance

我做了这个查询

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 也不是索引,但是这会影响两个操作,或者排序需要某种索引才能在连接中表现良好?

1 个答案:

答案 0 :(得分:0)

如果这是您的查询:

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>)上的索引可能能够阻止花费这么多时间的排序。