Bagaimana saya bisa mendapatkan ukuran data aktual per baris dalam tabel SQL Server?


33

Saya menemukan skrip ini sql-server-2005-mencapai-tabel-baris-batas-ukuran yang tampaknya mengembalikan ukuran baris per panjang tipe data yang ditentukan. Saya membutuhkan skrip yang akan memberi saya semua baris dalam tabel yang ukuran datanya melebihi 8024 yang disarankan (apa pun yang direkomendasikan MS)


2
Anda dapat mencoba menggunakan 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')dan mencari apa pun yang alloc_unit_type_descadaROW_OVERFLOW_DATA

MS SQL server memungkinkan hanya 8060 byte data maks untuk disimpan dalam satu baris. Oleh karena itu ukuran baris Anda akan selalu <= 8060. Itu tidak akan pernah melewati ini.
AnandPhadke

2
@AnandPhadke Ini tidak sepenuhnya benar: msdn.microsoft.com/en-us/library/ms186981%28SQL.90%29.aspx
Jaime

Jawaban:


44

Coba skrip ini:

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)

Baris akan dipesan berdasarkan ukuran, sehingga Anda dapat memeriksa dari atas ke bawah.


ya itu tidak berlaku untuk varchar saya setuju. Di sini permintaan Anda tidak mencakup semua kolom tabel
AnandPhadke

@AnandPhadke Kolom apa yang tidak dibahas? Terima kasih
Jaime

Mengapa menambahkan satu byte untuk kolom nol? Apakah itu bukan nol byte? Atau disimpan secara internal sebagai # 0?
Paul

2
@ Paul, ini nol byte untuk kolom panjang variabel (varchar, nvarchar ...), tetapi itu adalah panjang tipe data aktual untuk kolom panjang tetap (int, smallint ...), jadi 1 adalah jenis estimasi. NULL adalah Semesta keseluruhan :) (ada juga topeng bitmap NULL yang digunakan untuk menandai nilai NULL, yang membutuhkan ruang). stackoverflow.com/questions/4546273/…
Jaime

@ Paul itu akan disimpan sebagai nol byte jika SQL Server menggunakan Kompresi Data apa pun.
d.popov

7

Saya suka yang di atas dari Jaime. Saya menambahkan beberapa tanda kurung siku untuk menangani nama kolom yang aneh.

    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

Dan saya suka yang di atas dari Speedcat dan memperpanjangnya untuk mendaftar semua Tabel dengan jumlah baris dan total byte.

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

coba ini:

;WITH CTE as(select *,LEN(ISNULL(col1,''))+LEN(ISNULL(col2,'')) as row_len from yourtable)
select * from CTE where row_len > 8060
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.