Sql 在内部联接中而不是在何处放置筛选器

Sql 在内部联接中而不是在何处放置筛选器,sql,postgresql,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_typ

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

这是我继承的一个片段:

    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秒。在内部联接的JOIN子句中放置过滤器与在WHERE子句中放置过滤器有什么区别吗?我只在使用左连接时这样做过,从未见过在内部连接时这样做过。我也不确定,除非在我运行原始数据之后缓存数据,否则为什么原始数据要比重写时间长4倍。

对于内部联接,在
ON
子句或
WHERE
子句中设置条件并不重要。执行计划将是相同的。使用
EXPLAIN
确认这一点


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

对于内部联接,在
子句上的
WHERE
子句中设置条件并不重要。执行计划将是相同的。使用
EXPLAIN
确认这一点


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

对于内部连接,它不应产生任何影响。我假设第二个更快,因为它从缓冲区/缓存读取数据。重写的可能副本看起来不太正确,因为在“ON”上方有“AND”。您确定没有将日期比较向下移动到WHERE子句吗?因为我很确定这会大大加快你的查询速度。我可能是错的,但我认为尝试基于“大于”匹配行要比事后筛选花费更高。我们可以推测速度更快的原因,但获取其中每一行的执行计划更简单。请获取计划并发布。@TheImpler:不,他/她应该使用
explain(analyze,buffers)
而不仅仅是一个带有内部连接的简单解释,它不应该有任何影响。我假设第二个更快,因为它从缓冲区/缓存读取数据。重写的可能副本看起来不太正确,因为在“ON”上方有“AND”。您确定没有将日期比较向下移动到WHERE子句吗?因为我很确定这会大大加快你的查询速度。我可能是错的,但我认为尝试基于“大于”匹配行要比事后筛选花费更高。我们可以推测速度更快的原因,但获取其中每一行的执行计划更简单。请把计划拿出来,然后贴出来。@TheImpler:不,他/她应该用
解释(分析,缓冲)
而不仅仅是简单的解释