Sql 当涉及到存储过程优化时,是否可以替代join中的强制转换功能?
在使用联接的存储过程中,用于转换SQL查询中的数据类型的cast函数的最佳替代方法是什么 我经常读到使用函数不好,需要帮助优化下面的查询Sql 当涉及到存储过程优化时,是否可以替代join中的强制转换功能?,sql,sql-server,Sql,Sql Server,在使用联接的存储过程中,用于转换SQL查询中的数据类型的cast函数的最佳替代方法是什么 我经常读到使用函数不好,需要帮助优化下面的查询 SELECT A.DATE, A.Value curr , ISNULL( CAST( CONVERT ( DECIMAL(18,4), CASE WHEN @INV = 0 THEN NULLIF(ISNULL(tblRate.currBid,0),0) ELSE 1.00 / NULLIF(ISNULL
SELECT
A.DATE,
A.Value curr ,
ISNULL( CAST( CONVERT ( DECIMAL(18,4), CASE WHEN @INV = 0 THEN NULLIF(ISNULL(tblRate.currBid,0),0) ELSE 1.00 / NULLIF(ISNULL(tblRate.currBid,0) ,0) END ) AS VARCHAR) ,@TempHardcodeValue) AS currBid,
A.Value +' - '+ A.currName As ConcatenatedCurr
FROM #TEMPTable A
LEFT JOIN tblCurrRates (NOLOCK) tblRate ON A.Date = cast(tblRate.currDate as date) AND A.currCode = tblRate.currCode
ORDER BY A.Date ,A.Value
正如您所看到的,使用了强制转换函数,那么有没有其他方法可以在不使用强制转换的情况下重新写入?实际上,SQL Server可能可以使用强制转换。使用函数的一个例外是将日期/时间强制转换为日期——SQL Server识别使用索引的转换 但是,你可以做到:
FROM #TEMPTable A LEFT JOIN
tblCurrRates r
ON r.currDate >= A.Date AND
r.currDate < DATEADD(day, 1, A.Date) AND
r.currCode = a.currCode
来自#可诱惑的左连接
TBLCurrr
在r.currDate>=A.日期和
r、 currDate
这将允许代码在
tblcurrates(currCode,currDate)
上使用索引。不过,我怀疑您的代码也会使用该索引。Currencybid是数据类型MoneytblRate.currDate
的数据类型是什么?是不是要去掉时间部分?您可以将连接编写为代码上的equi连接和日期上的范围谓词,如果您有嵌套循环和适当的索引来支持seek,这可能会很有用。否则,强制转换实际上会有帮助,因为对于两个谓词equi join,这对合并或哈希joincurr date有帮助。date的数据类型是datetimeStop,四处飞溅。它们不是没有后果的,只有当你确切地理解它们的作用并且知道它们是需要的时候,你才应该使用它们。否-如果不更改模式,就无法避免转换。没有长度的varchar的转换是草率的。数值的格式设置应该留给数据使用者,而不是查询。