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) 

これに対する解決策を教えてください。

4

1 に答える 1

1

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

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

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

于 2012-04-26T20:05:56.663 に答える