加入收藏 | 设为首页 | 会员中心 | 我要投稿 东莞站长网 (https://www.0769zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2021-01-12 09:10:20 所属栏目:MsSql教程 来源:网络整理
导读:背景 我正在将具有48gb RAM的Win 2008服务器上的160gb数据库从MSSQL 2008(标准)迁移到Win 2012上运行MSSQL 2012(64位网络版)的新服务器,其中包含64 GB的RAM.旧服务器正在运行且负载不足;新服务器尚未投入生产.新服务器有8个tempdb文件(每个4GB). 问题 在新服

背景

我正在将具有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 Studio在SQL 2012之前没有将其表现为明显的错误.这是一个很好的例子,说明为什么当你进行性能调优时,你必须比图形执行计划更深入.

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

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

问:如何减少泄漏?

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

(编辑:东莞站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读