2012-04-26 73 views
1

在我的存儲過程中,我使用#temptable從一個表中獲取數據並更新該結果的#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 2012-04-26 19:06:57

+0

我認爲你應該看看重新設計你的查詢不使用臨時表。只要您的隔離級別允許,您可以從同一張表中查詢相同的表格。但看起來你可以使用一些索引。 – SQLMason 2012-04-26 19:10:14

+0

我假設 - 基於你的**存儲**程序,這是(Microsoft)** SQL Server ** - 正確的?如果是這樣的話:**哪個版本的SQL Server? – 2012-04-26 19:26:14

回答

1

問題不在臨時表中。問題是這個過程需要很長時間。重新設計您的流程,以便在更可接受的時間內生成答案。

此外,您的更新聲明很難閱讀。如果將字段添加到與其他表中的字段名稱相匹配的SHCashActivity /#TempTable中,它也容易受到破壞。創建表別名並將其用於所有字段訪問。

此外, 創建#TempTable(POLNUM,模塊,符號)指數X
會有所幫助。索引中字段的正確順序取決於SHCashActivity上的索引。