У нас есть простая хранимая процедура, которая объявляет пару переменных, устанавливает переменную из некоторого числа запросов, а затем возвращает значения.Хранимая процедура будет выполняться локально по отношению к sql express (2017) в течение .5s.Локальная база данных - это полная производственная резервная копия, которая была восстановлена локально с теми же данными, что и производственная.
Когда мы выполним хранимую процедуру для той же базы данных в Azure, запрос будет заблокирован и будет выполняться бесконечно.
Я попытался выполнить каждый оператор выбора (приведенные ниже операторы с выбранным счетчиком (отличным ..), и каждый оператор будет выполняться в SQL Azure и вернет счет надлежащим образом примерно через 1 с, однако при попытке использоватьобъявите или, если я попытаюсь выполнить выборки в моей хранимой процедуре, как показано ниже, они не будут завершены. Следующий код просто не завершит выполнение в Azure
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [MySchema].[UserCounts] (
@HUserCount int out
,@NUserCount int out
) as
set @HUserCount = (
select count(distinct userTable.Id) as UserCount
from [MySchema1].[Active] active with (nolock)
inner join [MySchema2].[UserActive] userTable with (nolock) on active.UserId = userTable.Id
inner join [MySchema2].[AppSession] appSession with (nolock) on appSession.UserId = userTable.Id
where appSession.ComponentId = '1'
)
set @NUserCount = (
select count(distinct userTable.Id) as SUserCount
from [MySchema1].[Active] active with (nolock)
inner join [MySchema2].[UserActive] userTable with (nolock) on active.UserId = userTable.Id
inner join [MySchema2].[AppSession] appSession with (nolock) on appSession.UserId = userTable.Id
where appSession.ComponentId = '2'
)
Приведенный выше код будет зависать / время ожидания, когдаЯ выполняю процедуру. Кроме того, если я просто извлекаю код из хранимой процедуры, он также не сможет завершиться / время ожидания. Вот аналогичный код, который истечет время ожидания.
declare @HUserCount int
declare @NUserCount int
select @HUserCount = (
select count(distinct userTable.Id) as UserCount
from [MySchema1].[Active] active with (nolock)
inner join [MySchema2].[UserActive] userTable with (nolock) on active.UserId = userTable.Id
inner join [MySchema2].[AppSession] appSession with (nolock) on appSession.UserId = userTable.Id
where appSession.ComponentId = '1'
)
select @NUserCount = (
select count(distinct userTable.Id) as SUserCount
from [MySchema1].[Active] active with (nolock)
inner join [MySchema2].[UserActive] userTable with (nolock) on active.UserId = userTable.Id
inner join [MySchema2].[AppSession] appSession with (nolock) on appSession.UserId = userTable.Id
where appSession.ComponentId = '2'
)
Следующий код будет выполняться, как ожидаетсяв Azure
select count(distinct userTable.Id) as UserCount
from [MySchema1].[Active] active with (nolock)
inner join [MySchema2].[UserActive] userTable with (nolock) on active.UserId = userTable.Id
inner join [MySchema2].[AppSession] appSession with (nolock) on appSession.UserId = userTable.Id
where appSession.ComponentId = '1'
А также
select count(distinct userTable.Id) as SUserCount
from [MySchema1].[Active] active with (nolock)
inner join [MySchema2].[UserActive] userTable with (nolock) on active.UserId = userTable.Id
inner join [MySchema2].[AppSession] appSession with (nolock) on appSession.UserId = userTable.Id
where appSession.ComponentId = '2'
Я что-то упускаю из виду? В таблицах не так много строк, может быть, 50 000 или меньше, что почти ничего не значит для SQLСервер.
РЕДАКТИРОВАТЬ / ОБНОВИТЬ И ВРЕМЕННОЕ РЕШЕНИЕ ДЛЯ СЕЙЧАС
В качестве временного решения я изменил сохраненный процесс так, чтобыон не использует операторы set, за которыми следует выбор счетчика (отличный ... Кажется, что счетчик выбора (отличный выполняется нормально как отдельный оператор, но не работает должным образом, когда он идет после оператора набора, который устанавливает переменную в результатсчетчик выбора (отличный ..
Вот итоговый / рабочий код и измененная процедура
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [MySchema].[UserCounts] (
@HUserCount int out
,@NUserCount int out
) as
select distinct userTable.Id into #UserCount
from [MySchema1].[Active] active with (nolock)
inner join [MySchema2].[UserActive] userTable with (nolock) on active.UserId = userTable.Id
inner join [MySchema2].[AppSession] appSession with (nolock) on appSession.UserId = userTable.Id
where appSession.ComponentId = '1'
set @HUserCount = (select count(*) from #UserCount)
select distinct userTable.Id into #SUserCount
from [MySchema1].[Active] active with (nolock)
inner join [MySchema2].[UserActive] userTable with (nolock) on active.UserId = userTable.Id
inner join [MySchema2].[AppSession] appSession with (nolock) on appSession.UserId = userTable.Id
where appSession.ComponentId = '2'
set @NUserCount = (select count(*) from #SUserCount)
DROP TABLE #UserCount
DROP TABLE #SUserCount