【发布时间】:2016-06-28 15:26:20
【问题描述】:
我一直在研究一个运行缓慢的旧审计存储过程,我在应用索引和使查询更可查询方面取得了一些成功。
但是,存储过程仍然需要一分钟多的时间才能完成。我认为问题在于临时表插入。我确实尝试将索引应用于临时表,但这只会降低性能:
表上的索引数量是最重要的因素 插入性能。表的索引越多,速度越慢 执行成为。插入语句是唯一的操作 不能直接从索引中受益,因为它没有 where 子句。
SQL 代码
我已在审核过程中的代码 sn-p 下方发布了该过程的处理时间最长,并包含了执行计划。
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
我认为瓶颈是#temp5 表,我的问题是有什么方法可以加快插入到临时表中的速度,还是有更好的替代临时表的方法?
【问题讨论】:
-
请提供执行计划的链接而不是图片
-
性能问题应该包括
EXPLAIN ANALYZE和一些关于表大小、索引、当前时间性能、期望时间等的信息。Slow是一个相对术语,我们需要一个真实的值来比较。 -
执行计划显示将数据插入临时表需要总时间的 41%。所以我认为它会在临时表中插入大量行,但看起来最终结果只有 3462 行。谁能解释一下?谢谢
-
@Ryan,您在 [Audit Register] 中使用了多少个字段?如果你使用的字段很少,你能有一个覆盖索引吗?
-
@TheGameiswar,我们如何提供执行计划的链接? (仅供参考)
标签: sql sql-server performance stored-procedures temp-tables