2011-07-20 12 views
0

こんにちは、このTSQlスクリプトをより効率的に実行する方法があるのでしょうか?それは基本的に、アカウント名で注文する最新のアクティビティを取得し、アカウントテーブルにこれを参加させます。だからあなたはアカウントのための非常に最新の活動を得る。問題は現在22,000件の最新の活動があることです。明らかにデータの多くを通過しなければならず、私がやっていることをより効率的に行う方法があるかどうか疑問に思っています。TSQLのスピードアップ

DECLARE @pastAppointments TABLE (objectid NVARCHAR(100), account NVARCHAR(500), startdate DATETIME, tasktype NVARCHAR(100), ownerid UNIQUEIDENTIFIER, owneridname NVARCHAR(100), RN NVARCHAR(100)) 

INSERT INTO @pastAppointments (objectid, account, startdate, tasktype, ownerid, owneridname, RN) 
SELECT * FROM (
    SELECT fap.regardingobjectid, fap.regardingobjectidname, fap.actualend, fap.activitytypecodename, fap.ownerid, fap.owneridname, 
    ROW_NUMBER() OVER (PARTITION BY fap.regardingobjectidname ORDER BY fap.actualend DESC) AS RN 
    FROM FilteredActivityPointer fap 
    WHERE fap.actualend < getdate() 
    AND fap.activitytypecode NOT LIKE 4201 
) tmp WHERE RN = 1 
ORDER BY regardingobjectidname 

SELECT fa.name, fa.owneridname, fa.new_technicalaccountmanagername, fa.new_customerid, fa.new_riskstatusname, fa.new_numberofopencases, 
fa.new_numberofurgentopencases, app.startdate, app.tasktype, app.ownerid, app.owneridname 
FROM FilteredAccount fa LEFT JOIN @pastAppointments app on fa.accountid = app.objectid and fa.ownerid = app.ownerid 
WHERE fa.statecodename = 'Active' 
AND fa.ownerid LIKE @owner_search 
ORDER BY fa.name 
+0

TOP N by GROUPのようなサウンドですか? – Yuck

+0

あなたはどのバージョンのSQL Serverを使用していますか? –

+0

SQl Server 2005(残念ながら!) –

答えて

0

最初INSERTクエリからORDER BY regardingobjectidnameを削除することができます - に挿入されているテーブルの上にID列があった場合、このようなソートはINSERTクエリに必要がありますのみ(狭い)の目的です。この場合、オプティマイザが十分スマートでないと、無意味なソートが実行されます。