2

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

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

我在以前的执行计划建议的地方添加了非聚集索引。

我还能做些什么来解决这个“tempdb 溢出”警告吗?在这一点上,我没有更多的想法。

谢谢你的任何想法。

在此处输入图像描述

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
4

2 回答 2

4

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

这样的泄漏并不是什么不寻常的事情。如果它不是一些超级重要的查询,我不会打扰太多。

于 2015-01-30T19:56:24.760 回答
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/

于 2016-01-25T05:19:49.737 回答