как найти размер строки в таблице - PullRequest
6 голосов
/ 22 сентября 2008

Одна из моих БД стала ближе к разрешенному размеру.

Чтобы узнать таблицу с максимальными данными, я использовал следующий запрос:

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

Возвращена таблица преступников, содержащая максимальные данные.

В качестве следующего шага я хочу очистить строки в зависимости от размера. Для этого я хотел бы заказать строки в зависимости от размера.

Как этого добиться с помощью запроса? Есть ли инструменты для этого?

Ответы [ 4 ]

11 голосов
/ 22 сентября 2008

Это даст вам список строк по размеру, просто установите @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 голос
/ 22 сентября 2008

Вы также можете использовать это, чтобы получить размер индексов и ключей: (редактировать: извините за стену текста, не могу заставить формат работать)

<code>
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
1 голос
/ 22 сентября 2008

Более простой подход для таблиц любого размера - использовать хранимую процедуру на этом сайте . Вы можете изменить оператор выбора этой хранимой процедуры на:

SELECT * 
FROM #TempTable
Order by dataSize desc

чтобы заказать его по размеру.

Как вы хотите очистить? Очистить самую большую строку определенной таблицы? Не уверен, что понимаю вопрос.

РЕДАКТИРОВАТЬ (ответ на комментарий)

Предполагается, что ваш журнал событий имеет ту же структуру, что и мой (DNN eventlog):

SELECT     LEN(CONVERT(nvarchar(MAX), LogProperties)) AS length
FROM         EventLog
ORDER BY length DESC
0 голосов
/ 22 сентября 2008

Может быть, что-то подобное будет работать

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

(поскольку вы имеете дело с таблицей событий, это, вероятно, текстовый столбец, на который вы хотите упорядочить данные, поэтому здесь важна команда sql для длины данных)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...