SQL Server - 获取表的大致大小

时间:2015-06-11 18:21:11

标签: sql sql-server

在生产中,发布SELECT COUNT可能是一个坏主意 - 根据您的数据库引擎,它可能会受到影响。在Oracle中,如果我想了解一个表的大小而不必诉诸COUNT,我可以执行以下操作:

SELECT
    table_name,
    num_rows,
    last_analyzed
FROM all_tables
WHERE table_name = 'MY_TABLE_NAME';

这将检索Oracle的表分析,如果它们已启用。虽然计数不准确,但它可以让我知道一个表有多大,以防我需要查询它(而last_analyzed列让我知道这个近似值有多大)。

如何在SQL Server中执行类似的操作? (相关 - 这对SQL Server来说是必要的吗?Oracle必须逐行计算,因此避免使用。)

谢谢!

4 个答案:

答案 0 :(得分:4)

您也可以使用管理工作室

Right Click on table -> Properties -> Storage

或者你可以使用这样的查询:

sp_spaceused 'TableName'

为了获得所有表格,你可以使用它像tihs:

CREATE TABLE #tmp
(
    tableName varchar(100),
    numberofRows varchar(100),
    reservedSize varchar(50),
    dataSize varchar(50),
    indexSize varchar(50),
    unusedSize varchar(50)
)
insert #tmp
EXEC sp_MSforeachtable @cmd="EXEC sp_spaceused '?'"


select  * from #tmp

答案 1 :(得分:2)

您可以拨打sp_spaceused 'table_name'

如果要对所有表执行此操作,请将其包装在sp_MSforeachtable

sp_MSforeachtable 'sp_spaceused ''[?]'''

在没有任何参数的情况下调用sp_spaceused将为您提供数据库大小。

答案 2 :(得分:0)

礼貌:@marc_s

SELECT 
    s.Name AS SchemaName,
    t.NAME AS TableName,
    p.rows AS RowCounts,
    SUM(a.total_pages) * 8 AS TotalSpaceKB, 
    SUM(a.used_pages) * 8 AS UsedSpaceKB, 
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
FROM 
    sys.tables t
INNER JOIN 
    sys.schemas s ON s.schema_id = t.schema_id
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
WHERE 
    t.NAME NOT LIKE 'dt%'    -- filter out system tables for diagramming
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255 
GROUP BY 
    t.Name, s.Name, p.Rows
ORDER BY 
    s.Name, t.Name

答案 3 :(得分:0)

如果绝对准确度不重要,这是一个非常快速的大致行数;如果你的SQL Server是受支持的版本,它应该有这个dmv。

SELECT SUM (row_count)
FROM sys.dm_db_partition_stats
WHERE object_id=OBJECT_ID('MY_TABLE_NAME')   
AND (index_id=0 or index_id=1);