मैं SQL सर्वर तालिका में प्रति पंक्ति वास्तविक डेटा आकार कैसे प्राप्त कर सकता हूं?


33

मुझे यह स्क्रिप्ट एसक्यूएल-सर्वर-2005-पहुंच-टेबल-रो-साइज़-लिमिट मिली, जो कि परिभाषित डेटा लंबाई के अनुसार पंक्ति आकार को वापस करने के लिए लगता है। मुझे एक ऐसी स्क्रिप्ट की आवश्यकता है जो मुझे एक तालिका में सभी पंक्तियों को दे दे जो कि उनके अधिकतम डेटा का आकार अनुशंसित 8024 (जो भी एमएस अनुशंसा करता है) से अधिक है


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. यह कभी भी इसे पार नहीं करेगा।
आनंदपेडके

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 एक अनुमान की तरह है। NULLs पूरे ब्रह्मांड हैं :) (NULL मानों को फ़्लैग करने के लिए एक NULL बिटमैप मास्क भी है, जो कुछ स्थान लेता है)। stackoverflow.com/questions/4546273/…
Jaime

@Paul को शून्य बाइट्स के रूप में संग्रहीत किया जाएगा यदि SQL सर्वर किसी भी डेटा संपीड़न का उपयोग कर रहा है।
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

और मुझे स्पीडकैट से ऊपर पसंद आया और इसे सभी टेबल्स को पंक्तिबद्ध और कुल बाइट्स के साथ सूचीबद्ध करने के लिए विस्तारित करें।

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.