SQL性能缓慢(改进插入临时表)

时间:2016-06-28 15:26:21

标签: sql sql-server performance stored-procedures temp-tables

我一直在研究一个运行缓慢的旧审计存储过程,我已经通过应用索引并使查询更加可靠而取得了一些成功。

但是,存储过程仍需要一分钟才能完成。我认为问题在于临时表插入。我确实尝试将索引应用于临时表,但这只会降低性能:

  

表上的索引数是最主要的因素   插入性能。表具有的索引越多,表越慢   执行成为。 insert语句是唯一的操作   不能直接受益于索引,因为它没有任何条款。

SQL代码

我已经在审核程序的代码片段下面发布了最长的处理时间并包含了执行计划。

SELECT dbo.[Audit Result Entry Detail].PK_ID,
  dbo.[Audit Result Entry Detail]....... 
   45-50 other columns selected from Audit Result Entry Detail 
   (Note i need to select all these)
   dbo.[Audit Register].Audit_Date,
   dbo.[Audit Register].Audit_Type,
   dbo.[Audit Register].ContextUser
 INTO #temp5

 FROM dbo.[Audit Result Entry Detail]
   INNER 
    JOIN dbo.[Audit Register]
   ON dbo.[Audit Result Entry Detail].FK_RegisterID = dbo.[Audit Register].PK_ID
   INNER 
    JOIN (
     SELECT MAX(Audit_Date) AS DATE,
         FK_RegisterID
       FROM dbo.[Audit Result Entry Detail]
      INNER 
       JOIN dbo.[Audit Register]
      ON dbo.[Audit Result Entry Detail].FK_RegisterID = dbo.[Audit Register].PK_ID
   WHERE Audit_Date >= @StartDate AND Audit_Date < DATEADD(dd,1,@EndDate)
            --WHERE ((SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, Audit_Date))) >= @StartDate 
             -- AND  (SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, Audit_Date))) <= @EndDate)
              AND part_number = @ParticipantNumber
      GROUP 
         BY FK_RegisterID
   ) dt
   ON dbo.[Audit Result Entry Detail].FK_RegisterID = dt.FK_RegisterID
  AND dbo.[Audit Register].Audit_Date = dt.[date]
  WHERE part_number = @ParticipantNumber

执行计划 Execution_Plan

我认为瓶颈是#temp5表,我的问题是他们可以加速插入临时表的方式,还是有更好的替换临时表?

感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

我想这个问题的原因可能很少。 至少,假设是因为一个记录中的大量字段可能导致Temp Heap表中的页面溢出。除此之外,tempdb中可能存在争用甚至速度缓慢。因此,一般性建议可能是:
1.如前所述,尽量不要使用临时表 2.如果可能,尝试限制记录大小以适合一页。或者甚至更好,如果你可以将2-3条记录放入一页 3.如果可能,请使用带有聚集索引的“staging”表,而不是临时表。不要截断该表,只删除 4.如果使用临时表:在插入聚集索引之前创建表。
5.休·保罗·兰达尔关于TempDB的建议:http://www.sqlskills.com/blogs/paul/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention/

为了进行更深入的故障排除,我建议在执行该查询期间捕获等待,锁,I / O,内存和CPU活动。