我有一個非常大的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相同,因跳過數據庫而臭名昭着。 –