空白数据库的数据库架构很大。20MB

whe*_*ike 3 schema sql-server sql-server-2008-r2

仅具有架构的空白数据库很大是否正常?或者有没有办法减少初始数据库的大小?

Aar*_*and 11

如果在没有指定文件大小的情况下创建数据库,则大小将从模型映射。您可以通过运行来查看这是什么:

EXEC model.sys.sp_helpfile;
-- on my system, size of primary data file -> 3264 KB
Run Code Online (Sandbox Code Playgroud)

现在,如果我只使用 来创建一个数据库CREATE DATABASE,我就会得到这些文件的精确副本。

CREATE DATABASE [floob1];
GO
EXEC floob1.sys.sp_helpfile;
-- size of primary data file -> 3264 KB
Run Code Online (Sandbox Code Playgroud)

事后我可以尝试缩小它,它会缩小一些,但不会完全缩小。

DBCC SHRINKFILE(floob1, 1);
GO
EXEC floob1.sys.sp_helpfile;
-- size of primary data file -> 2368 KB
Run Code Online (Sandbox Code Playgroud)

所以你可以这样做,但也许你应该首先找出你的model数据库中有什么以及为什么它是 20 MB。也许您可以通过删除对象和/或缩小文件来解决此问题。如果缩小文件没有减小大小,则检查对象:

SELECT s.name, t.name, rows = SUM(p.rows)
  FROM model.sys.partitions AS p
  INNER JOIN model.sys.objects AS t
    ON p.[object_id] = t.[object_id]
  INNER JOIN model.sys.schemas AS s
    ON t.[schema_id] = s.[schema_id]
  WHERE p.index_id IN (0,1)
  ORDER BY rows DESC;

SELECT s.name, o.name, codesize = DATALENGTH(m.definition)
  FROM sys.objects AS o
  INNER JOIN sys.schemas AS s
    ON o.[schema_id] = s.[schema_id]
  INNER JOIN sys.sql_modules AS m
    ON o.[object_id] = m.[object_id]
  ORDER BY codesize DESC;
Run Code Online (Sandbox Code Playgroud)

对象可能是错误地在那里创建的(在这种情况下删除它们),或者有比它们应该多的行(在这种情况下修剪它们并重建)。

请注意,如果您尝试覆盖model并创建较小的数据库,则不能:

CREATE DATABASE [floob2]
ON (NAME = floob2_data, 
  FILENAME = 'C:\...wherever...\floob2.mdf',
  SIZE = 1MB, FILEGROWTH = 2MB);
Run Code Online (Sandbox Code Playgroud)

这会导致错误:

消息 1803,级别 16,状态 1,第 18 行
CREATE DATABASE 语句失败。主文件必须至少为 4 MB,以容纳模型数据库的副本。

我假设如果您尝试创建一个显式数据文件小于 20 MB 的数据库,您会遇到类似的错误,因为听起来您的model数据库大约为 20 MB。所以回到我之前的观点,您需要深入了解为什么model是 20 MB,然后解决这个问题。(请注意,我不知道您如何测量 20 MB - 据我所知,它可能是日志文件,因此您可能需要查看该文件。)

当然,如果空间是一个真正的问题,并且您将数千个数据库放在那里,假设它们永远不会增长,然后它们都开始增长,这将是一个问题。