在SQL Server 2012上运行大量SQL查询时系统磁盘空间不足


14

我是SQL Server 2012的新手,如果有人可以提供帮助,我将不胜感激。我已将大型数据库的副本还原到SQL Server 2012,并且尝试对它运行一些简单查询。

我试图对数据库的136898115行表运行SELECT查询。该SELECT查询只有一个简单WHERE子句。每次我运行此查询时,它都会失败,因为系统磁盘(安装Windows的分区- C:\)的空间不足(此分区只有6GB的可用空间),我不明白为什么。我将tempdb定义在另一个驱动器上,该驱动器具有14 TB以上的可用空间。当然,我的数据库也位于其他驱动器上。

是什么使我的系统分区空间不足?是页面文件吗?


2
我正在从运行SSMS的系统空间不足,但它是同一台机器。我在实际的SQL服务器上使用SSMS。
royv 2012年

2
通常,建议不要在SQL Server(不是 SSMS)Windows 机器上运行任何其他应用程序,或者确保最大内存设置足够低以允许足够的可用RAM。在这里查看我的答案:dba.stackexchange.com/a/19776/2718
乔恩·塞格尔

Answers:


12

默认情况下,SSMS查询结果缓存到C:驱动器。转到工具\选项。见附件。将其更改为具有更多存储空间的另一个卷,应该没问题。

在此处输入图片说明


1
如果选择“将结果保存到文件”,则默认情况下会打开“另存为”对话框。我不认为SSMS默认将结果集保存到磁盘,但是我可能是错的。
乔恩·塞格尔

1
您在查询窗口中获得的结果会按照我的帖子进行缓存。检查驱动器,在SSMS中运行大型查询,然后再次检查。如果没有另外指定,您将在C:驱动器上看到存储空间丢失。
埃里克·希金斯

1
确实如此。它与我的页面文件无关。我将页面文件移动到另一个驱动器,但我的C:驱动器空间不足。
royv 2012年

11

好吧,我想通了:我和埃里克都是对的!

  • 如我所说,对话框中的路径只是保存查询结果的默认路径。
  • 查询结果缓存到磁盘(我错了),但在本地配置的临时文件夹(C:\Users\<UserName>\AppData\Local\Temp在这里我的情况)。我检查了一下,似乎没有明显的方法可以关闭此缓存。

因此,要点是:

  • 避免直接在SQL框中运行SSMS
  • SELECT *除非结果集可以放入配置文件文件夹中,否则不要从SSMS中的大表中获取
  • 确保正确配置了SQL Server最大内存设置(关于页面文件增长,它可能会或可能不会导致此问题)

7

我刚刚遇到了同样的问题。阅读以上答案后,我发现了以下内容。

工具| 选项不是答案。我的设置为Y:驱动器,但是我看到查询运行,而C:驱动器上的空间从2.9GB下降到5.04MB(在我杀死查询之前)。

因此,我认为这可能是将结果缓存到Temp目录中(因为返回的行非常大,每行包含很大的XML),这是Jon所说的,但是他不确定如何更改。

我要做的更改临时文件写入位置的方法是打开我的环境变量并编辑用户变量TEMP和TMP(均设置为C:\ Temp)以写入Z:\ Temp。

我可以确认,更改之后,我看着查询在Z:\ Temp目录中创建了一个非常大的文件。


当需要执行某个过程以获取虚拟机的高清空间升级并具有大量网络存储时,这些信息非常重要。不过,我有点好奇,如果您的网络出现瓶颈,限制了文件传输速率,是否可能会超出c:\的查询性能?
GibralterTop

那是3年前,我不记得当时的确切情况。我现在有一台带有可怜的RAM和处理能力的笔记本电脑,这是另一回事了。我很确定Z:驱动器只是我的VM上的另一个“本地”驱动器。不知道为什么他们没有将其标记为D:或E:但那部分不在我的控制范围内。因此,对我而言,实际上并没有网络问题。
尼克·瑞安
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.