我一直在研究一个运行缓慢的旧审计存储过程,我在应用索引和使查询变得更加可靠的方面取得了一些成功。SQL性能缓慢(改进插入临时表)
但是,存储过程仍然需要一分钟才能完成。我认为这个问题存在于临时表插入中。我曾尝试申请一个索引到临时表,但因为这只会降低性能:
索引表上的数字是 插入性能的最主要因素。表格具有的索引越多,执行变得越慢。插入语句是 无法直接受益于索引的唯一操作,因为它没有任何子句。
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
我认为瓶颈是#temp5表,我的问题是他们的一种方法,我可以加快插入到临时表或者是有一个更好的选择到临时表?
感谢您的帮助。
请提供执行计划的链接,而不是图片 – TheGameiswar
性能问题应包括'EXPLAIN ANALYSE'和一些关于表格大小,索引,当前时间表现,期望时间等的信息。'Slow'是一个相对术语,我们需要一个真正的价值来比较。 –
执行计划显示将数据插入临时表占用总时间的41%。所以我认为它将大量的行插入到临时表中,但看起来最终结果只有3462行。任何人都可以解释吗?谢谢 – FLICKER