ActionFilter属性中的CTE性能

时间:2012-03-08 06:50:36

标签: sql sql-server asp.net-mvc asp.net-mvc-3 sql-server-2008

我有一个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 个答案:

答案 0 :(得分:2)

我建议缓存结果。填充ASP.NET cache似乎很容易,然后只要您的查询具有模糊的性能,您只需要为每个用户运行一次。

鉴于无论如何命中数据库都很昂贵,即使你有一个好的查询,在这里缓存结果也会有所帮助。

否则,您可能会考虑重构数据库以不需要CTE,可能是更简单的结构,或模仿更简单结构的索引视图。