将过滤器放在INNER JOIN而不是WHERE中

时间:2018-08-22 17:40:33

标签: sql postgresql

我正在分析一些我刚刚在工作中继承的代码,我有一个问题:

这是我继承的片段:

    Select sum(a.claim) as total
    from claims c
    inner join claim_entries ce
    on c.id = ce.claim_id
    and ce.deleted = 0
    and ce.dos >='2012-03-01'
    where c.deleted = 0
    and c.document_type = 0

我重写了代码,因此ON子句位于WHERE子句中:

    Select sum(a.claim) as total
    from claims c
    inner join claim_entries ce 
    on c.id = ce.claim_id       
    where c.deleted = 0
    and c.document_type = 0        
    and ce.deleted = 0
    and ce.dos >='2012-03-01'

原始代码运行了36秒,而我的重写运行了9秒。将过滤器放在INNER JOIN的JOIN子句中,而不是放在WHERE中,有什么区别吗?我只在使用LEFT JOINS时才这样做,却从未见过INNER JOIN的事情。我也不确定为什么原始文件比重写文件花费4倍的时间,除非在运行原始文件后缓存了数据。

1 个答案:

答案 0 :(得分:3)

使用内部联接,将条件放在ON子句或WHERE子句中都没有关系。执行计划将是相同的。使用EXPLAIN进行确认。

执行时间上的差异可能是由于缓存效果所致。重复测试几次以获得可靠的结果。