快速INT(LOG2(值))

时间:2012-08-03 10:33:57

标签: sql sql-server tsql

我希望在截断它们之前,将SQL Server存储过程中的days-since-last-activity值转换为匹配搜索结果的加权排序(以及其他条件)的对数表示。 Log2非常接近我的需求,看起来应该非常有效。

CAST (LOG(lastActivityAge)/LOG(2)) AS TINYINT

工作正常,但要求我的服务器进行如此繁重的工作以获得最高位设置似乎非常浪费。

有关更有效方法的任何建议吗?

1 个答案:

答案 0 :(得分:3)

有一些bit twiddling hacks可以找到最高位,但它们无法在T-SQL中轻松表达(需要循环)。出于性能原因,UDF不存在问题。

你可以用Denali更快一点:

CAST (LOG(lastActivityAge, 2)) AS TINYINT

或者对LOG(2)表达式进行硬编码,因为我不确定优化器是否可以将其永久折叠掉。无论如何,你需要数百万行来注意差异。

最后一招:如果有一些非常常见的值,请尝试以下方法:

case lastActivityAge when 1 then 0 when 2 then 1 /* ... */ else CAST (LOG(lastActivityAge, 2)) AS TINYINT end