微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.jb51.cc/mssql/80076.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐