SQL Server 2012:排序运算符导致tempdb溢出

时间:2015-01-30 16:45:55

标签: sql-server tsql sql-tuning

我有一个T-SQL查询(SQL Server 2012)来完成这项工作,但是当我查看执行计划时,我看到一个带有警告的排序运算符:“运算符在执行期间使用tempdb来溢出数据泄漏等级为1 。“

到目前为止,我所做的阅读表明,如果我使用“order by”子句,我可以消除这种迭代器。这对我来说不是一个选项,因为我无法进行子查询排序并对最外层查询进行排序而不删除排序迭代器。

我添加了非聚集索引,以前的执行计划建议我应该这样做。

我还能做些什么来解决这个“tempdb泄漏”警告吗?我现在没有更多的想法。

感谢您的任何想法。

enter image description here

USE MIA_2014_15_v1;
GO

/*
    Notes:
    * The outer query exists so that I can filter by a windowed function (Date_Count).   
*/

SELECT q.Campus,
    q.Student_ID,
    q.Student_Name,
    q.DATEIN,
    q.TIMEIN,
    q.[TIMEOUT],
    q.Date_Count
FROM (
    SELECT TC_Hours.Campus,
        TC_Hours.[Student ID] AS Student_ID,
        Students.Student_Name,
        TC_Hours.[Date] AS DATEIN,
        TC_Hours.[Time In] AS TIMEIN,
        TC_Hours.[Time Out] AS TIMEOUT,
        count(TC_Hours.[Date]) OVER (
            PARTITION BY TC_Hours.Campus,
            TC_Hours.[Student ID],
            TC_Hours.[Date]
            ) AS Date_Count
    FROM dbo.TC_Hours_District TC_Hours
    LEFT JOIN dbo.Base__Student_Name_by_FY Students ON TC_Hours.Campus = Students.Campus
        AND TC_Hours.[Student ID] = Students.Student_ID
    WHERE (NOT students.Student_Name IS NULL)
        AND Students.FY = 'FY15'                
    ) q
WHERE q.Date_Count > 1;
GO

2 个答案:

答案 0 :(得分:3)

实际行数大于估计值。 SQL Server在执行之前授予内存,查看估计值。在运行时它会获得更多的行然后预期,因此在临时数据库中排序溢出。在这种情况下你所能做的就是确保估计值是正确的。尝试更新涉及的表的统计信息。逐个删除谓词以找到导致错误估计的谓词。您可以尝试从那里创建新统计信息。

这种泄漏并不是一件不寻常的事情。如果它不是一些非常重要的查询,我不会打扰。

答案 1 :(得分:0)

泄漏到TempDB基本上是溢出到磁盘。你可以使用你提到的sp_updatestats,但根据这篇文章中的信息,它可能比你需要的工作更多。

http://sqlperformance.com/2013/07/sql-statistics/statistics-updates

如果更新了统计信息但是通过采样,则SQL Server可能无法正确确定数据分布,并且直方图将不准确。尝试运行更新统计信息并使用WITH FULLSCAN选项。

https://www.mssqltips.com/sqlservertip/4132/correct-sql-server-tempdb-spills-in-query-plans-caused-by-outdated-statistics/