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_descROW_OVERFLOW_DATA

MS SQL 서버는 최대 8060 바이트의 데이터 만 한 행에 저장할 수 있으므로 행 크기는 항상 <= 8060이므로이 값을 넘지 않습니다.
AnandPhadke

2
@AnandPhadke 이것은 완전히 올바르지 않습니다 : msdn.microsoft.com/en-us/library/ms186981%28SQL.90%29.aspx
Jaime

답변:


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에 동의하지 않습니다. 위의 쿼리는 테이블의 모든 열을 다루지 않습니다.
AnandPhadke

@AnandPhadke 어떤 열을 다루지 않습니까? 감사합니다
Jaime

왜 널 컬럼에 1 바이트를 추가합니까? 0 바이트가 아닙니까? 아니면 내부적으로 # 0으로 저장됩니까?
Paul

2
@Paul, 가변 길이 열 (varchar, nvarchar ...)의 경우 0 바이트이지만 고정 길이 열 (int, smallint ...)의 실제 데이터 형식 길이이므로 1은 일종의 추정치입니다. NULL은 전체 유니버스입니다 :) (공간을 차지하는 NULL 값을 플래그하는 데 사용되는 NULL 비트 맵 마스크도 있습니다). stackoverflow.com/questions/4546273/…
Jaime

@Paul SQL Server에서 데이터 압축을 사용하는 경우 0 바이트로 저장됩니다.
d.popov

7

나는 Jaime의 위를 좋아했습니다. 이상한 열 이름을 처리하기 위해 대괄호를 추가했습니다.

    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.