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

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

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 ответа

Решение

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

Попробуй это

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

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

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

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

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

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

Другие вопросы по тегам