ฉันจะรับขนาดข้อมูลจริงต่อแถวในตาราง SQL Server ได้อย่างไร


33

ฉันพบสคริปต์นี้ sql-server-2005-reach-table-row-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 อนุญาตให้เก็บข้อมูลได้สูงสุดเพียง 8060bytes ในแถวดังนั้นขนาดแถวของคุณจะยังคงเป็น <= 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 ฉัน agree.Here ข้างต้นแบบสอบถามของคุณไม่ได้ครอบคลุมทุกคอลัมน์ของตาราง
AnandPhadke

@AnandPhadke คอลัมน์ใดไม่ครอบคลุม? ขอบคุณ
Jaime

เพิ่มหนึ่งไบต์สำหรับคอลัมน์ว่างทำไม นั่นไม่ใช่ศูนย์ไบต์ใช่ไหม หรือมันถูกเก็บไว้ภายในเป็น # 0?
พอล

2
@Paul มันเป็นศูนย์ไบต์สำหรับคอลัมน์ความยาวผันแปร (varchar, nvarchar ... ) แต่มันเป็นความยาวชนิดข้อมูลจริงสำหรับคอลัมน์ความยาวคงที่ (int, smallint ... ) ดังนั้น 1 จึงเป็นค่าประมาณ NULL เป็นทั้งจักรวาล :) (นอกจากนี้ยังมีรูปแบบบิตแมป NULL ที่ใช้ในการตั้งค่าสถานะค่า NULL ที่ใช้พื้นที่บางส่วน) stackoverflow.com/questions/4546273/…
Jaime

@ พอลจะถูกเก็บเป็นศูนย์ไบต์ถ้า 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 และขยายไปยังรายการ Tables ทั้งหมดที่มี rowcounts และ bytes ทั้งหมด

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.