SQL Serverテーブルの行ごとの実際のデータサイズを取得するにはどうすればよいですか?


33

このスクリプトsql-server-2005-reaching-table-row-size-limitを見つけました。これ は、定義されたデータ型の長さごとの行サイズを返すようです。最大データサイズが推奨8024(MSが推奨するもの)を超えるテーブル内のすべての行を提供するスクリプトが必要です。


2
あなたは使用して試すことができmsdn.microsoft.com/en-us/library/ms188917%28v=sql.105%29.aspxを - SELECT * FROM sys.dm_db_index_physical_stats(DB_ID(N'Database_Name'), OBJECT_ID(N'Table_Name'), NULL, NULL, 'DETAILED')と、何のために見てalloc_unit_type_descいるROW_OVERFLOW_DATA

MS SQLサーバーでは、最大8060バイトのデータのみを行に格納できます。したがって、行サイズは常に8060以下であり、これを超えることはありません。
-AnandPhadke

2
@AnandPhadkeこれは完全に正しいわけではありません:msdn.microsoft.com/en-us/library/ms186981%28SQL.90%29.aspx
ハイメ

回答:


44

このスクリプトを試してください:

declare @table nvarchar(128)
declare @idcol nvarchar(128)
declare @sql nvarchar(max)

--initialize those two values
set @table = 'YourTable'
set @idcol = 'some id to recognize the row'

set @sql = 'select ' + @idcol +' , (0'

select @sql = @sql + ' + isnull(datalength(' + name + '), 1)' 
        from  sys.columns 
        where object_id = object_id(@table)
        and   is_computed = 0
set @sql = @sql + ') as rowsize from ' + @table + ' order by rowsize desc'

PRINT @sql

exec (@sql)

行はサイズで並べ替えられるため、上から下に確認できます。


ええ、そのクエリの上にvarchar型I agree.Hereに適用されませんが、テーブルのすべての列網羅されていません
AnandPhadke

@AnandPhadkeどの列が対象外ですか?ありがとう
ハイメ

ヌル列に1バイトを追加するのはなぜですか?それはゼロバイトではありませんか?または、#0として内部的に保存されていますか?
ポール14年

2
@Paul、可変長列(varchar、nvarchar ...)の場合はゼロバイトですが、固定長列(int、smallint ...)の実際のデータ型の長さであるため、1は推定の一種です。NULLは完全なユニバースです:)(NULL値にフラグを付けるために使用されるNULLビットマップマスクもありますが、これにはある程度のスペースが必要です)。stackoverflow.com/questions/4546273/...
ハイメ

@Paulは、SQL Serverがデータ圧縮を使用している場合、ゼロバイトとして保存されます。
-d.popov

7

私は上記のハイメから好きだった。奇妙な列名を処理するためにいくつかの角括弧を追加しました。

    declare @table nvarchar(128)
    declare @idcol nvarchar(128)
    declare @sql nvarchar(max)

    --initialize those two values
    set @table = 'YourTable'
    set @idcol = 'some id to recognize the row'

    set @sql = 'select ' + @idcol +' , (0'

    select @sql = @sql + ' + isnull(datalength([' + name + ']), 1)' 
            from sys.columns where object_id = object_id(@table)
    set @sql = @sql + ') as rowsize from ' + @table + ' order by rowsize         desc'

    PRINT @sql

    exec (@sql)

3

また、Speedcatの上記の機能を気に入って、行数と合計バイト数を含むすべてのテーブルをリストするように拡張しました。

declare @table nvarchar(128)
declare @sql nvarchar(max)
set @sql = ''
DECLARE tableCursor CURSOR FOR  
SELECT name from sys.tables

open tableCursor
fetch next from tableCursor into @table

CREATE TABLE #TempTable( Tablename nvarchar(max), Bytes int, RowCnt int)

WHILE @@FETCH_STATUS = 0  
begin
    set @sql = 'insert into #TempTable (Tablename, Bytes, RowCnt) '
    set @sql = @sql + 'select '''+@table+''' "Table", sum(t.rowsize) "Bytes", count(*) "RowCnt" from (select (0'

    select @sql = @sql + ' + isnull(datalength([' + name + ']), 1) ' 
        from sys.columns where object_id = object_id(@table)
    set @sql = @sql + ') as rowsize from ' + @table + ' ) t '
    exec (@sql)
    FETCH NEXT FROM tableCursor INTO @table  
end

PRINT @sql

CLOSE tableCursor   
DEALLOCATE tableCursor

select * from #TempTable
select sum(bytes) "Sum" from #TempTable

DROP TABLE #TempTable

0

これを試して:

;WITH CTE as(select *,LEN(ISNULL(col1,''))+LEN(ISNULL(col2,'')) as row_len from yourtable)
select * from CTE where row_len > 8060
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.