带有附加左表过滤器的左连接性能
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')
)
【问题讨论】:
这些不是连接条件,而是过滤器。过滤数据通常会提供更好的性能,但它取决于索引、分区等。 这将取决于数据集大小索引和其他各种因素,不仅仅是JOIN
与WHERE
的使用会影响性能。首先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'
条件的行。原始查询将返回空行而不是不匹配的价格。以上是关于带有附加左表过滤器的左连接性能的主要内容,如果未能解决你的问题,请参考以下文章