Bir SQL Server tablosunda satır başına gerçek veri boyutunu nasıl alabilirim?


33

Tanımlanan veri türü uzunlukları başına satır boyutunu döndüren görünen bu betiği sql-server-2005-reach-table-row-size-limit buldum . Bana bir tablodaki tüm satırları verecek bir komut dosyasına ihtiyacım var, maksimum veri boyutları tavsiye edilen 8024'ün üzerinde (MS ne olursa olsun)


2
Msdn.microsoft.com/en-us/library/ms188917%28v=sql.105%29.aspx - komutunu kullanarak deneyebilirsiniz SELECT * FROM sys.dm_db_index_physical_stats(DB_ID(N'Database_Name'), OBJECT_ID(N'Table_Name'), NULL, NULL, 'DETAILED')ve nerede alloc_unit_type_descolduğunu kontrol edinROW_OVERFLOW_DATA

MS SQL sunucusu bir satırda sadece 8060 bayt veri max. Depolanmasına izin verir. Bu nedenle satır boyutunuz her zaman <= 8060 olacaktır.
AnandPhadke

2
@AnandPhadke Bu tamamen doğru değil: msdn.microsoft.com/en-us/library/ms186981%28SQL.90%29.aspx
Jaime

Yanıtlar:


44

Bu betiği dene:

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)

Satırlar boyuta göre sıralanır, böylece yukarıdan aşağıya kontrol edebilirsiniz.


evet varchar için geçerli değildir katılıyorum. Sorgunuz yukarıda bir tablonun tüm sütunlarını
kapsamıyor

@AnandPhadke Hangi sütunları kapsamaz? Teşekkürler
Jaime

Boş bir sütun için neden bir byte eklesin? Bu sıfır bayt değil mi? Veya dahili olarak # 0 olarak mı depolanıyor?
Paul

2
@Paul, değişken uzunluklu sütunlar için sıfır bayt (varchar, nvarchar ...), ancak sabit uzunluklu sütunlar için gerçek veri türü uzunluğu (int, smallint ...), yani 1 bir tür tahmindir. NULL'lar tam bir Evrendir :) (NULL değerleri işaretlemek için kullanılan NULL bitmap maskesi de vardır, bu da biraz yer kaplar). stackoverflow.com/questions/4546273/…
Jaime

@Paul, SQL Server herhangi bir Veri Sıkıştırması kullanıyorsa, sıfır bayt olarak depolanacaktır.
d.popov

7

Yukarıdakileri Jaime’den sevdim. Garip sütun adlarını işlemek için köşeli parantezler ekledim.

    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

Yukarıdakileri Speedcat'tan beğendim ve satır sayıları ve toplam baytları olan tüm Tabloları listelemek için genişletti.

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

bunu dene:

;WITH CTE as(select *,LEN(ISNULL(col1,''))+LEN(ISNULL(col2,'')) as row_len from yourtable)
select * from CTE where row_len > 8060
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.