我有一个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
我担心性能问题,因为它必须在每个请求上执行,这可以改进还是有更好的方法......
答案 0 :(得分:2)
我建议缓存结果。填充ASP.NET cache似乎很容易,然后只要您的查询具有模糊的性能,您只需要为每个用户运行一次。
鉴于无论如何命中数据库都很昂贵,即使你有一个好的查询,在这里缓存结果也会有所帮助。
否则,您可能会考虑重构数据库以不需要CTE,可能是更简单的结构,或模仿更简单结构的索引视图。