Rya*_*vin 8 sql sql-server performance stored-procedures temp-tables
我一直在研究运行缓慢的旧审核存储过程,通过应用索引并使查询更可查询,我取得了一些成功。
但是,存储过程仍需要一分钟以上才能完成。我认为问题出在临时表插入。我确实尝试将索引应用于临时表,但这只会降低性能,因为:
表上索引的数量是影响插入性能的最主要因素。表具有的索引越多,执行速度就越慢。插入语句是唯一不能直接从索引中受益的操作,因为它没有where子句。
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
Run Code Online (Sandbox Code Playgroud)
我相信瓶颈是#temp5表,我的问题是有没有一种方法可以加快插入到temp表的速度,还是有比temp表更好的替代方法?
小智 8
我猜可能是由几种不同的原因引起的。至少,假设是由于一条记录中的字段数量过多,可能导致Temp Heap表中的页面溢出。除此之外,tempdb中可能存在争用,甚至速度很慢。因此,一般的建议可能是:
1.如已经建议的,请尝试完全不使用临时表。
2.如果可能,请尝试限制记录大小以适合一页。甚至更好,如果您可以将2-3条记录放入一页中。
3.如果可能,请使用上面带有聚集索引的“ staging”表,而不要使用temp表。不要截断该表,只能删除。
4.如果使用临时表:在插入之前创建表,并在上面带有聚簇索引。
5. Paul Randal关于TempDB的建议:http://www.sqlskills.com/blogs/paul/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention/
为了进行更深入的故障排除,我建议在执行该查询的过程中捕获等待,锁定,I / O,内存和CPU活动。