2016-10-17 5 views
0

私は一連の質問をUNIONと一緒にしています。各クエリには同じIDリストと比較するWHERE... IN句があります。ストアドプロシージャで繰り返し使用されるサブクエリの結果をキャッシュできますか?

SELECT * FROM MyTable 
WHERE AuthorUserId IN (SELECT UserId FROM Users WHERE TeamId = @teamId) 

UNION 

SELECT * FROM MyTable 
WHERE PublisherUserId IN (SELECT UserId FROM USERS WHERE TeamId = @teamId) 

UNION... 

など:それはこのようになります例の目的のために簡略化した形で

@teamIdは、intストアドプロシージャパラメータです。

ので、それは各SELECTのためにそれを取得しない

SELECT UserId FROM USERS WHERE TeamId = @teamId 

の結果セットを保持するために、SQL Serverを伝える方法はありますか?

+1

あなたは一時テーブルに挿入し、そのに対してクエリ...またはあなたがサブクエリの結果は、一般的なクエリキャッシュに入っていることを願ってい可能性ができました。 –

答えて

2

一つの方法は、そのクエリの結果をキャプチャし、一時テーブルに格納することであり、そしてJOINはINGの一時テーブルに格納し、その後、一時テーブルからそれを照会することですクエリでそれらの結果に:

Declare @UserIds Table (UserId Int) 

Insert @UserIds (UserId) 
SELECT UserId 
FROM Users 
WHERE TeamId = @teamId 

SELECT M.* 
FROM MyTable  M 
JOIN @UserIds U ON M.AuthorUserId = U.UserId 

UNION 

SELECT M.* 
FROM MyTable  M 
JOIN @UserIds U ON M.PublisherUserId = U.UserId 

UNION... 
+0

例から 'UNION'を取り除くことができると思いますが、それは元のものよりずっと単純化しているからです。 – Legion

+0

@Legion私はちょっと考えました - それほど確信が持てませんでしたので、私はちょうどその場合にそれを投げたいと思っていました。 – Siyual

+1

一時変数ではなく、TABLE変数を表示しています。かなりの違いがあります。その1つは、TABLE変数に対するクエリが通常より遅いということです。 SQL Serverの一時テーブルとテーブル変数の違いは何ですか?(https://dba.stackexchange.com/a/16386/65699)を参照してください。 –

0

SQLサーバーは、パラメーターが同じ場合、同じ照会の結果を格納するのに十分なほどスマートです。サブクエリがセッション変数を使用していない場合は、問題ありません。 TeamIdにインデックスを付けることで、このクエリを高速化することもできます。

まだそれが心配で、プログラミング言語を使用してSPからデータを取得する場合は、変数にコードで格納し、その結果セットをSPに渡す必要があります。

2番目のオプションは、あなたがこれを行うことができます