Наткнулся на ужасную проблему производительности при создании представления в БД.
Ситуация такая, что в таблице, по которой работает 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 и подставил параметры, всё отработало быстро. А вот с процедурой в тысячу раз медленнее.
Алексей, посмотрите планы выполнения ваших запросов. Возможно, что у вас закеширован неоптимальный план выполнения запроса с параметром.