1

質問があります:

Select a from tbl_abc where id in ( select id from tbl_xyz where mainid = 12)

このクエリを実行しているときは、実行に1〜2秒かかりますが、ストアドプロシージャで同じクエリを使用しているときは、次のクエリに5分以上かかります。

  If(Select a from tbl_abc where id in ( select id from tbl_xyz where mainid = 12))
    BEGIN
       -- CREATE TEMPORARY TABLE [Say: #temp1]
 #temp1 => Select a from tbl_abc where id in ( select id from tbl_xyz where mainid = 12)
      inserting the same value in the temp table
      drop #temp1
    END

これの理由は何でしょうか?どうすればこれを解決できますか?asp.netからSPを実行しています

4

3 に答える 3

3

EXISTSはあなたのためにIFを短絡させます

If EXISTS (Select a from tbl_abc where id in ( select id from tbl_xyz where mainid = 12))
    BEGIN
       -- CREATE TEMPORARY TABLE [Say: #temp1]
 #temp1 => Select a from tbl_abc where id in ( select id from tbl_xyz where mainid = 12)
      inserting the same value in the temp table

    END

ただし、tbl_abcとtbl_xyzを一度クエリしてみませんか?

   Select a
   INTO #temp1 
   from tbl_abc where id in ( select id from tbl_xyz where mainid = 12)
   IF EXISTS (SELECT * FROM #temp1) /* or use @@ROWCOUNT*/
   BEGIN
     --DoStuff
   END
   drop TABLE #temp1
于 2011-01-28T06:48:30.343 に答える
2

これを試して

declare @Count int

select @Count = count (a) from tbl_abc where id in ( select id from tbl_xyz where mainid = 12)

if(@Count > 0)
begin
   #temp1 => Select a from tbl_abc where id in ( select id from tbl_xyz where mainid = 12)
      inserting the same value in the temp table
      drop #temp1
end

私も同じ状況でこのように解決しました。

これは、クエリが2回実行されており、サブクエリが含まれていることが原因である可能性があります。このようなクエリを実行している間、内部で正確に何が起こるかわかりません。しかし、このようにクエリを変更すると、遅延するという私の問題は解決しました

于 2011-01-28T06:44:57.640 に答える
0

mainid値は実際にハードコーディングされていますか(12)、これは単なる例であり、実際には、この値をパラメーターとしてストアドプロシージャに渡していますか?(ハードコーディングされている場合は、以下を無視することをお勧めします)。

「12」が実際にパラメータである場合、パラメータスニッフィングの犠牲になる可能性があります。 ここにいくつかの有用な答えのある質問があります

言及されているが説明されていない解決策の1つは、パラメーターをマスクすることです。これを行うには、ローカル変数を宣言し、パラメーターの値に設定して、クエリで使用します。

于 2011-01-28T08:45:21.250 に答える