一、概述
在SQL Server数据库中,我们常常需要查询某个表或者某个数据库的大小,以便更好地管理和优化数据库的性能。本文将介绍几个查询表大小的方法,以及一些常用的查询系统信息的SQL语句。
二、查询表大小
1. 使用系统存储过程sp_spaceused
系统存储过程sp_spaceused可以返回表的信息,包括表和索引占用的空间、未使用的空间和行数等。
EXEC sp_spaceused 'TableName';
其中,'TableName'是你要查询的表的名称。这个语句将返回如下的结果:
| 名称 | 行数 | 空间(total) | 空间(未使用) |索引空间 | 未使用空间(索引)|
| ---- | ---- | ---- | ---- | ---- | ---- |
|TableName | 100000 | 2048 KB | 8 KB | 400 KB | 200 KB|
通过这个表格,我们可以得知该表的行数、总空间、索引空间等信息,并且提醒我们有可能需要重新构建索引或者清理未使用的空间。
2. 查询sys.objects信息表
通过查询sys.objects信息表,我们可以得到数据库中每个表的大小。
SELECT
[TableName] = t.NAME,
[RowCount] = SUM(p.rows),
[TotalSpaceKB] = SUM(a.total_pages)*8,
[UsedSpaceKB] = SUM(a.used_pages)*8,
[UnusedSpaceKB] = (SUM(a.total_pages) - SUM(a.used_pages))*8
FROM
sys.tables t
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%'
AND i.OBJECT_ID > 255
GROUP BY
t.NAME,
i.object_id,
i.index_id,
i.name
ORDER BY
[TotalSpaceKB] DESC;
执行这个SQL语句,我们可以得到如下结果:
| TableName | RowCount | TotalSpaceKB | UsedSpaceKB | UnusedSpaceKB |
| ---- | ---- | ---- | ---- | ---- |
| SalesOrderHeader | 31,465 | 17,960 | 13,808 | 4,152 |
| SalesOrderDetail | 121,317 | 16,896 | 12,968 | 3,928 |
| AWBuildVersion | 1 | 16 | 8 | 8 |
| SalesPerson | 17 | 8 | 8 | 0 |
从这个表格中,我们可以看到每个表的行数和使用的空间、总空间、未使用的空间等信息。
3. 查询sys.dm_db_partition_stats DMV
DMV是动态管理视图,它提供了有关当前状态的信息。通过查询sys.dm_db_partition_stats DMV,我们可以得到表的大小、索引的大小以及行数等信息。
SELECT
OBJECT_NAME(object_id) TableName,
SUM(reserved_page_count) * 8.0 / 1024.0 AS TotalSizeMB,
SUM(CASE WHEN (index_id < 2)
THEN (in_row_data_page_count + lob_used_page_count + row_overflow_used_page_count)
ELSE lob_used_page_count + row_overflow_used_page_count END) * 8.0 / 1024.0 AS DataSizeMB,
SUM(used_page_count - CASE WHEN (index_id < 2)
THEN (in_row_data_page_count + lob_used_page_count + row_overflow_used_page_count)
ELSE lob_used_page_count + row_overflow_used_page_count END) * 8.0 / 1024.0 AS IndexSizeMB,
SUM(row_count) AS [RowCount]
FROM
sys.dm_db_partition_stats
GROUP BY
object_id
ORDER BY
TotalSizeMB DESC;
执行这个SQL语句后,我们可以得到如下结果:
| TableName | TotalSizeMB | DataSizeMB | IndexSizeMB | RowCount |
| ---- | ---- | ---- | ---- | ---- |
| SalesOrderDetail | 244.96 | 231.141 | 13.819 | 121317 |
| SalesOrderHeader | 100.25 | 84.797 | 15.452 | 31465 |
| Product | 30.91 | 28.673 | 2.238 | 504 |
| SalesOrderHeaderSalesReason | 25.23 | 24.225 | 1.009 | 1,838 |
从这个表格中,我们可以看到表的总大小、行数和数据、索引的大小等信息。
三、查询系统信息
1. 查询数据库性能
在SQL Server中,我们可以使用sys.dm_os_performance_counters DMV查询数据库的性能。
SELECT
[object_name],
[counter_name],
[instance_name],
[cntr_value]
FROM
sys.dm_os_performance_counters
WHERE
[object_name] LIKE '%:Transactions%'
OR [object_name] LIKE '%Access Methods%'
OR [object_name] LIKE '%Locks%'
OR [object_name] LIKE '%Transactions%'
OR [object_name] LIKE '%Latch%'
ORDER BY
[counter_name],
[instance_name];
这个SQL语句将返回数据库中每个事务、访问方式、锁、事务和闩锁的计数器。通过这些计数器,我们可以得到数据库的性能信息,例如:事务总数、锁等待时间、物理读取和逻辑读取等。
2. 查询数据库配置
我们可以使用sys.configurations信息表查询数据库的配置信息。
SELECT
[name],
[value]
FROM
sys.configurations
WHERE
[name] LIKE '%max%'
ORDER BY
[name];
这个SQL语句将返回数据库相关的配置信息,例如:最大工作线程数、最大并行度、锁超时时间等。
四、总结
本文介绍了几种查询表大小和系统信息的SQL语句,包括使用系统存储过程sp_spaceused、查询sys.objects信息表和查询sys.dm_db_partition_stats DMV。此外,我们还介绍了查询数据库性能和查询数据库配置等常用的SQL语句。通过这些SQL语句,我们可以更好地管理和优化SQL Server数据库的性能。