带有附加左表过滤器的左连接性能

Posted

技术标签:

【中文标题】带有附加左表过滤器的左连接性能【英文标题】:Left Join Performance with addtional Left Table Filter 【发布时间】:2014-09-11 15:12:25 【问题描述】:

您好,我想知道在左连接中添加附加条件是否会提高性能。 示例代码如下。 我只需要知道某些优惠的价格数据,但需要所有优惠数据。 只是想知道是否值得添加额外的连接条件来提高性能?

SELECT 
    * 
FROM
    OFFERS 
LEFT JOIN PRICE ON (
    PRICE.PH_SUBS_LINK_SK = ACTSUBS.PH_SUBS_LINK_SK and 
    PRICE.PRICE_END_DT= '09-09-9999' and
    OFFERS.PERCENT_VALUE >0 and 
    OFFERS.VALUE_OR_PERCENT = 'PERCENT' and 
    OFFERS.PRODUCT_OFFER_TYPE = 'RC' and 
    OFFERS.OFFER_STATUS_CODE in ('ACT','PTM')
    )

【问题讨论】:

这些不是连接条件,而是过滤器。过滤数据通常会提供更好的性能,但它取决于索引、分区等。 这将取决于数据集大小索引和其他各种因素,不仅仅是JOINWHERE 的使用会影响性能。首先IN('ACT','PTM') 通常效率很低,而且通常比(columnName = '' OR columnName = '') 更快。您还可以从dba.stackexchange.com 获得更多帮助,尽管我相信您的问题在这里也适用,但他们可能对优化有更深入的了解:) 另外,这取决于您使用的是哪个 RDBMS。您是否比较了执行计划? 您还引用了 ACTSUBS 表,但在您的 from 或 left-join 中没有列出这样的表。那应该给你一个失败的命令来执行。 【参考方案1】:

我建议为此更改上面的代码:

    SELECT 
    * 
FROM
    OFFERS 
LEFT JOIN PRICE ON
    PRICE.PH_SUBS_LINK_SK = ACTSUBS.PH_SUBS_LINK_SK 
WHERE PRICE.PRICE_END_DT= '09-09-9999' and
    OFFERS.PERCENT_VALUE >0 and 
    OFFERS.VALUE_OR_PERCENT = 'PERCENT' and 
    OFFERS.PRODUCT_OFFER_TYPE = 'RC' and 
    OFFERS.OFFER_STATUS_CODE in ('ACT','PTM')

为了提高性能,为 where 语句中使用的字段创建索引。

【讨论】:

这不等同于原始查询,因为外部连接价格表上的过滤器现在将删除所有不满足PRICE_END_DT = '09-09-9999' 条件的行。原始查询将返回空行而不是不匹配的价格。

以上是关于带有附加左表过滤器的左连接性能的主要内容,如果未能解决你的问题,请参考以下文章

我在 oracle sql 中的左连接没有返回左表的每个元素

使用带有附加过滤器的 Groupby

每组右表的左外连接?

mysql连接查询

mysql左连接没有数据还会查出来吗

中级测试工程师面试总结_1