如何在SQL Server数据库中查找最大的对象?

我将如何去查找SQL Server数据库中最大的对象? 首先,通过确定哪些表(和相关索引)最大,然后确定特定表中哪些行最大(我们正在将二进制数据存储在BLOB中)?

有帮助进行这种数据库分析的工具吗? 还是有一些简单的查询,我可以运行系统表?

我一直在使用这个SQL脚本(我从别人那里得到的 – 无法重build它的来源),这有助于我理解和确定索引和表的大小:

SELECT t.NAME AS TableName, i.name as indexName, sum(p.rows) as RowCounts, sum(a.total_pages) as TotalPages, sum(a.used_pages) as UsedPages, sum(a.data_pages) as DataPages, (sum(a.total_pages) * 8) / 1024 as TotalSpaceMB, (sum(a.used_pages) * 8) / 1024 as UsedSpaceMB, (sum(a.data_pages) * 8) / 1024 as DataSpaceMB 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 AND i.index_id <= 1 GROUP BY t.NAME, i.object_id, i.index_id, i.name ORDER BY object_name(i.object_id) 

当然,你可以使用另一个sorting标准,例如

 ORDER BY SUM(p.rows) DESC 

获取最多行的表或者

 ORDER BY SUM(a.total_pages) DESC 

以获得使用最多页(8K块)的表格。

在SQL Server 2008中,您也可以只运行标准报表“磁盘使用率排行榜”。 这可以通过右键单击数据库,select报告 – >标准报告并select您想要的报告find。

您也可以使用下面的代码:

 USE AdventureWork GO CREATE TABLE #GetLargest ( table_name sysname , row_count INT, reserved_size VARCHAR(50), data_size VARCHAR(50), index_size VARCHAR(50), unused_size VARCHAR(50) ) SET NOCOUNT ON INSERT #GetLargest EXEC sp_msforeachtable 'sp_spaceused ''?''' SELECT a.table_name, a.row_count, COUNT(*) AS col_count, a.data_size FROM #GetLargest a INNER JOIN information_schema.columns b ON a.table_name collate database_default = b.table_name collate database_default GROUP BY a.table_name, a.row_count, a.data_size ORDER BY CAST(REPLACE(a.data_size, ' KB', '') AS integer) DESC DROP TABLE #GetLargest 

这个查询有助于find你最大的表是连接。

 SELECT TOP 1 OBJECT_NAME(OBJECT_ID) TableName, st.row_count FROM sys.dm_db_partition_stats st WHERE index_id < 2 ORDER BY st.row_count DESC 

如果您使用的是Sql Server Management Studio 2008,则可以在对象浏览器详细信息窗口中查看某些数据字段。 只需浏览并select表格文件夹。 在详细信息视图中,您可以右键单击列标题并将字段添加到“报告”。 如果您使用SSMS 2008 express,您的里程可能会有所不同。

我发现这个查询在SqlServerCentral中也很有帮助,这里是原始文章的链接

Sql Server最大的表

  select name=object_schema_name(object_id) + '.' + object_name(object_id) , rows=sum(case when index_id < 2 then row_count else 0 end) , reserved_kb=8*sum(reserved_page_count) , data_kb=8*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 ) , index_kb=8*(sum(used_page_count) - 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 ) ) , unused_kb=8*sum(reserved_page_count-used_page_count) from sys.dm_db_partition_stats where object_id > 1024 group by object_id order by rows desc 

在我的数据库中,他们给了这个查询和第一个答案不同的结果。

希望有人觉得有用