Представление в БД и производительность

Наткнулся на ужасную проблему производительности при создании представления в БД.

Ситуация такая, что в таблице, по которой работает 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

который дико бешено тормозит!

Можно ли заставить деталь сделать более простой и очевидный запрос?

Нравится

3 комментария

В подзапросе происходит выборка бизнес-процесов, привязанных к определенным обьектам, которые находяться в стадии выполнения. Скорее всего у вас эта таблица БД имеет очень большое количество записей, т.е. у вас очень много незавершенных бизнес-процессов. Проверьте количество записей в таблице EntryPoint.

Мотков Илья,

Количество записей в таблице EntryPoint равно 0. разумеется мы это проверили.

Вообще, интересно, что когда я развернул  этот запрос без exec sp_executesql и подставил параметры, всё отработало быстро. А вот с процедурой в тысячу раз медленнее.

Алексей, посмотрите планы выполнения ваших запросов. Возможно, что у вас закеширован неоптимальный план выполнения запроса с параметром. 

Показать все комментарии