非正規化やシーケンシャル操作を必要とする多くの問題は、CLR によって非常にうまく処理でき、SQL 側での使いやすさを (大幅に) 犠牲にすることなく、パフォーマンスを劇的に向上させるために使用できます。セットベースまたは反復操作のいずれかに完全に依存する代わりに、ハイブリッド アプローチを採用し、大量輸送にはセットベースのソリューションを使用し、タイト ループには反復モデルに切り替えることができます。
SQL Server 2008の組み込み型hierarchyid
と地理空間型 (つまりgeography
) は、非正規化の問題の良い例です。どちらも (ほぼ) 任意に大量のデータを含んでおり、パフォーマンスを損なうことなく正規化することは困難です。それ以外の場合は、再帰またはカーソルを使用して意味のある作業を行うか、ラットのトリガーのネストおよび/またはスケジュールされたタスクを使用する必要があります。非正規化テーブルを維持します。
私が CLR 型で解決したもう 1 つの問題は、インライン圧縮です。これは無意味または学術的な演習のように聞こえるかもしれませんが、完全に正規化されたデータがテラバイトに達する場合、サイズが 80 ~ 90% 削減されることは大きな意味があります。現在、SQL には独自の圧縮機能が組み込まれており、SQL 2005 には vardecimal がありました。これらも優れたツールですが、ドメイン対応の「最小化」アルゴリズムは、CPU 負荷と圧縮率の両方の点で数倍効率的です。もちろん、これはすべての問題に当てはまるわけではありませんが、一部の問題には当てはまります。
このサイトでよく見られるもう 1 つの非常に一般的な問題は、連続した日付のシーケンスなど、オンザフライでシーケンスを生成することです。一般的なソリューションは、再帰 CTE、静的シーケンス テーブル、あまり知られていないspt_values
テーブルですが、単純な CLR UDF はそれらのいずれよりも優れたパフォーマンスを発揮し、柔軟性が大幅に向上します。
最後に: ユーザー定義のストリーミング集計も、特に統計関連の場合に非常に役立ちます。中央値、加重移動平均など、組み込みの SQL 集計から単純に構成できないものがいくつかあります。UDA は複数の引数を取ることもできるため、それらをパラメーター化できます。技術的には、現在のバージョンの SQL Server では集計が特定の順序でデータを受け取ることが保証されていませんがROW_NUMBER
、追加の引数として集計をフィードし、これを使用してほぼすべてのウィンドウ関数を実装することで、その制限を回避できます (集約はUDTを吐き出し、それをテーブルに変換できます)。
本当に役立つ SQL-CLR アプリケーションの例がほとんどないことは、実際には非常にイライラさせられます。Google で検索すると、1,000 万件の結果が得られます。そのすべてが、ばかげた文字列連結または正規表現です。これらは便利ですが、特に SQL UDT と UDA について学習するのに数分かかります。独自のアプリケーションでこれらが多く使用されていることに気付くでしょう。もちろん、気を悪くしないでください。純粋な SQL でより良い解決策があるかどうかを慎重に考えてください。ただし、それらを軽視しないでください。