Sql 快速整数(LOG2(值))

Sql 快速整数(LOG2(值)),sql,sql-server,tsql,Sql,Sql Server,Tsql,我想在截断匹配搜索结果之前,将SQL Server存储过程中自上次活动起的天数值转换为对数表示形式,以便对匹配搜索结果进行加权排序(与其他条件一起)。Log2非常接近我的需求,看起来应该非常有效 CAST (LOG(lastActivityAge)/LOG(2)) AS TINYINT 这样可以很好地工作,但要求我的服务器做如此繁重的工作只是为了获得最高的设置位位置似乎是非常浪费的 有没有关于更有效的方法的建议?有一些方法可以找到最高位,但它们不能用T-SQL轻松表达(需要循环)。出于性能原因

我想在截断匹配搜索结果之前,将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

谢谢,我不知道。不幸的是,我还不在德纳利。升级可能需要一年左右的时间。在大多数适用的搜索中,我的行数大约为10K。空间搜索是一个真正的问题,但我现在在用户体验方面做得很好,并且已经有了一些UI技巧来让它看起来更快。我添加了最后一个技巧。不管怎么说,与单行查找相比,算术是如此的便宜。也许您应该在其他地方寻找潜在的(或者至少使用perfview配置SQL Server,以确保日志函数的重要性)。您的值有多大?也许有必要考虑一个查找表。@AakashM:我会在年龄无关之前将它延长到4年左右。我可以在几周内不损失太多价值,所以大约有200行。谢谢你的主意。你有没有计时看看它有多慢?与I/O相比,即使是日志也可能非常快。