sql-server - tablas - tamaño de indices sql server
cómo encontrar el tamaño de filas en la tabla (4)
Esto le dará una lista de filas por tamaño, simplemente configure @table y @ idcol en consecuencia (como está escrito, se ejecutará con la muestra 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)
Uno de mis DB se ha acercado al tamaño permitido.
Para averiguar la tabla que contiene los datos máximos, utilicé la siguiente consulta:
exec sp_MSforeachtable @command1="print ''?'' exec sp_spaceused ''?''"
Devolvió la tabla culpable que comprende los datos máximos.
Como siguiente paso, quiero limpiar las filas según el tamaño. Para esto, me gustaría ordenar las filas según el tamaño.
¿Cómo lograr esto usando una consulta? ¿Hay alguna herramienta para hacer esto?
Tal vez algo así funcionará
delete table where id in
(
select top 100 id
from table
order by datalength(event_text) + length(varchar_column) desc
)
(Dado que se trata de una tabla de eventos, es probable que sea una columna de texto que está buscando ordenar, por lo que el comando datalength sql es la clave aquí)
También puede usar esto para obtener el tamaño de los índices y las claves: (editar: lo siento por el muro de texto, no puedo conseguir que el formato funcione)
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
Un enfoque más sencillo para todos los tamaños de tabla es usar el procedimiento almacenado en este sitio . Puede modificar la instrucción de selección de ese procedimiento almacenado para:
SELECT *
FROM #TempTable
Order by dataSize desc
tenerlo ordenado por tamaño.
¿Cómo quieres limpiar? ¿Limpiar la fila más grande de una tabla específica? No estoy seguro de entender la pregunta.
EDITAR (respuesta al comentario)
Suponiendo que tu registro de eventos tenga el mismo diseño que el mío (registro de eventos DNN):
SELECT LEN(CONVERT(nvarchar(MAX), LogProperties)) AS length
FROM EventLog
ORDER BY length DESC