আমি কীভাবে এসকিউএল সার্ভারের টেবিলটিতে সারি প্রতি আসল তথ্য আকার পেতে পারি?


33

আমি এই স্ক্রিপ্টটি এসকিএল-সার্ভার -2003-পৌঁছানো-সারণী-সারি-আকার-সীমা পেয়েছি যা সংজ্ঞায়িত ডেটা টাইপের দৈর্ঘ্য অনুসারে সারি আকার প্রদান করে বলে মনে হচ্ছে। আমার একটি স্ক্রিপ্ট দরকার যা আমাকে সারণীতে সমস্ত সারি দেয় যে তাদের সর্বাধিক ডেটা আকার প্রস্তাবিত 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

এমএস এসকিউএল সার্ভার কেবলমাত্র 8060 বাইট ডেটা সর্বাধিক এক সারিতে সঞ্চয় করতে দেয় ence তবে আপনার সারির আকারটি সর্বদা <= 8060 হবে be এটি কখনই অতিক্রম করবে না।
আনন্দফাদকে

2
: @AnandPhadke এই সম্পূর্ণভাবে সঠিক নয় msdn.microsoft.com/en-us/library/ms186981%28SQL.90%29.aspx
জেইমি

উত্তর:


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)

সারিগুলি আকার অনুসারে অর্ডার করা হবে, সুতরাং আপনি উপরে থেকে নীচে চেক করতে পারেন।


হ্যাঁ এটি বর্ণাবার জন্য প্রযোজ্য নয় আমি সম্মত your এখানে আপনার প্রশ্নের উপরে কোনও টেবিলের সমস্ত কলাম আবরণ করা হচ্ছে না
আনন্দফাদকে

@ আনন্দ ফাদকে কোন কলাম কভার করছে না? ধন্যবাদ
Jaime

নাল কলামের জন্য কেন একটি বাইট যুক্ত করবেন? এটা কি শূন্য বাইট না? অথবা এটি # 0 হিসাবে অভ্যন্তরীণভাবে সঞ্চিত আছে?
পল

2
@ পল, এটি ভেরিয়েবল দৈর্ঘ্যের কলামগুলির জন্য শূন্য বাইট (বর্ণচর, এনভারচার ...), তবে এটি স্থির দৈর্ঘ্যের কলামগুলির জন্য প্রকৃত ডেটা টাইপ দৈর্ঘ্য (অন্তর্নিহিত, ছোট্ট ...), সুতরাং 1 অনুমানের এক ধরণের। NULL একটি সম্পূর্ণ ইউনিভার্স :) (এখানে NULL মানগুলি পতাকাঙ্কিত করতে ব্যবহৃত একটি NULL বিটম্যাপ মাস্কও রয়েছে, এতে কিছুটা জায়গা লাগে)। stackoverflow.com/questions/4546273/…
Jaime

@ পল এটি শূন্য বাইট হিসাবে সংরক্ষণ করা হবে যদি এসকিউএল সার্ভার কোনও ডেটা সংক্ষেপণ ব্যবহার করে।
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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.