2012-03-08 6 views
0

ユーザーの特権をチェックするActionFilter属性があります。そのフィルタ属性では私はそれが要求ごとに実行しなければならないので、パフォーマンスの問題が心配ですこれを改善することができるか、任意のより良い方法はありCTEActionFilter属性のCTE performace

WITH Emp_CTE AS (
    SELECT DesignationID, Title 
    FROM setupDesignations 
    WHERE ReportTo ='[email protected]+' 
    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 = '[email protected]+' 
    ) tmp 

を実行しているよ...

答えて

2

私は結果をキャッシュすることをお勧めします。 ASP.NET cacheを入力するのは簡単なように思えますが、クエリのパフォーマンスがあいまいであれば、ユーザーごとに1回しか実行する必要はありません。

とにかくデータベースに負担がかかるとすれば、ここで結果をキャッシュすれば、良いクエリがあっても助けになります。

それ以外の場合は、データベースを再構築して、CTEを必要としないか、場合によってはより単純な構造、またはよりシンプルな構造を模倣するインデックス付きのビューを参照することができます。

+0

彼はリストラなしでCTEを削除できます。一般的に、CTEは常にパフォーマンスが低下します。 –