6

DB の 1 つが許容サイズに近づいています。

最大データを含むテーブルを見つけるために、次のクエリを使用しました。

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

最大データを含む犯人テーブルを返しました。

次のステップとして、サイズに基づいて行をクリーンアップしたいと考えています。このために、サイズに基づいて行を並べ替えたいと思います。

クエリを使用してこれを達成する方法は? これを行うツールはありますか?

4

4 に答える 4

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)
于 2008-09-22T13:54:53.510 に答える
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

于 2008-09-22T13:31:53.957 に答える
1

すべてのテーブル サイズに対するより簡単な方法は、このサイトのストアド プロシージャを使用することです。そのストアド プロシージャの select ステートメントを次のように変更できます。

SELECT * 
FROM #TempTable
Order by dataSize desc

サイズで注文する。

どのようにクリーンアップしますか? 特定のテーブルの最大の行をクリーンアップしますか? 質問を理解しているかどうかわかりません。

編集(コメントへの応答)

イベントログのレイアウトが私のものと同じであると仮定します (DNN イベントログ):

SELECT     LEN(CONVERT(nvarchar(MAX), LogProperties)) AS length
FROM         EventLog
ORDER BY length DESC
于 2008-09-22T13:22:04.527 に答える
0

たぶん、このようなことがうまくいくでしょう

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

(イベントテーブルを扱っているので、おそらく順序付けを検討しているテキスト列であるため、ここではdatalength sqlコマンドが重要です)

于 2008-09-22T13:27:07.197 に答える