我在Update语句中有这个子查询。它在执行计划中显示出一个热点。如果可以进行一些代码改进以获得性能,请建议。
--Schema of temp table.
CREATE TABLE #tmpInvestorJob (
LogID INT,
[Status] INT,
JobType VARCHAR(20)
)
CREATE CLUSTERED INDEX IX_tmpInv_Status ON #tmpInvestorJob ([Status]);
----#TempTimeline has less than 10 records but has lot of columns.
----#tmpInvestorJob has lots of data inside and is main reason for the slowness.
UPDATE g
SET Completed = ISNULL(a.Completed, 0)
FROM #TempTimeline g
JOIN (
SELECT LogID,
COUNT(1) 'Completed'
FROM #tmpInvestorJob
WHERE [Status] = 3
GROUP BY LogID
) a ON a.LogID = g.LogID
如果我们可以改进上述更新声明,请提出建议。
答案 0 :(得分:1)
您可以在表#tmpInvestorJob中为LogID放置一个索引。
这应该会提高性能,因为它只计算表之间匹配的行。它应该快得多,因为#TempTimeline中只有几行。
UPDATE g
SET
Completed = COALESCE(a.Completed, 0)
FROM #TempTimeline g
-- using outer apply in case no matches are found to set completed to 0
OUTER APPLY
(
SELECT COUNT(*) Completed
FROM #tmpInvestorJob
WHERE
[Status] = 3
and LogID = g.LogID
) a
答案 1 :(得分:1)
如果您拥有SQL Server企业版,则可以创建过滤索引。
CREATE INDEX IX_tmpInvestorJob_LogID_Filtered
ON #tmpInvestorJob (LogID)
WHERE Status = 3
如果您使用标准版并且这是非常重要的查询,我会建议使用状态索引。它不是非常有选择性,但无论如何这个查询最终会使用Index Scan。但请考虑索引如何影响数据修改操作。
CREATE INDEX IX_tmpInv_Status_LogID_Filtered
ON #tmpInvestorJob (Status, LogID)
此查询最终将使用索引扫描,因为没有过滤器#TempTimeline。加班你将有很多Status = 3的条目(除非你清理),所以查询将变得低效。您需要找到一种在#TempTimeline表上应用过滤器的方法。已完成的列包含完整作业的数量,因此可用于过滤,但您可能有另一列来限制记录集。
另一种选择是考虑一个索引视图,如果您将数据存储在永久表而不是临时表中,它将保存聚合摘要:
CREATE VIEW dbo.vwInvCompletedJobStats
WITH SCHEMABINDING
as
SELECT LogID, COUNT(*) Completed
FROM #tmpInvestorJob /* permanent table name*/
WHERE [Status] = 3
GO
CREATE UNIQUE CLUSTERED INDEX IX_vwInvCompletedJobStats_LogID
ON dbo.vwInvCompletedJobStats (LogID)
GO
并将该视图用于更新源。确保在其他操作上测试索引视图的效果。
答案 2 :(得分:0)
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/>
<div class="jumbotron">
<div class="container container-fluid">
<div class="row">
<div class="col-md-12 midden ">
<ol>
<li><a href="#" role="button">Contact</a></li>
<li><a href="#" role="button">Work</a></li>
</ol>
</div>
</div>
<div class="row">
<div class="col-md-3-offset-3">
<h1>Noah Wallaart</h1>
</div>
<div class="col-md-6">
</div>
</div>
</div>
</div>