パフォーマンス上の理由から、SQL 2008 R2 テーブル (64 ビット プラットフォームで実行) のデータを暗号化するために使用している C#.Net スタンドアロン DLL を作成しました。通過する行が多数ある可能性があるため、これは非常にメモリを集中的に使用する可能性があります。
これをアセンブリ/関数として SQL CLR と統合しましたが、すべて正常に動作しています。
このアセンブリは Permission_Set'UNSAFE' で実行されていますが、マネージ アセンブリとして実行されています (sys.dm_clr_loaded_assemblies によって報告されています)。
MS Process Explorerでメモリ使用量を監視しており、関数が呼び出されるたびにメモリ使用量が増加していますが、解放されていません。
MSDN のドキュメントを読むと、AppDomain は関数から返されたデータを将来の効率のためにキャッシュします。アセンブリをアンロードすると、メモリが解放されます。
いくつかの質問を聞きたいんです:
- AppDomain をアンロードせずに「フラッシュ」する方法はありますか?
- 「Dispose」としてマークされた DLL のすべてのオブジェクトは、GC によってクリーンアップされますか?
- (そしてこれは明らかに上記に関連しています!) GC は SQL Server プロセス空間もカバーしますか?
オンライン ドキュメントは SQL CLR やメモリなどについてあまり明確ではないため、上記のヘルプをいただければ幸いです。
ありがとう :)