有一个SQL Server环境,我们在其中使用Microsoft SQL Server Management Studio来执行数据分析。服务器容量为50GB,我们加载了大约8GB的' .csv'使用导入向导的数据集。价值8GB的' .csv'文件不再存储在服务器环境中。
然而,经过几天的查询和创建三个新表后,全部50GB被占用。
我尝试删除所有临时表,多次重启服务器,关闭备份,限制日志自动增长 - 一切都无济于事。
如何取回我的存储空间?或者至少弄明白什么都在使用它?
答案 0 :(得分:3)
价值8GB的'.csv'文件......
然而,经过几天的查询和创建三个新表后,全部50GB被占用。
如果您使用的是nvarchar
而不是varchar
,那么您使用的是UCS-2来存储文本数据,因此您的8GB数据就会变为16GB(我希望SQL Server本身支持UTF) -8 ...),然后有3个表,那里有48GB - 更不用说事务日志使用的空间了。
当你创建一个表,然后填充它,然后删除它,然后创建一个新表,以前占用的空间不一定被新表回收或覆盖 - 这可能是正在发生的事情。 “正常”表在关系数据库服务器中很昂贵 - 这就是内存表和临时表应该用于短暂数据的原因(我相信,尽管我没有引用,但临时表具有不同的存储行为,与普通表相比,它们的磁盘空间更加积极地回收。)
请注意,您应该使用BULK INSERT
或至少INSERT INTO ... SELECT FROM
而不是重复单个INSERT INTO ... VALUES...
语句,因为这会严重影响您的事务日志(尽管我会承认{{1} SQL Server中的1}}在处理CSV文件时没有太大的灵活性)
答案 1 :(得分:1)
在简单模式中,日志文件应自行循环,除非您有非常大的事务,否则几乎没有问题。
在完整模式中,日志会一直增长,直到您备份数据库为止。实际上,SQL Server希望保留所有日志,直到数据安全地存储在其他地方。所以,经验法则,在完整模式中,你必须备份你的数据库。
现在,当您删除记录或表时,在清理数据库之前,它不会从存储中物理删除。使用命令DBCC SHRINKDATABASE
来执行此操作。您还可以缩小特定文件,只需查找提供的各种命令。
有关更多信息:
https://docs.microsoft.com/en-us/sql/relational-databases/databases/shrink-a-database
https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-shrinkdatabase-transact-sql
https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-shrinkfile-transact-sql