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 Studio在SQL 2012之前没有将其表现为明显的错误.这是一个很好的例子,说明为什么当你进行性能调优时,你必须比图形执行计划更深入. 问:为什么查询溢出到磁盘? 因为SQL Server没有授予他们足够的内存来完成其操作.也许执行计划低估了所需的内存量,或者盒子处于内存压力之下,或者它们只是大问题. (请记住,SQL Server将内存用于三件事 – 缓存原始数据页,缓存执行计划和查询工作空间.工作空间内存最终相当小.) 问:如何减少泄漏? 通过编写可搜索的T-SQL语句,拥有最新的统计信息,在服务器中放置足够的内存,构建正确的索引,以及在事情无法按预期方式解决时解释执行计划.查看Grant Fritchey’s book SQL Server Query Performance Tuning以获取所有这些的详细说明. (编辑:武汉站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |