Làm cách nào tôi có thể nhận được kích thước dữ liệu thực tế trên mỗi hàng trong bảng SQL Server?


33

Tôi đã tìm thấy tập lệnh này sql-server-2005-Reach-table-row-size-giới hạn dường như trả về kích thước hàng cho mỗi độ dài loại dữ liệu được xác định. Tôi cần một tập lệnh sẽ cung cấp cho tôi tất cả các hàng trong một bảng có kích thước dữ liệu tối đa của chúng vượt quá 8024 được đề xuất (bất cứ điều gì MS khuyến nghị)


2
Bạn có thể thử sử dụng 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')và tìm kiếm bất cứ điều gì mà alloc_unit_type_descROW_OVERFLOW_DATA

Máy chủ MS SQL chỉ cho phép lưu trữ tối đa 8060byte dữ liệu trong một hàng. Kích thước hàng của bạn sẽ luôn luôn là <= 8060. Nó sẽ không bao giờ vượt qua điều này.
AnandPhadke

2
@AnandPhadke Điều này không hoàn toàn đúng: msdn.microsoft.com/en-us/l
Jaime

Câu trả lời:


44

Hãy thử kịch bản này:

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)

Các hàng sẽ được sắp xếp theo kích thước, vì vậy bạn có thể kiểm tra từ trên xuống.


vâng, nó không áp dụng cho varchar Tôi đồng ý. Ở trên, truy vấn của bạn không bao gồm tất cả các cột của bảng
AnandPhadke

@AnandPhadke Những cột nào không bao gồm? Cảm ơn
Jaime

Tại sao thêm một byte cho cột null? Đó không phải là byte không? Hoặc nó được lưu trữ nội bộ là # 0?
Paul

2
@Paul, đó là byte không cho các cột có chiều dài thay đổi (varchar, nvarchar ...), nhưng đó là độ dài kiểu dữ liệu thực tế cho các cột có chiều dài cố định (int, smallint ...), vì vậy 1 là loại ước tính. Các NULL là cả một vũ trụ :) (cũng có một mặt nạ bitmap NULL được sử dụng để gắn cờ các giá trị NULL, cần một khoảng trống). stackoverflow.com/questions/4546273/ Mạnh
Jaime

@Paul nó sẽ được lưu dưới dạng byte nếu SQL Server đang sử dụng bất kỳ Nén dữ liệu nào.
d.popov

7

Tôi thích những điều trên từ Jaime. Tôi đã thêm một số dấu ngoặc vuông để xử lý các tên cột lạ.

    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

Và tôi thích phần trên từ Speedcat và mở rộng nó để liệt kê tất cả các Bảng có số lượng hàng và tổng số 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

thử đi:

;WITH CTE as(select *,LEN(ISNULL(col1,''))+LEN(ISNULL(col2,'')) as row_len from yourtable)
select * from CTE where row_len > 8060
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.