2011-12-07 21 views
0

Caching SQL queriesの回答に満足できません。一般的な方法でSQLクエリの結果をシリアル化および逆シリアル化する方法

私は第三者のソリューションに興味がありません。なぜなら、これは自分で解決するのは簡単な問題だからです。

私はCaching of Linq queriesの代替ソリューションを探していますが、Linqだけでなく、どのSQLクエリでも動作します。理想的な解決策は、execsql @ Sql、@ HashCodeのようなストアドプロシージャを持つことです.HashCodeは、シリアライズされた結果のテーブルをHashCodeで照会し、存在する場合は結果を返し、そうでない場合はクエリを実行し、結果のテーブルにシリアル化された結果を保存して返します。もちろん、返される結果は、格納されていない場合と同じ構造でなければなりません。

このコンテキストでは、キャッシュの有効期限切れ/ガベージ・クリーニングやその他のパフォーマンスの問題については心配しないでください。

これを行うには、SQLクエリのハッシュコードを検出できるようにする必要があります(SQLクエリ文字列にGetHashCodeがあるとします)、クエリ結果をシリアル化してデシリアライズします。

クエリの結果が異なる構造になっていることを考慮すると、FOR XML AUTOの利用率がシリアル化の候補になると思います。しかし、コードを結果構造に依存しないように汎用的に非直列化する方法はありますか?

解決策は、必要に応じてSQL 2008機能を使用できます。

+0

キャッシュは解決するためには問題になるはずです...。解決するのが最も困難な問題の –

答えて

1

あなたは可能性があり、そのような本(ストアドプロシージャ、それはあなたのテーブルの機能を待っていますし、あなたのパラメータは連結:

CacheService(tableFunctionName,parametersConcat) 

IF(there_is_no_cache_table) 
BEGIN 
    execsql "SELECT * , "+parametersConcat+" as parametersConcat INTO cache_tableFunctionName "++" FROM dbo."+tableFunctionName+"("+parametersConcat+")" 
END 
ELSE IF(there_is_no_cache_entry_for_this_function_and_parameters) 
BEGIN 
    execsql "INSERT INTO cache_"+tableFunctionName+" SELECT * , "+parametersConcat+" FROM dbo."+tableFunctionName+"("+parametersConcat+")" 
END 
ELSE 
BEGIN 
    execsql "SELECT * FROM cache_"+tableFunctionName+" WHERE parametersConcat ='"+parametersConcat+"'" 
END 

EDIT:SQLインジェクションとすべてについて注意してくださいこれはちょうどスターター

です

EDIT 2:キャッシュエントリの作成日を追加すると、削除できるようになる場合があります。

+0

この場合、ROW_NUMBER() OVERを使わないでhttp://stackoverflow.com/questions/4810627/sql-server-2005-row-number-without-overは並べ替えをシリアライズするのに便利です。 – alpav

+0

ROW_NUMBER()OVER(ORDER BY(SELECT 1))について間違っていました。ソートが保持されず、一意の列が追加されます。 ORDER BYをOVERに抽出して注入する必要があります。 – alpav

+0

@alpav他の人が気に入るように実装を投稿できますか? –

関連する問題