我想在截断之前将我的 SQL Server 存储过程中的自上次活动以来的天数转换为匹配搜索结果的加权排序(连同其他条件)的对数表示。Log2 非常接近我的需求,看起来应该非常有效。
CAST (LOG(lastActivityAge)/LOG(2)) AS TINYINT
可以正常工作,但是要求我的服务器进行如此繁重的工作只是为了获得最高的设置位位置似乎非常浪费。
关于更有效的方法的任何建议?
我想在截断之前将我的 SQL Server 存储过程中的自上次活动以来的天数转换为匹配搜索结果的加权排序(连同其他条件)的对数表示。Log2 非常接近我的需求,看起来应该非常有效。
CAST (LOG(lastActivityAge)/LOG(2)) AS TINYINT
可以正常工作,但是要求我的服务器进行如此繁重的工作只是为了获得最高的设置位位置似乎非常浪费。
关于更有效的方法的任何建议?
有一些小技巧可以找到最高位,但它们不能在 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