【问题标题】:Convert only if criteria are met in the middle of a Join仅当在连接过程中满足条件时才转换
【发布时间】:2016-07-05 15:52:09
【问题描述】:

第一次在这里发布问题,但我是这个网站的常客,非常感谢这个社区,它对晦涩的问题有很好的答案。

下面是一个连接,它正在转换两个视图上的日期,导致大约 2000 万个日期在“PDR”视图中重新格式化。我只能在 Join 中使用年份和月份,这就是它被转换的原因(我在这部分没有选择)。

如果 Department_Code = 'X',我只需要在这些列中包含数据,因此最终汇总的约 500 行中的 90% 不会在这些列中包含任何内容。

我需要提高效率,我想说仅当 Department_Code = 'X' 时才转换日期

我可以将该条件添加到联接吗?

Left Join [dbo].[SLHSV_TM_Pharm_IP_OP_Factor_Rollup] as TMIPOP 
on Left (Convert (varchar, TMIPOP.[Pharm_IPOP_MONTH], 112),6) 
= Left (Convert (varchar, PDR.Payroll_Period_End_Date, 112),6)

【问题讨论】:

  • 哪个 RDBMS?您可以通过同时加入 YEAR(date) = YEAR(date) 和 MONTH() = MONTH() 来保持日期转换为数学,而不是转换为 varchar。这可能有助于表现一些。否则,您可以根据需要编写一个 case 语句,并在 case 语句 = 1 时说出然后加入。例如。 (当 department_cod = 'X' and MONTH(a) = MONTH(b) and YEAR(a) = YEAR(b) THEN 1 ELSE 0 END)= 1

标签: sql performance join implicit-conversion


【解决方案1】:

我需要提高效率,我想说仅当 Department_Code = 'X' 时才转换日期

我可以将该条件添加到联接吗?

由于转换后的日期用于 [left] 连接条件,我想避免转换意味着 Department_Code 与 'X' 不同的行将(因此)不满足连接条件。

如果Department_Code 列在SLHSV_TM_Pharm_IP_OP_Factor_Rollup 上,那么最简单的方法就是像这样编写连接条件:

Left Join [dbo].[SLHSV_TM_Pharm_IP_OP_Factor_Rollup] as TMIPOP 
  on TMIPOP.[Department_Code] = 'X'
  and Left (Convert (varchar, TMIPOP.[Pharm_IPOP_MONTH], 112),6) 
    = Left (Convert (varchar, PDR.Payroll_Period_End_Date, 112),6)

您的查询规划器可能避免在左侧评估为 false 时评估 AND 的右侧。允许这样做,但是否真的这样做取决于实现。

如果你想确定,那么你可以预先过滤你不想要的内表行:

Left Join (
    select *
    from [dbo].[SLHSV_TM_Pharm_IP_OP_Factor_Rollup]
    where [Department_Code] = 'X'
  )  as TMIPOP 
  on Left (Convert (varchar, TMIPOP.[Pharm_IPOP_MONTH], 112),6) 
    = Left (Convert (varchar, PDR.Payroll_Period_End_Date, 112),6)

如果 Department_Code 列在表 PDR 上,那么您的选择会受到更多限制,但这应该可以工作(如果该列在另一个表上,模拟应该可以工作):

Left Join [dbo].[SLHSV_TM_Pharm_IP_OP_Factor_Rollup] as TMIPOP 
  on case
    when PDR.[Department_Code] = 'X'
      then Left (Convert (varchar, TMIPOP.[Pharm_IPOP_MONTH], 112),6) 
        = Left (Convert (varchar, PDR.Payroll_Period_End_Date, 112),6)
    else 1 = 0
  end

可以想象,您会发现最后一次比仅进行所有转换更昂贵。由于性能显然是您关心的问题,因此必须进行测试。还建议检查您评估的选项的查询计划,因为这可能会帮助您找到效果更好的变体。

【讨论】:

  • 看到之后总是很明显。我现在正在尝试这个并让它运行一段时间。希望这样做。我会回复结果。谢谢!左连接(从 [dbo].[SLHSV_TM_Pharm_IP_OP_Factor_Rollup] 中选择 *,其中 [Department_Code] = 'X')作为 TMIPOP
猜你喜欢
  • 2018-09-24
  • 1970-01-01
  • 2021-12-07
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 2017-01-05
相关资源
最近更新 更多