2013-11-26 115 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') 
...