SQL子查询性能需要改进

时间:2016-02-02 12:25:00

标签: sql-server sql-server-2012

我在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

如果我们可以改进上述更新声明,请提出建议。

3 个答案:

答案 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>