Разное время выполнения для одного и того же запроса - 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. Вот вопрос с некоторыми полезными ответами.
Одним из упомянутых, но не объясненных решений является маскировка параметров - сделайте это, объявив локальную переменную, установив для нее значение вашего параметра, и используйте это в своем запросе.