Разное время выполнения для одного и того же запроса - SQL Server - PullRequest
1 голос
/ 28 января 2011

У меня есть запрос:

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

в чем может быть причина этого? и как я могу решить это? Я запускаю SP с asp.net

Ответы [ 3 ]

3 голосов
/ 28 января 2011

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
2 голосов
/ 28 января 2011

попробуйте

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

У меня тоже была такая же ситуация, и я решил ее следующим образом.

это может быть связано с тем, что запрос выполняется два раза и содержит подзапрос. не знаю, что именно происходит внутри при выполнении запроса, подобного этому. но изменение запроса решило мою проблему задержки

0 голосов
/ 28 января 2011

Является ли значение mainid действительно жестко запрограммированным (12), или это просто пример, и в действительности вы передаете это значение в свой сохраненный процесс в качестве параметра? (Если он жестко запрограммирован, вы можете игнорировать следующее).

Если «12» влияет на параметр, вы можете стать жертвой перехвата параметров. Вот вопрос с некоторыми полезными ответами .

Одним из упомянутых, но не объясненных решений является маскировка параметров - сделайте это, объявив локальную переменную, установив для нее значение вашего параметра, и используйте это в своем запросе.

...