gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:52:03 25 4
gpt4 key购买 nike

我一直在研究一个运行缓慢的旧审计存储过程,我在应用索引和使查询更可控制方面取得了一些成功。

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

The number of indexes on a table is the most dominant factor for insert performance. The more indexes a table has, the slower the execution becomes. The insert statement is the only operation that cannot directly benefit from indexing because it has no where clause.

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 表,我的问题是有没有办法可以加快临时表的插入速度,或者是否有更好的替代临时表的方法?

最佳答案

我猜这个问题可能有几个不同的原因。至少,假设是由于一条记录中的字段数量过多可能会导致临时堆表中的页面溢出。除此之外,tempdb 中可能存在争用,甚至速度缓慢。因此,一般建议可能是:
1. 正如已经建议的,尽量不要使用临时表。
2. 如果可能,尝试限制记录大小以适合一页。如果您可以在一页中容纳 2-3 条记录,那就更好了。
3. 如果可能,请使用带有聚集索引的“临时”表,而不是临时表。不要截断该表,只进行删除。
4. 如果使用临时表:在插入之前创建带有聚集索引的表。
5. Fallow Paul Randal 对 TempDB 的建议:http://www.sqlskills.com/blogs/paul/the-accidental-dba-day-27-of-30-troubleshooting-tempdb-contention/

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

关于SQL 性能缓慢(改进插入临时表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38080337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com