4

SQL Server ストアド プロシージャの days-since-last-activity 値を対数表現に変換して、一致する検索結果を切り捨てる前に (他の条件と共に) 加重順序付けしたいと考えています。Log2 は私のニーズをかなりよく近似しており、非常に効率的であるように思われます。

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

正常に動作しますが、最高の設定ビット位置を取得するためだけに、サーバーにそのような重い作業を依頼するのは非常に無駄に思えます。

これを行うためのより効率的な方法に関する提案はありますか?

4

1 に答える 1

3

最上位ビットを見つけるためのちょっとしたハックがいくつかありますが、T-SQLでは簡単に表現できません(ループが必要です)。UDFは、パフォーマンス上の理由から問題外です。

デナリで少し速く行くことができます:

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
于 2012-08-03T11:19:24.250 に答える