我有一个非常大的prod数据库。我需要复制这个数据库来创建一个测试环境,但是没有足够的磁盘空间。获取表格列表的总大小
但实际上不需要从包含用户数据的表中复制行,只有那些描述功能的表是必需的。对于包含用户数据的表,我只需要复制表“description”(列,索引,触发器...)。
如何(使用什么查询)我可以估计没有来自某些表的数据的数据库的大小?
我有一个非常大的prod数据库。我需要复制这个数据库来创建一个测试环境,但是没有足够的磁盘空间。获取表格列表的总大小
但实际上不需要从包含用户数据的表中复制行,只有那些描述功能的表是必需的。对于包含用户数据的表,我只需要复制表“description”(列,索引,触发器...)。
如何(使用什么查询)我可以估计没有来自某些表的数据的数据库的大小?
SET NOCOUNT ON
DBCC UPDATEUSAGE(0)
-- DB size.
EXEC sp_spaceused
-- Table row counts and sizes.
CREATE TABLE #t
(
[name] NVARCHAR(128),
[rows] CHAR(11),
reserved VARCHAR(18),
data VARCHAR(18),
index_size VARCHAR(18),
unused VARCHAR(18)
)
INSERT #t EXEC sp_msForEachTable 'EXEC sp_spaceused ''?'''
SELECT *
FROM #t
-- # of rows.
SELECT SUM(CAST([rows] AS int)) AS [rows]
FROM #t
DROP TABLE #t
* 由亚历山大·格罗斯*整洁 Link to source
SELECT
schema_qualified_table = s.name + '.' + t.name,
KB = SUM(ps.reserved_page_count) * 8192/1024.0
FROM sys.tables AS t
INNER JOIN sys.schemas AS s ON t.[schema_id] = s.[schema_id]
INNER JOIN sys.dm_db_partition_stats AS ps
ON t.[object_id] = ps.[object_id]
WHERE s.name + '.' + t.name IN (N'dbo.table1', N'dbo.table2', ...)
-- list of tables you do care about ^^^^^^^^^^ ^^^^^^^^^^
GROUP BY s.name + '.' + t.name;
一点可能是:
;WITH x AS
(
SELECT o = t.[object_id], n = s.name + '.' + t.name
FROM sys.tables AS t
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id]
)
SELECT
schema_qualified_table = x.n,
KB = SUM(ps.reserved_page_count) * 8192/1024.0
FROM x INNER JOIN sys.dm_db_partition_stats AS ps
ON x.o = ps.[object_id]
WHERE x.n IN (N'dbo.table1', N'dbo.table2', ...);
如果您在多个模式中具有相同名称的表,我会扩展它以在输出中包含模式。 – Andrew
@安德鲁肯定,继续 –
@评论中的安德鲁代码真的很难阅读。通常我同意,但我不这么认为,是因为如果OP想要'dbo.foo'和'other_schema.foo','dbo.bar'而不是'* other_schema。 bar'。 WHERE子句突然变得复杂得多,我们甚至不知道OP是否有多个模式,不必介意他们将不同模式下的表名放在一起的情况。这通常是基于具有不同默认架构的用户的事故,并且在创建对象时不指定架构。 –
发布我的扩展阿龙贝特朗的回答,只是可读性。唯一的区别是将连接添加到SCHEMAS表中,并在输出和组合by中包括模式名称。
SELECT
s.name,
t.name,
KB = SUM(ps.reserved_page_count) * 8192/1024.0
FROM sys.tables AS t
INNER JOIN sys.dm_db_partition_stats AS ps
ON t.[object_id] = ps.[object_id]
INNER JOIN sys.schemas S
ON t.schema_id = s.schema_id
WHERE t.name IN (<YOUR TABLES GO HERE) -- list of tables you do care about
GROUP BY t.name,
s.name;
正如Aaron正确指出的,试图过滤表和模式的组合可能会变得非常快。你可以很容易地结束了手术室的一个巨大的集合:
(S.SCHEMA = 'SCHEMA1' and T.NAME = 'FOO')
OR
(S.SCHEMA = 'SCHEMA2' and T.NAME = 'FOO')
OR
(S.SCHEMA = 'SCHEMA1' and T.name = 'BAR')
...
@xaxa在您想要的所有信息,你的数据库环境数据库中执行这个脚本。它给你一个关于数据库的详细报告,该数据库中的所有表格等等等。 –
我已经提到了作者的名字,过去我被告知,在答案中粘贴超链接不是一个好的做法。 –
我强烈建议避免sp_MSForEachTable。它的编写方式与sp_MSForEachDB相同,因跳过数据库而臭名昭着。 –