2010-11-26 21 views
0

SQL Server 2008では、複雑なクエリを実行するストアドプロシージャがあります。私は結果をテンポラリテーブル(システムテンポラリテーブルではなく手動で管理されたテーブル)に書きます。動的SQLを使用しない動的参照テーブル

表の名前は、ユーザーのWebセッションIDの文字列表現です。これは並行性の問題を解決します。これはストアドプロシージャに渡され、テーブルが作成されます。クリーンアップするには、名前がタイムスタンプと共にメンテナンステーブルに記録されます。

ただし、名前は明らかに動的です。複雑なクエリのコンパイルを妨げるので、私は動的SQLを使いたくありません。私は、これは物事を推進している知っているが、次のように私は何を探していますは、次のとおりです。

DECLARE @TableName varchar(100) 
SET @TableName = CAST(@SessionID AS varchar) 

INSERT INTO @TableName 
SELECT....{complex query} 

私はこれをどのように行うことができますか?

さらに詳しい情報:

レコードセットは、数十行(IDのみ)何千ものである可能性があります。ユーザーはこのレコードセットにさらにフィルタリングを適用して、それを減らすことができます。したがって、サーバー上のテーブルでなければなりません。

答えて

1

テンポラリテーブルを作成するのではなく、レコードを一意にするフィールドとしてセッションIDを含めるのはなぜですか?

+0

ちょっとしたトリックと組み合わせて、私は昨日試しましたtは素晴らしい考えです。 (セッションID、UID)をPK&RIDとしてCol3として作成し、UIDはIDENTITY(1,1)です[これはトリックです]。パフォーマンスの観点から考えると、あなたのアイデアは、専用のテーブルよりも高速ではないにせよ、メンテナンスとアクセスが簡単になります。私はそれが好きです。 – IamIC

1

コンパイル時に何も知らないテーブルを使ってクエリをどのようにコンパイルしますか?私が知る限り、あなたがしたいことはできません。

セッションIDをキーにしたテーブルのXMLフィールドに結果を格納するなど、ユーザー/セッション/結果セットごとに1つの行を格納するなど、他のソリューションを探してみませんか?

また、データを.NETに戻してSessionに直接格納することもできます。どのセッションプロバイダを使用しているかによって、これがうまくいくかどうかによって異なります。

結果を一時ファイルに保存し、タイムスタンプ付きの単一のテーブルでファイルを追跡し、頻繁にバッチジョブを実行して古いセッションまたは非アクティブなセッションからファイルを削除することもできます。

OK: "詳細情報" に基づいて

を追加しました。 「時期尚早最適化」カードを再生する時間。 :)

既存のソリューションは既に低すぎますか?大きな結果セットをキャッシュせずに効率化する方法を見てきましたか?

あなたが持っていると仮定します:いくつのユーザー/セッションが必要ですか?これらのIDは、孤立してキャッシュされるとどのように使用されますか?彼らは彼らが彼らのための最善の場所が静的な名前を持つテーブルにあることを意味する、それ以降のクエリに必要なように聞こえる。

私の提案は:create table tempResults(session_id guid, other_id int)のような関連テーブルにすべての結果を保存することです。次に、このテーブルへの結合を他のクエリにハードコードすることができます。

+0

"SELECT FROM"は固定部分なので、コンパイルできます。 "INSERT INTO"のみが動的です。文字通りQUERYは修正されていますが、変更内容に結果を書き込むだけです。レコードセットは数万行になる可能性があるため、セッション変数には適していません。一時ファイルはアイデアです! – IamIC

+0

ああ、一時ファイルの問題は、ユーザーがレコードセットを減らすフィルタリングを適用できるかどうかです。したがって、サーバー上のテーブルでなければなりません。 – IamIC

+0

意味がある、私はそれに応じて私の答えを更新しました。 – mlibby

1

最初に複雑なクエリを#tempテーブルに挿入してから、dynamic sqlを使用して後でtableという名前のsessionIDに挿入することができます。

select ... 
into #temp 
....{complex query} 

set @sql = 'select * into ' + @tablename + ' from #temp' 
exec (@sql) 
+0

サーバーに大きな影響を与えずに何十万ものレコードを処理し、 "二重書き込み"のためにスピードを特に損なうことはありません – IamIC

関連する問題