2012-04-26 11 views
1

私のストアドプロシージャでは、#temptableを使用して1つのテーブルからデータを取り出し、その結果を#temptableに更新しています。私のプロダクション環境では、このストアドプロシージャは時間を浪費している多くの時間を消費していますが、環境が低いほどこのクエリは完全に機能します。一時テーブルのためタイムアウト

CREATE TABLE #TempTable 
(
    ID int IDENTITY PRIMARY KEY, 
    TOTALPOLICY nvarchar(14), 
    SYMBOL nvarchar (3), 
    POLNUM nvarchar (7), 
    MODULE nvarchar (2), 
    LOC char (2), 
    MCO char (2), 
    LOB char (3), 
    INSUREDNAME nvarchar (100), 
    TotalPremium decimal (10,2), 
    ServiceCharges decimal (10,2), 
    TotalPaid decimal (10,2), 
    TotalRefunded decimal (10,2), 
    CurrentBalance decimal (10,2), 
    TotalBilled decimal (10,2), 
    PCO char (2) 
) 

INSERT INTO #TempTable (TOTALPOLICY,SYMBOL, POLNUM, MODULE, LOC, MCO, LOB, INSUREDNAME,TotalPremium, ServiceCharges, TotalPaid, TotalRefunded, CurrentBalance, TotalBilled, PCO) --PCR 109 SMT added PCO 
     EXEC(@sql) 

--PCR 109 Start SMT 
Update #TempTable 
    Set TotalPaid = IsNull((Select sum(PaymentAmt) 
    From SHCashActivity with (nolock) 
Where #TempTable.POLNUM = PolicyNbr 
     and #TempTable.Module = PolicyModuleNbr 
     and #TempTable.Symbol = PolicySymbolCd 
     and CashActivityTypeCd in ('P', 'C', 'N') 
     and CashAppliedStatusCd in ('1','2')), 0) 

解決策を教えてください。

+0

タイムアウトを増やす – SQLMason

+0

一時テーブルを使用しないようにクエリを再設計してください。分離レベルで許可されている限り、同じテーブルから合計を得ることができます。しかし、あなたはいくつかのインデックスを使うことができるようです。 – SQLMason

+0

私はあなたの**保存された**プロシージャに基づいて、これは(Microsoft)** SQL Server ** - 正しいと仮定していますか?もしそうなら:**どのバージョンのSQL Server? –

答えて

1

問題は一時テーブルではありません。問題はプロセスに時間がかかり過ぎることです。より受け入れやすい時間内に回答が生成されるように、プロセスを再設計します。

また、更新ステートメントは読みにくいです。また、他のテーブルのフィールドの名前と一致するSHCashActivity /#TempTableにフィールドが追加された場合にも、破損する可能性があります。テーブルエイリアスを作成し、すべてのフィールドアクセスに使用します。

また、 #TempTable(POLNUM、Module、Symbol)にインデックスXを作成する
が役立ちます。インデックス内のフィールドの正しい順序は、SHCashActivityのインデックスに依存します。

関連する問題