2015-06-11 49 views
4
的大致尺寸

在生产中,发布SELECT COUNT可能是一个坏主意 - 它可能是性能问题,具体取决于您的数据库引擎。在Oracle中,如果我想获得一个表的大小的想法,而不必求助于COUNT,我可以做到以下几点:SQL Server - 获取表

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

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

我该如何在SQL Server中做类似的事情? (相关 - 这是SQL Server所必需的吗?Oracle必须逐行计数,因此避免。)

谢谢!

回答

2

您可致电sp_spaceused 'table_name'

如果你想对所有表做到这一点,把它包里面sp_MSforeachtable

sp_MSforeachtable 'sp_spaceused ''[?]''' 

调用sp_spaceused不带任何参数会给你的数据库大小。

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 
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 
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);