Azure зависает при выполнении хранимой процедуры, которая выполняется мгновенно локально - PullRequest
0 голосов
/ 11 июля 2019

У нас есть простая хранимая процедура, которая объявляет пару переменных, устанавливает переменную из некоторого числа запросов, а затем возвращает значения.Хранимая процедура будет выполняться локально по отношению к 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...