Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 未说明的数据库大小_Sql Server_Database - Fatal编程技术网

Sql server 未说明的数据库大小

Sql server 未说明的数据库大小,sql-server,database,Sql Server,Database,我目前有一个20GB大小的数据库。 我已经运行了一些脚本来显示每个表的大小(以及其他非常有用的信息,比如索引),最大的表是110万条记录,它占用了150MB的数据。我们只有不到50个表,其中大多数表占用的数据不到1MB 在查看了每个表的大小之后,我不明白为什么在收缩之后数据库的大小不应该是1GB。SqlServer(2005)报告的可用空间量为0%。日志模式设置为简单。在这一点上,我主要关心的是我觉得我有19GB的未使用空间。还有什么我应该看的吗 通常情况下,我不会在意,我会把这当作一个被动的研

我目前有一个20GB大小的数据库。 我已经运行了一些脚本来显示每个表的大小(以及其他非常有用的信息,比如索引),最大的表是110万条记录,它占用了150MB的数据。我们只有不到50个表,其中大多数表占用的数据不到1MB

在查看了每个表的大小之后,我不明白为什么在收缩之后数据库的大小不应该是1GB。SqlServer(2005)报告的可用空间量为0%。日志模式设置为简单。在这一点上,我主要关心的是我觉得我有19GB的未使用空间。还有什么我应该看的吗

通常情况下,我不会在意,我会把这当作一个被动的研究项目,除非这种特殊情况要求我们每周做一次备份和恢复,以便将副本放在卫星上(卫星没有互联网,所以必须手动完成)。我更愿意每周复制1GB(甚至是5GB!),而不是20GB的数据

sp_spaceused报告如下:

Navigator-Production    19184.56 MB 3.02 MB
第二部分:

19640872 KB 19512112 KB 108184 KB   20576 KB
虽然我还发现了一些其他脚本(比如这里两个服务器数据库大小问题中的脚本),但它们都报告了上面或下面找到的相同信息。 我使用的脚本来自SqlTeam。以下是标题信息:

*  BigTables.sql
*  Bill Graziano (SQLTeam.com)
*  graz@<email removed>
*  v1.11
其余的桌子要么大小相同,要么更小。不超过50张桌子

更新1: -所有表都使用唯一标识符。通常是每行递增1的整数

  • 我还重新索引了所有内容

  • 我运行了dbccshrink命令,并在前后更新了用法。一遍又一遍。我发现一件有趣的事情是,当我重新启动服务器并确认没有人在使用它时(并且没有维护程序在运行,这是一个非常新的应用程序--不到一周的时间),当我去运行shrink时,它不时会说一些关于数据更改的信息。谷歌搜索得到的有用答案太少,显然不适用(当时是凌晨1点,我断开了所有人的连接,所以看起来不可能是真的)。数据是通过C#代码迁移的,C#代码基本上是查看另一台服务器,然后将数据带过来的。此时,删除的行数可能低于50k。即使这些排是最大的排,我想也不会超过1亿排

  • 当我通过GUI进行收缩时,它会报告0%的可用收缩率,这表明我已经将其缩小到它认为可以缩小的程度

更新2:

  • sp_spaceused的“活动”产生了以下结果(这似乎在金钱上是正确的):

    活动1143639134488KB 91072KB 41768KB 1648KB

  • 填充因子为90

  • 所有主键都是整数

  • 下面是我用来“更新”的命令:

    DBCC更新(0)

更新3:

  • 根据江户软件的要求: 图111975 2407773 19262184 图像表似乎认为这是19GB的部分。 我不明白这意味着什么。 它真的是19GB还是被误传了
更新4:

  • 与一位同事交谈时,我发现这是因为这些页面,因为这里的其他人也指出了这方面的潜力。映像表上唯一的索引是聚集PK。这是我能解决的问题还是我必须解决的问题? 常规脚本显示图像表的大小为6MB
更新5:

  • 我想在进一步研究之后,我将不得不处理它。图像大小已调整为每个大约2-5KB,在普通文件系统上不会占用太多空间,但在SqlServer上似乎占用了相当多的空间。从长远来看,真正的答案可能是将该表划分到另一个分区或类似的分区中

是否尝试使用dbcc命令来收缩目录?如果将所有数据传输到空目录,是否也是20GB


数据库使用基于页面的文件系统,因此,由于行删除量过大,您可能会遇到大量空闲(页面之间的空白):如果dbms希望在该位置插入行,则最好保持该位置处于打开状态。您是否使用具有聚集索引的基于唯一标识符的PK

在运行查询之前,您可能还需要更新SYSTABLE中的使用情况,以确保其准确无误

DECLARE @DbName NVARCHAR(128)
SET @DbName = DB_NAME(DB_ID())
DBCC UPDATEUSAGE(@DbName)

您可以尝试使用数据库真空,如果您以前从未这样做过,这通常会产生较大的空间改进


希望这有帮助。

您是否检查了“收缩数据库”对话框下的统计信息?在SQLServerManagementStudio(2005/2008)中,右键单击数据库,单击任务->收缩->数据库。这将显示为数据库分配了多少空间,以及分配的空间中有多少当前未使用。

重新索引时使用的填充因子是什么?它必须很高。从90%到100%,取决于PK数据类型。 如果你的填充因子很低,那么你会有很多无法缩小的半空页面。

尝试以下查询:

SELECT object_name(object_id)  AS name, rows,  total_pages, 
  total_pages * 8192 / 1024 as [Size(Kb)]
FROM sys.partitions p
INNER JOIN sys.allocation_units a
  ON p.partition_id = a.container_id

您是否确保您的事务日志不会占用空间?如果处于完全恢复模式,则在执行事务日志备份之前,t-log不会收缩。

如何实现数据库真空?它与收缩相同,但在其他数据库(如SQLLite和postgresqlYes)中使用该词。它被设置为简单模式,那些日志文件被压缩到一个合理的水平(1MB)。
SELECT object_name(object_id)  AS name, rows,  total_pages, 
  total_pages * 8192 / 1024 as [Size(Kb)]
FROM sys.partitions p
INNER JOIN sys.allocation_units a
  ON p.partition_id = a.container_id