sql-server - 未考虑数据库大小

标签 sql-server database

我目前有一个大小为 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

前几个表显示了这一点(表、行、保留空间、数据、索引、未使用等):
Activity    1143639     131 MB  89 MB   41768 KB    1648 KB 46% 1%
EventAttendance 883261      90 MB   58 MB   32264 KB    328 KB  54% 0%
Person  113437      31 MB   15 MB   15752 KB    912 KB  103%    3%
HouseholdMember 113443      12 MB   6 MB    5224 KB 432 KB  82% 4%
PostalAddress   48870       8 MB    6 MB    2200 KB 280 KB  36% 3%

其余表的大小相同或更小。不超过50 table 。

更新 1:
- 所有表都使用唯一标识符。通常一个 int 每行增加 1。
  • 我还重新索引了所有内容。
  • 我运行了 dbcc shrink 命令并更新了之前和之后的使用情况。并且一遍又一遍。我发现一件有趣的事情是,当我重新启动服务器并确认没有人在使用它时(并且没有运行维护过程,这是一个非常新的应用程序 - 不到一周),当我去运行收缩时,每个有时它会说一些关于数据改变的事情。谷歌搜索产生的有用答案太少,显然没有应用(当时是凌晨 1 点,我断开了所有人的连接,因此似乎不可能真的如此)。数据是通过 C# 代码迁移的,该代码基本上查看了另一台服务器并带来了一些东西。此时的删除数量可能在 50k 以下。即使这些行是最大的行,我想也不会超过 100M。
  • 当我通过 GUI 进行缩小时,它报告 0% 可用于缩小,这表明我已经把它缩小到它认为可以缩小的程度。

  • 更新 2:
  • sp_spaceused 'Activity' 产生这个(这似乎是正确的):

    事件 1143639 134488 KB 91072 KB 41768 KB 1648 KB
  • 填充因子为 90。
  • 所有主键都是整数。
  • 这是我用来“updateusage”的命令:

    DBCC 更新使用(0);

  • 更新 3:
  • 根据 Edosoft 的要求:
    图片 111975 2407773 19262184
    看起来好像图像表认为它是 19GB 部分。
    虽然我不明白这是什么意思。
    它真的是 19GB 还是误传?

  • 更新 4:
  • 与一位同事交谈后,我发现这是因为页面的原因,因为这里的其他人也指出了这种可能性。图像表上的唯一索引是聚集的 PK。这是我可以解决的问题还是我只需要处理它?
    常规脚本显示 Image 表的大小为 6MB。

  • 更新 5:
  • 我想我只能在进一步研究后处理它。图像已被调整为每个大约 2-5KB,在普通文件系统上不会消耗太多空间,但在 SqlServer 上它似乎消耗更多。从长远来看,真正的答案可能是将该表分成另一个分区或类似的东西。
  • 最佳答案

    试试这个查询:

    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
    

    关于sql-server - 未考虑数据库大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/358687/

    相关文章:

    C# SqlConnection 无法连接

    sql - 这种方法可以扩展 SQL 查询吗?

    mongodb - 如何在 MongoDB 中使用文档和集合之间的关系

    php - 为什么我的 php 连接到 sql 数据库代码不起作用?

    sql-server - SQL Server 2005 Express 是否足以用于开发

    SQL 字符串比较速度 'like' 与 'patindex'

    sql-server - 删除特定SQL Server架构中的所有存储过程

    database - Laravel 迁移,列类型 YEAR

    sql-server - SQL Server 渐进/复合减法?

    mysql - 使用 SQL 高效地搜索下一个(更大的)键