SQL Server:你为什么要在运算符的左侧进行转换?

时间:2011-12-15 05:17:20

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

我正在使用SQL Server 2005。

我正在和我的一个朋友一起编写代码,仅举一个例子,我去左侧投了一个连接。

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

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

你为什么要故意这样做?

2 个答案:

答案 0 :(得分:5)

嗯......答案就是你朋友所说的。如果你施放它,它将无法利用a.foo上的索引。但是如果你施放右侧,那么你将无法利用b.foo上的指数。

最后,如果您加入了不匹配的数据类型,您将不得不在某处丢失。是否应该在连接的左侧或右侧完全取决于数据密度,以及所涉及的表上实际上有哪些索引(例如,如果a.foo未被索引,那么它真的不会花费很多)。

答案 1 :(得分:0)

编写时态谓词时,例如

  

@test_date属于T.start_date限定的闭合开放时期   和T.end_date

我强烈希望在左侧找到较小的日期,就像在时间轴上的情况一样,即

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

如果@test_date涉及CAST我最初会以同样的方式编写它。老实说,如果存在性能问题,我可能只会尝试更改它,因为过早优化会使用逻辑上合理的可读代码。