在生产中,发布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必须逐行计算,因此避免使用。)
谢谢!
答案 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);