如何在表中查找行大小

时间:2008-09-22 13:01:16

标签: sql-server tsql

我的一个数据库越来越接近允许的大小。

为了找到包含最大数据的表,我使用了以下查询:

exec sp_MSforeachtable @command1="print '?' exec sp_spaceused '?'"

它返回了包含最大数据的罪魁祸首表。

下一步,我想根据大小清理行。为此,我想根据大小订购行。

如何使用查询实现此目的?有没有工具可以做到这一点?

4 个答案:

答案 0 :(得分:11)

这将按行大小给出一个行列表,只需相应地设置@table和@idcol(如同写入它将针对Northwind示例运行)

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)

答案 1 :(得分:1)

所有表格大小的更简单方法是使用this site处的存储过程。 您可以将该存储过程的select语句更改为:

SELECT * 
FROM #TempTable
Order by dataSize desc

按尺寸排序。

你想如何清理?清理特定表的最大行?我不确定我理解这个问题。

编辑(回复评论)

假设您的事件日志与我的布局相同(DNN事件日志):

SELECT     LEN(CONVERT(nvarchar(MAX), LogProperties)) AS length
FROM         EventLog
ORDER BY length DESC

答案 2 :(得分:1)

您也可以使用它来获取索引和键的大小:(编辑:抱歉文本墙,无法使格式工作)


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

答案 3 :(得分:0)

也许这样的事情会起作用

delete table where id in 
(
    select top 100 id
    from table
    order by datalength(event_text) + length(varchar_column) desc
) 

(因为你正在处理一个事件表,它可能是你正在查看的文本列,所以datalength sql命令在这里是关键的)