2016-09-22 3 views
0

私はSQLで作成したユーザービューを外部のアプリケーションで作成しています。これは、ユーザーの勤務経験年数を雇用記録に従って返します。SQL Serverの外部適用により大きなCPU負荷が発生する

アクティビティモニター(SQLエンタープライズマネージャー)でSQLステートメントのコストを監視したところ、ビューのこの部分が実行計画のCPUコストの25%を占めていると言います。

私は、このメトリックを追加のオーバーヘッドなしでビューに持っていくより効果的な方法を試しています。 HERE

が適用されます...

SELECT * 
FROM users U <BLAH BLAH BLAH> OUTER apply 
    (SELECT COALESCE (Year(Getdate()) - Min(StartYear), 0) AS YearsWorkExp 
    FROM dbo.job_history 
    WHERE (userid = U.userid)) AS WorkExp 
+0

いずれにしても、実際には選択してからOUTER APPLY内のクエリで複数のレコードを結合していますか? will job_history(可能性一人の従業員ごとに複数のレコードがありますか? – Cato

+0

ジョインを使用できる関数を使用していない場合は、関数呼び出しに外部適用が必要です。 – ajeh

答えて

0

テストされていないが、このようなものでやってみる:

;WITH base AS 
(
    SELECT 
     userid, 
     MIN(StartYear) StartYear 
    FROM dbo.job_history 
    GROUP BY userid 
)  
SELECT u.* 
    , YEAR(GETDATE()) - ISNULL(b.StartYear, YEAR(Getdate())) AS YearsWorkExp 
FROM users u 
LEFT OUTER JOIN base b 
ON b.userid = u.userid; 
0

おそらく

userid, StartYearjob_historyテーブルにインデックスが欠落しています
create index idx_job_history_userid_StartYear on dbo.job_history (userid, StartYear) 
0

私には分かりませんが、何かが不足している可能性がありますが、あなたは何かを計算しているようです彼は(実際の仕事の経験は、私が思うのn倍を返される)が行われて、その後、すべてのレコードに参加している毎年のためのRKの経験、あなたは今の仕事の経験をしたいかもしれない場合

SELECT * 
FROM users U <BLAH BLAH BLAH> OUTER apply 
    (SELECT TOP 1 COALESCE (Year(Getdate()) - StartYear, 0) AS YearsWorkExp 
    FROM dbo.job_history 
    WHERE (userid = U.userid) ORDER BY StartYear DESC) AS WorkExp 

レコード数です COALESCE(年(GETDATE()) - MIN(StartYear)、0)SELECT YearsWorkExp AS dbo.job_history WHERE(ユーザーID = U.userid)FROM

を返し、そのために参加するように設計されて?私が何を意味するか見ていますか?

0

あなたが経験の年数を計算するには、同じ年の値を使用している場合は、なぜOUTER APPLY

に行ごとに機能 YEAR()GETDATE()を呼び出す代わりに、前にそれを計算していない
DECLARE @Yr INT = Year(Getdate()); 
SELECT * 
FROM users U <BLAH BLAH BLAH> 
OUTER apply 
(
    SELECT COALESCE (@Yr - Min(StartYear), 0) AS YearsWorkExp 
    FROM dbo.job_history 
    WHERE (userid = U.userid) 
) AS WorkExp 
0

オーバーヘッドは、COALESCE関数であります代わりにISNULL関数を使用してください ISNULL(@Yr - Min(StartYear)、0)AS YearsWorkExp

+0

ISNULLのパフォーマンスはわずかです。 COALESCEをISNULLに変更することは、ここで救世主になることはありません。 – Jens

関連する問題