【问题标题】:SQL Server: why would you ever cast on the left side of an operator?SQL Server:你为什么要在运算符的左侧进行转换?
【发布时间】:2012-01-20 21:00:23
【问题描述】:

我使用的是 SQL Server 2005。

我正在和我的一个朋友编码,只是举个例子,我去左侧投射一个联接。

JOIN t on cast(a.foo as int) = b.foo

他告诉我永远不要这样做,因为我失去了索引的所有性能优势。

你为什么要故意这样做?

【问题讨论】:

  • 最好的选择是重构,使您将加入的字段具有相同的数据类型。
  • 是的,这自然是我们所做的,但我只是对左侧演员感到好奇 :)

标签: sql sql-server-2005 tsql join casting


【解决方案1】:

嗯...答案有点像你朋友所说的。如果你施放它,它将无法利用 a.foo 上的索引。但是,如果您投射右侧,那么您将无法利用 b.foo 上的索引。

最后,如果您要加入不匹配的数据类型,您将不得不在某个地方丢失。它应该在连接的左侧还是右侧完全取决于数据密度,以及所涉及的表上实际有哪些索引(例如,如果 a.foo 无论如何都没有被索引,它真的不会花费很多)。

【讨论】:

    【解决方案2】:

    当写诸如

    之类的时间谓词时

    @test_date 位于T.start_date 范围内的收盘周期内 和T.end_date

    我非常喜欢将较小的日期放在左侧,就像时间轴上的情况一样,即

    WHERE T.start_date <= @test_date
          AND @test_date < T.end_date
    

    如果@test_date 涉及CAST,我最初会以相同的方式编写它。老实说,我可能只会在出现性能问题时才寻求更改它,因为比起过早的优化,我更喜欢逻辑上合理、可读的代码。

    【讨论】:

      猜你喜欢
      • 2022-11-30
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      • 2023-04-10
      • 2021-12-22
      • 1970-01-01
      • 2022-06-28
      相关资源
      最近更新 更多