仅在加入

时间:2016-07-05 15:52:10

标签: sql performance join implicit-conversion

第一次在这里发布一个问题,但我是这个网站的常用用户,非常感谢这个对这些模糊问题有很好答案的社区。

下面是一个Join,它将两个视图上的日期转换为导致约2千万个日期在" PDR"中重新格式化。视图。我只能在Join中使用年份和月份,这就是它被转换的原因(我没有选择)。

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

我需要提高效率,如果部门代码=' 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)

1 个答案:

答案 0 :(得分:0)

  

我需要提高效率,如果部门代码=' X'

,我只想说转换日期      

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

由于转换日期用于[左]连接条件,我认为避免转换意味着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

可以想象,你会发现最后的代价比只进行所有转换更昂贵。由于性能显然是您的关注点,因此必须进行测试。建议您检查所评估选项的查询计划,这样可以帮助您找到更有效的变体。