C# 会合中的铸造和转换是否会对性能造成影响?

C# 会合中的铸造和转换是否会对性能造成影响?,c#,sql-server,C#,Sql Server,我正在开发新的存储过程,所有内容都设置好了。在代码审查期间,我收到了一条评论,指出我不应该在联接中强制转换/转换,而是要求我将DateTime转换为int-date,然后比较这两个 代码: INNER JOIN SchedData SD ON SD.EmployeeID = CAE.EmployeeID AND CAST(CAST(SD.AssignDate AS VARCHAR(8)) AS DATETIME) BETWEEN @StartDate a

我正在开发新的存储过程,所有内容都设置好了。在代码审查期间,我收到了一条评论,指出我不应该在联接中强制转换/转换,而是要求我将DateTime转换为int-date,然后比较这两个

代码:

INNER JOIN SchedData SD 
        ON SD.EmployeeID = CAE.EmployeeID
            AND CAST(CAST(SD.AssignDate AS VARCHAR(8)) AS DATETIME) BETWEEN @StartDate and @EndDate + 1
SD.AssignDate       
解释:

INNER JOIN SchedData SD 
        ON SD.EmployeeID = CAE.EmployeeID
            AND CAST(CAST(SD.AssignDate AS VARCHAR(8)) AS DATETIME) BETWEEN @StartDate and @EndDate + 1
SD.AssignDate       
是整数日期,如
20100801

@StartDate and @EndDate 
是日期时间的参数

当我在SQL论坛在线搜索时,他们说这不会有太大/任何区别,这是我在评论中的评论,但我只想从SQL领域的知名人士那里再次确认,我使用的是MS SQL

下面是关于Sql论坛中的强制转换的链接

请让我知道哪些是可行的工作w.r.t性能

如果有更好的方法,我很乐意实现该代码。

从您自己的链接:

一般来说,对SELECT中的项目执行强制转换或转换 这个条款几乎不花什么钱。(请注意,在何处强制转换或转换) 或ON子句可能非常昂贵,因为它们将保留SQL Server 有效利用索引)


最好的方法是将该列的数据类型转换为适当的日期或日期时间(如果行数相当小)

据我所知和猜测

AND CAST(CAST(SD.AssignDate AS VARCHAR(8)) AS DATETIME) BETWEEN @StartDate and @EndDate + 1
应该是where子句的一部分,而不是内部联接

如果

SD.AssignDate 

已经是日期时间字段,那么将其转换为varchar再转换为日期时间就没有意义了。

当您强制转换字段时,通常会使其不可搜索。(查一查)。当它不可搜索时,它不能使用
AssignDate
列上的索引(尽管我听说在SQL的更高版本中它在这方面做得越来越好)。如果改为对参数进行转换,则不会对字段进行转换,字段将变得可搜索,因此可以使用索引

您发布的链接是关于在“选择”中强制转换的。这里所做的不是对连接或谓词列进行强制转换

例如,将代码更改为:

AND SD.AssignDate BETWEEN 
CONVERT(INT,CONVERT(VARCHAR(8),@StartDate,112)) 
AND
CONVERT(INT,CONVERT(VARCHAR(8),@EndDate,112)) 
现在,字段周围没有函数,如果字段存在,它可以利用该列上的索引。。。。或者如果将来有一个

我建议您使用CTRL-L来观察发生了什么并比较查询

这里有一些有趣的背景资料,基本上是关于列的一些函数是可以的


当您投射一个字段时,通常会使其不可搜索。(查一查)。当它不可搜索时,它不能在列
SD.AssignDate
上使用索引。如果改为对参数进行转换,则不会对字段进行转换,字段将变得可搜索,因此可以使用索引。该链接只是在选择中进行强制转换。这里所做的不是对连接或谓词列进行强制转换。强制转换(somefield作为date)是可搜索的,必须使用正确的数据type@Nick,你说的有点道理,你会解释还是解释代码的一部分,以及“在参数上转换”的确切含义我将发布一个带有内部连接的应答器,从技术上讲,在where子句中使用Cast/Convert是非常昂贵的!我遇到了这个问题。他应该将参数转换为与SD.AssignedDate相同的类型,并进行连接/筛选。更改架构可能有点复杂。最好只是将参数转换为与列匹配抱歉,我回复得太晚了,我实现了更多的更改,无论如何,我同意你的观点,我目前在顶部声明了变量,并在内部联接中使用了这些变量,但是执行计划中没有太多更改,在这样做之后,但是我还是同意你的建议。需要在
AssignDate
字段上有一个有用的索引,或者包括该字段,这样才能有所不同。即使现在没有,您也希望将来能够添加一个,而不必更改任何代码来使用它。