2013-11-26 79 views
3

我有一个非常大的prod数据库。我需要复制这个数据库来创建一个测试环境,但是没有足够的磁盘空间。获取表格列表的总大小

但实际上不需要从包含用户数据的表中复制行,只有那些描述功能的表是必需的。对于包含用户数据的表,我只需要复制表“description”(列,索引,触发器...)。

如何(使用什么查询)我可以估计没有来自某些表的数据的数据库的大小?

回答

5
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

+0

@xaxa在您想要的所有信息,你的数据库环境数据库中执行这个脚本。它给你一个关于数据库的详细报告,该数据库中的所有表格等等等。 –

+0

我已经提到了作者的名字,过去我被告知,在答案中粘贴超链接不是一个好的做法。 –

+1

我强烈建议避免sp_MSForEachTable。它的编写方式与sp_MSForEachDB相同,因跳过数据库而臭名昭着。 –

4
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', ...); 
+1

如果您在多个模式中具有相同名称的表,我会扩展它以在输出中包含模式。 – Andrew

+0

@安德鲁肯定,继续 –

+0

@评论中的安德鲁代码真的很难阅读。通常我同意,但我不这么认为,是因为如果OP想要'dbo.foo'和'other_schema.foo','dbo.bar'而不是'* other_schema。 bar'。 WHERE子句突然变得复杂得多,我们甚至不知道OP是否有多个模式,不必介意他们将不同模式下的表名放在一起的情况。这通常是基于具有不同默认架构的用户的事故,并且在创建对象时不指定架构。 –

3

发布我的扩展阿龙贝特朗的回答,只是可读性。唯一的区别是将连接添加到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') 
...