Производительность CTE в атрибуте ActionFilter - PullRequest
0 голосов
/ 08 марта 2012

У меня есть атрибут ActionFilter, который проверяет привилегии пользователя.В этом атрибуте фильтра я использую CTE

WITH Emp_CTE AS (
     SELECT DesignationID, Title
     FROM setupDesignations
     WHERE ReportTo ='+@PositionID+'
    UNION ALL
     SELECT d.DesignationID, d.Title
     FROM setupDesignations d
     INNER JOIN Emp_CTE ecte ON ecte.DesignationID = d.ReportTo
    )
    Select COUNT(*) from 
    ( 
    SELECT distinct SPOID from mktDoctorSPOs where SPOID IN (Select DesignationID from Emp_CTE) 
     UNION
    SELECT SPOID from mktDoctorSPOs where SPOID = '+@PositionID+'
    ) tmp

Я обеспокоен проблемами с производительностью, так как он должен выполняться при каждом запросе, может ли это быть улучшено или есть какой-то лучший способ ...

1 Ответ

2 голосов
/ 08 марта 2012

Я бы предложил кэшировать результаты. Казалось бы, достаточно просто заполнить кэш ASP.NET , и тогда, пока ваш запрос имеет достаточно приличную производительность, вам нужно будет запускать его только один раз для пользователя.

Учитывая, что попадание в базу данных в любом случае дорого, кэширование результатов здесь поможет, даже если у вас есть хороший запрос.

В противном случае вы можете посмотреть на реструктуризацию базы данных, чтобы не требовать CTE, возможно, более простой структуры или индексированного представления, которое имитирует более простую структуру.

...