如何在表格中找到行大小
时间:2020-03-06 14:32:19 来源:igfitidea点击:
我的一个DB已接近允许的大小。
为了找出包含最大数据的表,我使用了以下查询:
exec sp_MSforeachtable @command1="print '?' exec sp_spaceused '?'"
它返回了包含最大数据的元凶表。
下一步,我想根据大小清理行。为此,我想根据大小对行进行排序。
如何使用查询实现这一目标?有什么工具可以做到这一点吗?
解决方案
对于所有表大小,一种更简单的方法是在此站点上使用存储过程。
我们可以将该存储过程的select语句更改为:
SELECT * FROM #TempTable Order by dataSize desc
按大小排序。
我们要如何清理?清理特定表的最大行?不知道我明白这个问题。
编辑(回复评论)
假设事件日志具有与我的事件日志相同的布局(DNN事件日志):
SELECT LEN(CONVERT(nvarchar(MAX), LogProperties)) AS length FROM EventLog ORDER BY length DESC
也许这样的事情会起作用
delete table where id in ( select top 100 id from table order by datalength(event_text) + length(varchar_column) desc )
(由于我们正在处理一个事件表,它可能是一个文本列,因此我们正在查看其顺序,因此datalength sql命令在这里很关键)
我们还可以使用它来获取索引和键的大小:(编辑:对不起,请注意文本,无法获取有效的格式)
WITH table_space_usage ( schema_name, table_name, index_name, used, reserved, ind_rows, tbl_rows ) AS ( SELECT s.Name , o.Name , coalesce(i.Name, 'HEAP') , p.used_page_count * 8 , p.reserved_page_count * 8 , p.row_count , case when i.index_id in ( 0, 1 ) then p.row_count else 0 end FROM sys.dm_db_partition_stats p INNER JOIN sys.objects as o ON o.object_id = p.object_id INNER JOIN sys.schemas as s ON s.schema_id = o.schema_id LEFT OUTER JOIN sys.indexes as i on i.object_id = p.object_id and i.index_id = p.index_id WHERE o.type_desc = 'USER_TABLE' and o.is_ms_shipped = 0 ) SELECT t.schema_name , t.table_name , t.index_name , sum(t.used) as used_in_kb , sum(t.reserved) as reserved_in_kb , case grouping(t.index_name) when 0 then sum(t.ind_rows) else sum(t.tbl_rows) end as rows FROM table_space_usage as t GROUP BY t.schema_name , t.table_name , t.index_name WITH ROLLUP ORDER BY grouping(t.schema_name) , t.schema_name , grouping(t.table_name) , t.table_name , grouping(t.index_name) , t.index_name Answer This will give you a list of rows by size, just set @table and @idcol accordingly (as written it'll run against the Northwind sample) declare @table varchar(20) declare @idcol varchar(10) declare @sql varchar(1000) set @table = 'Employees' set @idcol = 'EmployeeId' set @sql = 'select ' + @idcol +' , (0' select @sql = @sql + ' + isnull(datalength(' + name + '), 1)' from syscolumns where id = object_id(@table) set @sql = @sql + ') as rowsize from ' + @table + ' order by rowsize desc' exec (@sql)