Наткнулся на ужасную проблему производительности при создании представления в БД.
Ситуация такая, что в таблице, по которой работает View очень-очень много данных. Но по ключевым полям построены индексы и если делать деталь по самой таблице, то всё ок.
Но мне потребовалась небольшая агрегация данных, я сделал View.
В итоге SELECT * FROM myView WHERE UsrMyId = '' отрабатывает мгновенно, но при создании детали на этом представлении система генерирует какой-то бешеный запрос
exec sp_executesql N'
SELECT
[myView].[Id] [Id],
...мои поля...
(
SELECT
COUNT([SubEntryPoint].[Id]) [Count]
FROM
[dbo].[EntryPoint] [SubEntryPoint] WITH(NOLOCK)
WHERE
[SubEntryPoint].[EntityId] = [myView].[Id]
AND [SubEntryPoint].[IsActive] = @P2) [SubEntryPoint]
FROM
[dbo].[myView] [myView] WITH(NOLOCK)
WHERE
[myView].[UsrMyId] = @P1
ORDER BY
[UsrServiceName] ASC OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY',N'@P1 nvarchar(32),@P2 bit',@P1=N'bc1fc0d8f6d98c04b93a8fb1070f4766',@P2=1который дико бешено тормозит!
Можно ли заставить деталь сделать более простой и очевидный запрос?
Нравится
В подзапросе происходит выборка бизнес-процесов, привязанных к определенным обьектам, которые находяться в стадии выполнения. Скорее всего у вас эта таблица БД имеет очень большое количество записей, т.е. у вас очень много незавершенных бизнес-процессов. Проверьте количество записей в таблице EntryPoint.
Мотков Илья,
Количество записей в таблице EntryPoint равно 0. разумеется мы это проверили.
Вообще, интересно, что когда я развернул этот запрос без exec sp_executesql и подставил параметры, всё отработало быстро. А вот с процедурой в тысячу раз медленнее.
Алексей, посмотрите планы выполнения ваших запросов. Возможно, что у вас закеширован неоптимальный план выполнения запроса с параметром.