2011-07-15 24 views
2

CLRストアドプロシージャにSQL Server 2008とC#を使用しています。大きなオブジェクトをメモリに保存し、ストアドプロシージャの2回目の呼び出し後にこのオブジェクトを取得する方法はありますか?CLRストアドプロシージャとメモリ内のオブジェクト

2番目の呼び出しでは、この大きなオブジェクトのデータをできるだけ早く取得する必要があります。このオブジェクトはテーブルのようなものです。

方法がない場合は、シリアライズについて考えていました。あるいは、プロセスをスピードアップするために何かを自分で実装しようと考えていました。どう思いますか?

ありがとうございます!

+0

temp dbのtemp内のblobにシリアル化するのはどうでしょうか? –

答えて

1

最も簡単な方法は、ファイルのどこかにシリアル化することです。私はこの記憶をクリアする時期については何も言われていないので、それを記憶に保持しません。

ファイルアクセスに関するいくつかの記事がここにあります

http://social.msdn.microsoft.com/Forums/en-US/sqlnetfx/thread/45b46ce0-a4b3-45d0-86ec-1c1638fb7cb2

これは、テーブルのような構造であれば、別の簡単かつおそらく高速に十分な方法は、CLRという一時テーブルを作成することですデータリーダーを使用しないで選択できます。個人的に私はこのルートに行き、それが他のルートを取る前に十分に速くないことを証明します。

+0

シリアライズされたファイルからの読み込みは、SQLテーブルからデータを読み込むよりも速いと思いますか? – Dan

+0

必ずしも高速アクセスである場合とそうでない場合があります。 SQLがキャッシュできれば、データベースのテーブルからの読み込みが高速になる可能性があります。 –

1

オブジェクトをSQL Server内のメモリに格納する唯一の方法は、静的フィールドに配置することです。これはうまくいくが、そのためには、スレッドセーフであり、寿命が正しく管理されるように、比較的トリッキーなコードを書く必要がある。 SQL Serverの下では、clr appdomainは基本的に任意の時点でアンロードおよび再生成される可能性があるため、これを考慮するには慎重でなければなりません。同じアセンブリに複数のappdomainが同時に存在する可能性もありますが、ddl操作中に異なるクエリ要求を処理します。

Adam Machanicは、静的フィールドをキャッシュとして使用することの意味とセキュリティに関連するベストプラクティスについて、articleと書いています。

+0

ありがとうございます。私は少し手を差し伸べる必要がある! – Dan

+0

SQL CLRでは、セーフオプションを使用せずにアセンブリが登録されている場合にのみ、静的フィールドを使用できます。 –

+0

これは厳密には当てはまりません。静的フィールドは、読み取り専用またはCompilerGenerated属性の装飾のマークが付いている場合、安全なアセンブリで使用することができます。静的なチェックは、厳しい要件よりも、「あなたがやっていることを知っていますか?」のガイドラインです。 – stevehem

関連する問題