【问题标题】:Timeout because of temp table由于临时表而超时
【发布时间】:2012-04-26 19:02:58
【问题描述】:

在我的存储过程中,我使用#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) 

请告诉我什么可以解决这个问题。

【问题讨论】:

  • 我认为您应该考虑重新设计查询以不使用临时表。只要您的隔离级别允许,您就可以在查询时从同一个表中获取总和。但看起来你可以使用一些索引。
  • 我假设 - 根据您的 stored 过程,这是针对(Microsoft)SQL Server - 对吗?如果是这样:哪个版本的 SQL Server??
  • 如果这在您的开发/测试环境中完美运行,但不适用于生产环境,我的第一个预感是:生产系统是否有更多的数据行?如果是这样:检查您的索引!最有可能的是,只有少数行,它在您的开发环境中运行良好 - 但在生产环境中,有大量数据,您需要微调查询以获得最佳速度。

标签: sql-server stored-procedures timeout


【解决方案1】:

问题不在于临时表。问题是这个过程耗时太长。重新设计您的流程,以便在更可接受的时间内生成答案。

另外,您的更新声明很难阅读。如果向 SHCashActivity/#TempTable 添加与另一个表中的字段名称匹配的字段,它也容易受到破坏。创建表别名并将它们用于所有字段访问。

另外, 在 #TempTable(POLNUM、模块、符号)上创建索引 X
会有所帮助。索引中字段的正确顺序将取决于 SHCashActivity 上的索引。

【讨论】:

    猜你喜欢
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    相关资源
    最近更新 更多