sql-server – 为什么查询导致溢出到tempdb?

前端之家收集整理的这篇文章主要介绍了sql-server – 为什么查询导致溢出到tempdb?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
背景

我正在将具有48gb RAM的Win 2008服务器上的160gb数据库从MSsql 2008(标准)迁移到Win 2012上运行MSsql 2012(64位网络版)的新服务器,其中包含64 GB的RAM.旧服务器正在运行且负载不足;新服务器尚未投入生产.新服务器有8个tempdb文件(每个4GB).

问题

在新服务器上进行测试时,我看到许多查询中的步骤导致警报提到“运算符在执行期间使用tempdb溢出数据”.我已经能够通过重写一些查询来避免排序,但这并没有真正解决这个问题.旧服务器上的相同查询不会导致溢出.我已经读过当MSsql无法在内存中完成操作并且必须溢出/分页到tempdb时发生溢出.我应该关注泄漏吗?

例子

我在数据库上运行了sp_updatestats,因此统计信息应该是最新的,但您会注意到估计行数和实际行数之间存在一些差异.

记忆关注

我为64gb中58的MSsql设置了最大内存设置.目前,MSsql消耗了大约35GB的内存,但其工作集只有682mb.旧服务器(虽然在生产中,处理负载)有44GB的内存提交给MSsql,其中43.5gb在其工作集中.

我不知道泄漏是否与记忆设置有关 – 任何人都有任何想法? MSsql目前有大量的RAM可供使用,那么为什么它会溢出到某些类型和哈希匹配的tempdb?

解决方法

这里有几个不同的问题:

问:为什么以前的查询没有溢出?

他们是,但是sql Server Management Studiosql 2012之前没有将其表现为明显的错误.这是一个很好的例子,说明为什么当你进行性能调优时,你必须比图形执行计划更深入.

问:为什么查询溢出到磁盘?

因为sql Server没有授予他们足够的内存来完成其操作.也许执行计划低估了所需的内存量,或者盒子处于内存压力之下,或者它们只是大问题. (请记住,sql Server将内存用于三件事 – 缓存原始数据页,缓存执行计划和查询工作空间.工作空间内存最终相当小.)

问:如何减少泄漏?

通过编写可搜索的T-sql语句,拥有最新的统计信息,在服务器中放置足够的内存,构建正确的索引,以及在事情无法按预期方式解决时解释执行计划.查看Grant Fritchey’s book SQL Server Query Performance Tuning获取所有这些的详细说明.

原文链接:https://www.f2er.com/mssql/80076.html

猜你在找的MsSQL相关文章