දත්ත සමුදායේ ඇති සියලුම වගු වල ප්‍රමාණය ලබා ගන්න


1290

මට තරමක් විශාල SQL සේවාදායක දත්ත ගබඩාවක් උරුම වී ඇත. එහි අඩංගු දත්ත අනුව, මම බලාපොරොත්තු වූවාට වඩා වැඩි ඉඩ ප්‍රමාණයක් ගන්නා බව පෙනේ.

සෑම මේසයක්ම තැටියේ කොපමණ ඉඩ ප්‍රමාණයක් පරිභෝජනය කරනවාද යන්න තීරණය කිරීමට පහසු ක්‍රමයක් තිබේද?


ඔබට ප්‍රවේශ විය හැක්කේ කුමන භූමිකාවන්ටද? ඔබ ඩී.බී.ඒ ද, නැතහොත් මෙය කළමනාකරණය කරන්නේ වෙබ් සත්කාරක සමාගමක්, සේවාදායකයෙක් හෝ ඒ හා සමාන ද?
රොබ් ඇලන්


Ob රොබ්ඇලන් මට දත්ත සමුදායට පූර්ණ ප්‍රවේශයක් ඇත, එබැවින් ඕනෑම භූමිකාවක් අවශ්‍ය වන ස්ක්‍රිප්ටයක් ප්‍රමාණවත් වේ.
එරික්


Answers:


2646
SELECT 
    t.NAME AS TableName,
    s.Name AS SchemaName,
    p.rows,
    SUM(a.total_pages) * 8 AS TotalSpaceKB, 
    CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB,
    SUM(a.used_pages) * 8 AS UsedSpaceKB, 
    CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB, 
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB,
    CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
WHERE 
    t.NAME NOT LIKE 'dt%' 
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255 
GROUP BY 
    t.Name, s.Name, p.Rows
ORDER BY 
    TotalSpaceMB DESC, t.Name

8
මෝඩ ප්‍රශ්නය, නමුත් මෙම විමසුම පේළි අගුළු දැමිය හැකිද?
GEMI

7
දර්ශක අවකාශය ද භාවිතා කරන අතර, මෙම විමසුම සමඟ දර්ශක භාවිතා කරන ප්‍රමාණය සොයාගත හැකිය .
ජෙන්ස් ෆ්‍රැන්ඩ්සන්

6
ඔබේ ස්ක්‍රිප්ටයට පෙරහන් කළ දර්ශක සමඟ ගැටලු ඇත: දී ඇති වගුවක් සඳහා එක් එක් පෙරහන් කළ දර්ශකය සඳහා, ප්‍රති table ලවල එම වගු වල නම සහිත අමතර පේළියක් මට පෙනේ. එම එක් එක් අතිරේක පේළි වල "පේළි ගණන" පෙරහන් කළ එක් දර්ශකයකින් ආවරණය වන පේළි ගණනට අනුරූප වේ. (Sql2012 මත)
Akos Lukacs

37
Od ටොඩ්: සමහර අයට එය එලෙස ඇණවුම් කිරීමට අවශ්‍යයි - අනෙක් අයට එය මේස නාමයෙන් අවශ්‍යයි - ඔබේ තේරීම ගන්න, අවශ්‍ය පරිදි කේතය අනුවර්තනය කරන්න ....
මාර්ක්_

12
ඔබගේ වගු කොටස් කර ඇත්නම්, සිදුවන්නේ කුමක්ද යන්න පිළිබඳ කිසිදු ඇඟවීමකින් තොරව ඒවා කිහිප වතාවක් පෙන්වයි. ඔබට තෝරාගත් ලැයිස්තුවට p.partition_number එකතු කළ හැකිය, නැතහොත් ඔබට SUM (p.Rows) කර එය සමූහයෙන් ඉවත් කළ හැකිය.
පීආර්මන්

568

ඔබ SQL සේවාදායක කළමණාකරණ චිත්‍රාගාරය (SSMS) භාවිතා කරන්නේ නම්, විමසුමක් ක්‍රියාත්මක කරනවා වෙනුවට ( මගේ නඩුවේ අනුපිටපත් පේළි ) ඔබට සම්මත වාර්තාවක් ක්‍රියාත්මක කළ හැකිය . 

  1. දත්ත සමුදාය මත දකුණු ක්ලික් කරන්න
  2. සංචාලනය කරන්න වාර්තා> වගුව මගින් සම්මත වාර්තා> තැටි භාවිතය

සටහන: මෙය නිවැරදිව වැඩ කිරීම සඳහා දත්ත සමුදා අනුකූලතා මට්ටම 90 හෝ ඊට ඉහළින් සැකසිය යුතුය. Http://msdn.microsoft.com/en-gb/library/bb510680.aspx බලන්න


54
කළමනාකරණ ස්ටුඩියෝ 2012 හි ඔබට කළ හැක්කේ: View-Object Explorer Details (F7) සහ Object Explorer හි "වගු" වෙත යන්න. විස්තර වලදී ශීර්ෂකය මත දකුණු-ක්ලික් කර ප්‍රමාණයේ තීරු තෝරන්න.
ValGe

3
එස්එස්එම්එස් 2012 සමඟ නව ක්‍රියාකාරිත්වයට උපදෙස් දීම සඳහා. පැරණි ගීසර් සඳහා, අපට මෙය කිසි විටෙකත් නොතිබුණි. ඉතින් අපි එය කළේ පැරණි TSQL ක්‍රමයටයි :)
ගෝල්ඩ් බිෂොප්

3
එය විශ්වාස කරන්න හෝ නොවන්න, සමහර විට හුදෙක් මනුෂ්‍යයන් (සංවර්ධකයින්) මෙම තොරතුරු දැකීමට කැමති අතර අපට ගොඩනංවන ලද වාර්තාව භාවිතා කිරීමට අවසර නැත, නමුත් අපට පිළිගත් පිළිතුරෙන් TSQL ධාවනය කළ හැකිය. :) FYI (BTW, මම තවමත් ඔබේ පිළිතුර ඉහළට ඔසවා තැබුවෙමි)
ස්ටීට්ස්

9
Azure SQL :-(
Simon_Weaver

1
එය බැරෑරුම් නොවන බව මම දනිමි, නමුත්, කරුණාකර, ඔබ ඉංජිනේරු හා තාක්‍ෂණයෙන් ආන්තික කණ්ඩායම් ඉවතට තල්ලු කරමින් මෙම තර්කණය සෑම තැනකම පුනරාවර්තනය වේ. ඔබ මේ දෙකම ඉගෙන ගත යුතුය, නමුත් වඩා වේගයෙන් හා වේගයෙන් වැඩ කිරීමට කාලය ඉතිරි කිරීමේ උපයෝගීතා භාවිතා කිරීම ගැන ඔබ මිනිසුන්ට ද ise ුවම් නොකළ යුතුය. .
ජූලියා මැක්ගුගන්

103

sp_spaceused මඟින් ඔබට වගුවක්, සුචිගත කළ දර්ශනයක් හෝ සමස්ත දත්ත ගබඩාව භාවිතා කරන තැටි අවකාශය පිළිබඳ තොරතුරු ලබා ගත හැකිය.

උදාහරණයක් වශයෙන්:

USE MyDatabase; GO

EXEC sp_spaceused N'User.ContactInfo'; GO

මෙය ContactInfo වගුව සඳහා තැටි භාවිත තොරතුරු වාර්තා කරයි.

සියලුම වගු සඳහා මෙය එකවර භාවිතා කිරීමට:

USE MyDatabase; GO

sp_msforeachtable 'EXEC sp_spaceused [?]' GO

SQL සේවාදායකයේ දකුණු-ක්ලික් කරන්න සම්මත වාර්තා ක්‍රියාකාරිත්වය තුළින් ඔබට තැටි භාවිතය ලබා ගත හැකිය. මෙම වාර්තාව ලබා ගැනීම සඳහා, Object Explorer හි සේවාදායක වස්තුවෙන් සැරිසැරීම, දත්ත සමුදා වස්තුව වෙත පහළට ගොස් ඕනෑම දත්ත සමුදායක් මත දකුණු-ක්ලික් කරන්න. දිස්වන මෙනුවෙන්, වාර්තා තෝරන්න, පසුව සම්මත වාර්තා, ඉන්පසු "කොටස් අනුව තැටි භාවිතය: [දත්ත සමුදාය]" තෝරන්න.


3
sp_msforeachtableඑස්එස්එම්එස් හි භාවිතය System.OutOfMemoryExceptionඔබට වගු විශාල ප්‍රමාණයක් තිබේ නම් එය පහසුවෙන් අවුලුවන නමුත් මෙය ප්‍රති .ල ගබඩා කිරීම සඳහා තාවකාලික වගුවක් භාවිතා කිරීම වඩා හොඳ අදහසකි.
syneticon-dj

1
Sp_spacedused සමඟ මට දැකිය හැකි ප්‍රධාන ගැටළුව නම්, එය දත්ත මිනිස් කියවිය හැකි ආකෘතියෙන් ආපසු ලබා දෙන බව පෙනේ (උදා: '152 KB' මගේ නඩුවේ 'වෙන් කර ඇති' තීරුවේ). මෙය සුදුසු පරිදි MB / GB වෙත මාරු වනු ඇතැයි මම සිතමි. මෙය බොහෝ අවස්ථාවන්හිදී පැහැදිලිවම ප්‍රයෝජනවත් වන නමුත් ඔබට ප්‍රමාණය මත පදනම්ව යම් තර්කනයක් යෙදීමට අවශ්‍ය නම් හෝ අගයන් හෝ වෙනත් දෙයක් සංසන්දනය කිරීමට අවශ්‍ය නම් නොවේ. මම එය නිවා දැමීමේ ක්‍රමයක්
සෙව්වෙමි

55

මෙන්න තවත් ක්‍රමයක්: Object Explorer හි SQL Server Management Studio භාවිතා කරමින් ඔබේ දත්ත ගබඩාවට ගොස් වගු තෝරන්න

රූප විස්තරය මෙහි ඇතුළත් කරන්න

ඉන්පසු වස්තු ගවේෂක තොරතුරු විවෘත කරන්න (එක්කෝ F7 එබීමෙන් හෝ View-> Object Explorer විස්තර වෙත යන්න ). වස්තු ගවේෂක විස්තර පිටුවේ, තීරු ශීර්ෂය මත දකුණු ක්ලික් කර පිටුවේ ඔබ දැකීමට කැමති තීරු සක්‍රීය කරන්න. ඔබට ඕනෑම තීරුවකින් දත්ත වර්ග කළ හැකිය.

රූප විස්තරය මෙහි ඇතුළත් කරන්න


ඔව්, දේශීය අනුවාදයට සාපේක්ෂව Azure හි SSMS හි සමහර විශේෂාංග නොමැත.
ස්පරෝ

Azbatmaci ඔබ Azure SQL දත්ත සමුදායන් පිළිබඳව ඔබේ අදහස ඉදිරිපත් කරන විට මෙය කිසිසේත්ම ක්‍රියාත්මක වේදැයි විශ්වාස නැත, නමුත් එය අවම වශයෙන් අර්ධ වශයෙන් දැන් SSMS හි මෑත සංස්කරණ වල ක්‍රියාත්මක වන බව පෙනේ. මට නම් වගු පාර-දත්ත සඳහා විමසුම කල් ඉකුත්වී ඇති බව පෙනේ, නමුත් ඊට පෙර තෝරාගත් වගුව ඇතුළුව (විශ්වාසදායක ලෙස) වටිනා වගු කිහිපයක් (3-10) ආපසු ලබා දෙන බව පෙනේ. ඔබට අවශ්‍ය වගුව දර්ශනය නොවන්නේ නම් එය බැලීමට වගුවක් තෝරන්න සහ නැවුම් කරන්න ක්ලික් කරන්න.
pcdev

Azure "සැබෑ" නොවේ SQL සේවාදායකය (ha ha)
ප්‍රතිලෝම ඉංජිනේරු



41

යම් සෙවීමකින් පසුව, සියලු වගු පිළිබඳ තොරතුරු ලබා ගැනීමට මට පහසු ක්‍රමයක් සොයා ගැනීමට නොහැකි විය. දත්ත සමුදාය භාවිතා කරන සියලු ඉඩ නැවත ලබා දෙන sp_spaceused නමින් ගබඩා කර ඇති ක්‍රියා පටිපාටියක් ඇත. වගු නාමයක් සපයා ඇත්නම්, එය එම වගුව භාවිතා කළ ඉඩ නැවත ලබා දෙයි. කෙසේ වෙතත්, තීරු අක්ෂර අගයන් බැවින් ගබඩා කළ ක්‍රියාපටිපාටිය මඟින් ලැබෙන ප්‍රති results ල වර්ග කළ නොහැක.

පහත දැක්වෙන පිටපත මා සොයන තොරතුරු ජනනය කරනු ඇත.

create table #TableSize (
    Name varchar(255),
    [rows] int,
    reserved varchar(255),
    data varchar(255),
    index_size varchar(255),
    unused varchar(255))
create table #ConvertedSizes (
    Name varchar(255),
    [rows] int,
    reservedKb int,
    dataKb int,
    reservedIndexSize int,
    reservedUnused int)

EXEC sp_MSforeachtable @command1="insert into #TableSize
EXEC sp_spaceused '?'"
insert into #ConvertedSizes (Name, [rows], reservedKb, dataKb, reservedIndexSize, reservedUnused)
select name, [rows], 
SUBSTRING(reserved, 0, LEN(reserved)-2), 
SUBSTRING(data, 0, LEN(data)-2), 
SUBSTRING(index_size, 0, LEN(index_size)-2), 
SUBSTRING(unused, 0, LEN(unused)-2)
from #TableSize

select * from #ConvertedSizes
order by reservedKb desc

drop table #TableSize
drop table #ConvertedSizes

ඉහත සඳහන් දේ පෙරදැක්ම භාවිතා කර පොලිස් අධිකාරීවරයා මේ වගේ දෙයක් ලිවීමට යන විට, එය මට ටිකක් කාලය ඉතිරි කර ගැනීම දැකීම සතුටට කරුණකි.
බ්‍රැඩ්

37
 exec  sp_spaceused N'dbo.MyTable'

සියලුම වගු සඳහා, භාවිතා කරන්න .. (පාවුල්ගේ අදහස් වලින් එකතු කිරීම)

exec sp_MSForEachTable 'exec sp_spaceused [?]'

5
Sneaky - ඔබ වෙනස් exec sp_helpdbවන නොවේ වගු ගැන කිසිම දෙයක් පෙන්වන්නේ exec sp_spaceusedනමුත් එක වගුව සඳහා වරකට ... එය ඔබ ඔබ මේ දේවල් වගු සහ කෙතරම් පේළි ඔවුන් හා කරන ආකාරය පිළිබඳ පෙර දැක්මක් ලබා නැහැ - එය නොසලකා ඔවුන් වැඩි ඉඩක් ගනී.
marc_s

4
exec sp_MSForEachTable 'exec sp_spaceused [?]'
පෝල්

27

ඉහත විමසීම් වගුව භාවිතා කරන ඉඩ ප්‍රමාණය සොයා ගැනීම සඳහා හොඳය (දර්ශක ඇතුළත්), නමුත් ඔබට මේසය මත ඇති දර්ශක මගින් කොපමණ ඉඩ ප්‍රමාණයක් භාවිතා කරන්නේද යන්න සැසඳීමට අවශ්‍ය නම් මෙම විමසුම භාවිතා කරන්න:

SELECT
    OBJECT_NAME(i.OBJECT_ID) AS TableName,
    i.name AS IndexName,
    i.index_id AS IndexID,
    8 * SUM(a.used_pages) AS 'Indexsize(KB)'
FROM
    sys.indexes AS i
    JOIN sys.partitions AS p ON p.OBJECT_ID = i.OBJECT_ID AND p.index_id = i.index_id
    JOIN sys.allocation_units AS a ON a.container_id = p.partition_id
WHERE
    i.is_primary_key = 0 -- fix for size discrepancy
GROUP BY
    i.OBJECT_ID,
    i.index_id,
    i.name
ORDER BY
    OBJECT_NAME(i.OBJECT_ID),
    i.index_id

කිසියම් වගුවක් සඳහා සුචිගත කිරීමේ (KB) තීරුව සාරාංශ කිරීම sp_spaceused වෙතින් index_size සමඟ එකඟ නොවීමට හේතුව කුමක්ද?
ඩෙරෙක්

E ඩෙරෙක් එකතු කිරීමෙන් ඔහුගේ පිළිතුර නිවැරදි කළේය where [i].[is_primary_key] = 0. දැන් ප්රමාණ ගැලපිය යුතුය.
CodeAngry

ස්තූතියි, නමුත් මෙය ඇත්ත වශයෙන්ම ක්‍රියාත්මක නොවේ. මා සතුව (ඉතා කුඩා) පරීක්ෂණ දත්ත ගබඩාවක් ඇත, උනන්දුවක් දක්වන වගුවට දර්ශක දෙකක් ඇත - එක් තීරුවක ප්‍රාථමික පොකුරු දර්ශකයක් සහ අනෙක් තීරු දෙකක පොකුරු නොවන දර්ශකයක්. මෙම විමසුම පවසන්නේ ඔවුන් සෑම කෙනෙකුම 16kB භාවිතා කරන බවයි, නමුත් sp_spaceused පවසන්නේ සමස්ත දර්ශක භාවිතය 24kB බවයි. මගේ ව්‍යාකූලත්වයේ කොටසක් මෙයයි: මෙම විමසුම පිළිගත් පිළිතුරේ “පාවිච්චි කළ අවකාශය” සමඟ සසඳන විට මට සැබෑ වෙනසක් නොපෙනේ. Sys.tables එකතු කිරීම අස්ථානගත වී ඇත. මට යමක් මග හැරී තිබේද, නැතහොත් මෙම විමසුම සහජයෙන්ම කැඩී තිබේද?
ඩෙරෙක්

මට විශාල දත්ත සමුදායන් ඇත. සහ ප්‍රමාණ සමඟ ගැලපේ sp_spaceused. මම GB මැනීම නිසා මෙගා කිහිපයක් නොගැලපේ. මම නිශ්චිත ප්‍රමාණ ගැන තැකීමක් නොකරමි, අදහසක් පමණි.
කෝඩ් ඇන්ග්‍රි

15

MB සහ GB ප්‍රමාණය ලබා ගැනීම සඳහා වගු කොටස් හසුරුවන @xav පිළිතුරට දිගු කිරීම . SQL Server 2008/2012 හි පරීක්ෂා කර ඇත (රේඛාවක් අදහස් දැක්වූයේ is_memory_optimized = 1)

SELECT
    a2.name AS TableName,
    a1.rows as [RowCount],
    --(a1.reserved + ISNULL(a4.reserved,0)) * 8 AS ReservedSize_KB,
    --a1.data * 8 AS DataSize_KB,
    --(CASE WHEN (a1.used + ISNULL(a4.used,0)) > a1.data THEN (a1.used + ISNULL(a4.used,0)) - a1.data ELSE 0 END) * 8 AS IndexSize_KB,
    --(CASE WHEN (a1.reserved + ISNULL(a4.reserved,0)) > a1.used THEN (a1.reserved + ISNULL(a4.reserved,0)) - a1.used ELSE 0 END) * 8 AS UnusedSize_KB,
    CAST(ROUND(((a1.reserved + ISNULL(a4.reserved,0)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS ReservedSize_MB,
    CAST(ROUND(a1.data * 8 / 1024.00, 2) AS NUMERIC(36, 2)) AS DataSize_MB,
    CAST(ROUND((CASE WHEN (a1.used + ISNULL(a4.used,0)) > a1.data THEN (a1.used + ISNULL(a4.used,0)) - a1.data ELSE 0 END) * 8 / 1024.00, 2) AS NUMERIC(36, 2)) AS IndexSize_MB,
    CAST(ROUND((CASE WHEN (a1.reserved + ISNULL(a4.reserved,0)) > a1.used THEN (a1.reserved + ISNULL(a4.reserved,0)) - a1.used ELSE 0 END) * 8 / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSize_MB,
    --'| |' Separator_MB_GB,
    CAST(ROUND(((a1.reserved + ISNULL(a4.reserved,0)) * 8) / 1024.00 / 1024.00, 2) AS NUMERIC(36, 2)) AS ReservedSize_GB,
    CAST(ROUND(a1.data * 8 / 1024.00 / 1024.00, 2) AS NUMERIC(36, 2)) AS DataSize_GB,
    CAST(ROUND((CASE WHEN (a1.used + ISNULL(a4.used,0)) > a1.data THEN (a1.used + ISNULL(a4.used,0)) - a1.data ELSE 0 END) * 8 / 1024.00 / 1024.00, 2) AS NUMERIC(36, 2)) AS IndexSize_GB,
    CAST(ROUND((CASE WHEN (a1.reserved + ISNULL(a4.reserved,0)) > a1.used THEN (a1.reserved + ISNULL(a4.reserved,0)) - a1.used ELSE 0 END) * 8 / 1024.00 / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSize_GB
FROM
    (SELECT 
        ps.object_id,
        SUM (CASE WHEN (ps.index_id < 2) THEN row_count ELSE 0 END) AS [rows],
        SUM (ps.reserved_page_count) AS reserved,
        SUM (CASE
                WHEN (ps.index_id < 2) THEN (ps.in_row_data_page_count + ps.lob_used_page_count + ps.row_overflow_used_page_count)
                ELSE (ps.lob_used_page_count + ps.row_overflow_used_page_count)
            END
            ) AS data,
        SUM (ps.used_page_count) AS used
    FROM sys.dm_db_partition_stats ps
        --===Remove the following comment for SQL Server 2014+
        --WHERE ps.object_id NOT IN (SELECT object_id FROM sys.tables WHERE is_memory_optimized = 1)
    GROUP BY ps.object_id) AS a1
LEFT OUTER JOIN 
    (SELECT 
        it.parent_id,
        SUM(ps.reserved_page_count) AS reserved,
        SUM(ps.used_page_count) AS used
     FROM sys.dm_db_partition_stats ps
     INNER JOIN sys.internal_tables it ON (it.object_id = ps.object_id)
     WHERE it.internal_type IN (202,204)
     GROUP BY it.parent_id) AS a4 ON (a4.parent_id = a1.object_id)
INNER JOIN sys.all_objects a2  ON ( a1.object_id = a2.object_id ) 
INNER JOIN sys.schemas a3 ON (a2.schema_id = a3.schema_id)
WHERE a2.type <> N'S' and a2.type <> N'IT'
--AND a2.name = 'MyTable'       --Filter for specific table
--ORDER BY a3.name, a2.name
ORDER BY ReservedSize_MB DESC

15

අසුර් සඳහා මම මෙය භාවිතා කළෙමි:

ඔබට SSMS v17.x තිබිය යුතුය

මම පාවිච්චි කළා;

රූප විස්තරය මෙහි ඇතුළත් කරන්න

පරිශීලක ස්පාරෝ සඳහන් කළ පරිදි මේ සමඟ :

ඔබේ විවෘත Databases> සහ තෝරා මේස ,
එවිට යතුර ඔබන්න F7 ඔබ බැලිය යුතුය row count
ලෙස: රූප විස්තරය මෙහි ඇතුළත් කරන්න

මෙහි SSMS අසුර් දත්ත සමුදායන් හා සම්බන්ධ වේ


3
F7 දැඩි ලෙස භාවිතා වේ.
cskwg

1
මෙය පවතින බව මා දැන සිටියේ නැත, මම මා ගැන මඳක් ලැජ්ජා වෙමි: p ස්තූතියි!
lollancf37

එය මතකය ප්‍රශස්තිකරණය කළ වගු සමඟ ගැටළුවක් ඇත, (මම මෙම ලිපිය බැලීමෙන් පසුව පරීක්ෂා කර
බැලුවෙමි

දර්ශක අවකාශය හෝ භාවිතා කළ දත්ත අවකාශය වැනි අමතර ගුණාංග පෙන්වීමට තීරු මත දකුණු-ක්ලික් කරන්න.
ආරොන් හුඩන්

14

එස්එස්එම්එස් හි 'වගු ගුණාංග - ආචයනය' පිටුවේ ඇති එකම සංඛ්‍යා ගණනය කිරීමට ඔබට අවශ්‍ය නම්, ඔබ ඒවා එස්එස්එම්එස් හි සිදු කළ ආකාරයටම ගණනය කළ යුතුය (වර්ග සේවාදායක 2005 සහ ඊට ඉහළින් වැඩ කරයි ... සහ LOB ක්ෂේත්‍ර සහිත වගු සඳහා නිවැරදිව ක්‍රියා කරයි - මක්නිසාද යත් “භාවිතා කළ_ පිටු” ගණනය කිරීම නිවැරදි දර්ශක ප්‍රමාණය පෙන්වීමට ප්‍රමාණවත් නොවන බැවිනි):

;with cte as (
SELECT
t.name as TableName,
SUM (s.used_page_count) as used_pages_count,
SUM (CASE
            WHEN (i.index_id < 2) THEN (in_row_data_page_count + lob_used_page_count + row_overflow_used_page_count)
            ELSE lob_used_page_count + row_overflow_used_page_count
        END) as pages
FROM sys.dm_db_partition_stats  AS s 
JOIN sys.tables AS t ON s.object_id = t.object_id
JOIN sys.indexes AS i ON i.[object_id] = t.[object_id] AND s.index_id = i.index_id
GROUP BY t.name
)
select
    cte.TableName, 
    cast((cte.pages * 8.)/1024 as decimal(10,3)) as TableSizeInMB, 
    cast(((CASE WHEN cte.used_pages_count > cte.pages 
                THEN cte.used_pages_count - cte.pages
                ELSE 0 
          END) * 8./1024) as decimal(10,3)) as IndexSizeInMB
from cte
order by 2 desc

11

අපි වගු කොටස් කිරීම භාවිතා කරන අතර අනුපිටපත් වාර්තා හේතුවෙන් ඉහත දක්වා ඇති විමසුම් සමඟ යම් ගැටළුවක් ඇතිවිය.

මෙය අවශ්‍ය අය සඳහා, "තැටි භාවිතය අනුව වගුව" වාර්තාව ජනනය කිරීමේදී SQL Server 2014 විසින් ක්‍රියාත්මක කරන ලද විමසුමට පහළින් ඔබට සොයාගත හැකිය. එය SQL සේවාදායකයේ පෙර සංස්කරණ සමඟ ද ක්‍රියා කරයි යැයි මම සිතමි.

එය චාම් එකක් මෙන් ක්‍රියා කරයි.

SELECT
    a2.name AS [tablename],
    a1.rows as row_count,
    (a1.reserved + ISNULL(a4.reserved,0))* 8 AS reserved, 
    a1.data * 8 AS data,
    (CASE WHEN (a1.used + ISNULL(a4.used,0)) > a1.data THEN (a1.used + ISNULL(a4.used,0)) - a1.data ELSE 0 END) * 8 AS index_size,
    (CASE WHEN (a1.reserved + ISNULL(a4.reserved,0)) > a1.used THEN (a1.reserved + ISNULL(a4.reserved,0)) - a1.used ELSE 0 END) * 8 AS unused
FROM
    (SELECT 
        ps.object_id,
        SUM (
            CASE
                WHEN (ps.index_id < 2) THEN row_count
                ELSE 0
            END
            ) AS [rows],
        SUM (ps.reserved_page_count) AS reserved,
        SUM (
            CASE
                WHEN (ps.index_id < 2) THEN (ps.in_row_data_page_count + ps.lob_used_page_count + ps.row_overflow_used_page_count)
                ELSE (ps.lob_used_page_count + ps.row_overflow_used_page_count)
            END
            ) AS data,
        SUM (ps.used_page_count) AS used
    FROM sys.dm_db_partition_stats ps
        WHERE ps.object_id NOT IN (SELECT object_id FROM sys.tables WHERE is_memory_optimized = 1)
    GROUP BY ps.object_id) AS a1
LEFT OUTER JOIN 
    (SELECT 
        it.parent_id,
        SUM(ps.reserved_page_count) AS reserved,
        SUM(ps.used_page_count) AS used
     FROM sys.dm_db_partition_stats ps
     INNER JOIN sys.internal_tables it ON (it.object_id = ps.object_id)
     WHERE it.internal_type IN (202,204)
     GROUP BY it.parent_id) AS a4 ON (a4.parent_id = a1.object_id)
INNER JOIN sys.all_objects a2  ON ( a1.object_id = a2.object_id ) 
INNER JOIN sys.schemas a3 ON (a2.schema_id = a3.schema_id)
WHERE a2.type <> N'S' and a2.type <> N'IT'
ORDER BY a3.name, a2.name

එස්එස්එම්එස් එය කරන ආකාරය හා කොටස් නිසි ලෙස හසුරුවන ස්ක්‍රිප්ටයකට ස්තූතියි.
මයික්

8
-- Show the size of all the tables in a database sort by data size descending
SET NOCOUNT ON
DECLARE @TableInfo TABLE (tablename varchar(255), rowcounts int, reserved varchar(255), DATA varchar(255), index_size varchar(255), unused varchar(255))
DECLARE @cmd1 varchar(500)
SET @cmd1 = 'exec sp_spaceused ''?'''

INSERT INTO @TableInfo (tablename,rowcounts,reserved,DATA,index_size,unused)
EXEC sp_msforeachtable @command1=@cmd1

SELECT * FROM @TableInfo ORDER BY Convert(int,Replace(DATA,' KB','')) DESC

8

මා_සීගේ පිළිතුරෙහි කුඩා වෙනසක් , මම බොහෝ විට මෙම පිටුවට යමින් සිටින බැවින්, බොහෝ පේළි වල පළමු ඇණවුම:

SELECT
    t.NAME AS TableName,
    s.Name AS SchemaName,
    p.rows AS RowCounts,
    SUM(a.total_pages) * 8 AS TotalSpaceKB,
    SUM(a.used_pages) * 8 AS UsedSpaceKB,
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
FROM
    sys.tables t
INNER JOIN
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN
    sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN
    sys.schemas s ON t.schema_id = s.schema_id
WHERE
    t.NAME NOT LIKE 'dt%'
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255
GROUP BY
    t.Name, s.Name, p.Rows
ORDER BY
    --p.rows DESC --Uncomment to order by amount rows instead of size in KB.
    SUM(a.total_pages) DESC 

5

මෙය ඔබට ප්‍රමාණයන් ලබා දෙන අතර එක් එක් වගුව සඳහා ගණන් කිරීම් වාර්තා කරයි.

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- Get a list of tables and their sizes on disk
ALTER PROCEDURE [dbo].[sp_Table_Sizes]
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
DECLARE @table_name VARCHAR(500)  
DECLARE @schema_name VARCHAR(500)  
DECLARE @tab1 TABLE( 
        tablename VARCHAR (500) collate database_default 
       ,schemaname VARCHAR(500) collate database_default 
) 

CREATE TABLE #temp_Table ( 
        tablename sysname 
       ,row_count INT 
       ,reserved VARCHAR(50) collate database_default 
       ,data VARCHAR(50) collate database_default 
       ,index_size VARCHAR(50) collate database_default 
       ,unused VARCHAR(50) collate database_default  
) 

INSERT INTO @tab1  
SELECT Table_Name, Table_Schema  
FROM information_schema.tables  
WHERE TABLE_TYPE = 'BASE TABLE' 

DECLARE c1 CURSOR FOR 
SELECT Table_Schema + '.' + Table_Name   
FROM information_schema.tables t1  
WHERE TABLE_TYPE = 'BASE TABLE' 

OPEN c1 
FETCH NEXT FROM c1 INTO @table_name 
WHILE @@FETCH_STATUS = 0  
BEGIN   
        SET @table_name = REPLACE(@table_name, '[','');  
        SET @table_name = REPLACE(@table_name, ']','');  

        -- make sure the object exists before calling sp_spacedused 
        IF EXISTS(SELECT id FROM sysobjects WHERE id = OBJECT_ID(@table_name)) 
        BEGIN 
               INSERT INTO #temp_Table EXEC sp_spaceused @table_name, false; 
        END 

        FETCH NEXT FROM c1 INTO @table_name 
END 
CLOSE c1 
DEALLOCATE c1 

SELECT  t1.* 
       ,t2.schemaname  
FROM #temp_Table t1  
INNER JOIN @tab1 t2 ON (t1.tablename = t2.tablename ) 
ORDER BY schemaname,t1.tablename; 

DROP TABLE #temp_Table
END

2
ඔබ පශ්චාත් කේතය, XML හෝ දත්ත සාම්පල නම්, කරුණාකර මෙම පාඨ සකසනයක් එම රේඛා ඉස්මතු සහ "කේතය සාම්පල" බොත්තම (මත ක්ලික් කරන්න { }) කර්තෘ මෙවලම් තීරුව හියුස් හා ආකෘතිය කාරක රීති එය ඉස්මතු!
marc_s

4

සියලුම වගු ප්‍රමාණය එක් දත්ත ගබඩාවක ලබා ගැනීම සඳහා ඔබට මෙම විමසුම භාවිතා කළ හැකිය:

Exec sys.sp_MSforeachtable ' sp_spaceused "?" '

ප්‍රති result ල සියල්ලම තාවකාලික වගුවට ඇතුළු කිරීමට ඔබට එය වෙනස් කළ හැකි අතර ඉන් පසුව තාවකාලික වගුවෙන් තෝරන්න.

Insert into #TempTable Exec sys.sp_MSforeachtable ' sp_spaceused "?" ' 
Select * from #TempTable

3

OSQL භාවිතා කරන විධාන විමසුමේ සිට :

OSQL -E -d <*databasename*> -Q "exec sp_msforeachtable 'sp_spaceused [?]'" > result.txt

3

පහත දැක්වෙන පියවර සමඟ සියලු වගු ප්‍රමාණය ඉක්මනින් ලබා ගත හැකි ක්‍රමයක් මෙන්න:

  1. සියලුම දත්ත සමුදා වගු ලැයිස්තුගත කිරීම සඳහා දී ඇති T-SQL විධානයන් ලියන්න :

    select 'exec sp_spaceused ' + TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE'
  2. දැන් දත්ත සමුදා වගු ලැයිස්තුව පිටපත් කර නව විමසුම් විශ්ලේෂක කවුළුවකට පිටපත් කරන්න

    exec sp_spaceused table1
    exec sp_spaceused table2
    exec sp_spaceused table3
    exec sp_spaceused table4
    exec sp_spaceused table5
  3. SQL විමසුම් විශ්ලේෂකයේ , ඉහළ මෙවලම් තීරු විකල්පයෙන් තෝරන්න ප්‍රති Resultsගොනුව ( Ctrl+ Shift+ F).

  4. දැන් අවසාන මෙවලම් තීරුවෙන් සලකුණු කර ඇති ක්‍රියාත්මක කරන්න බොත්තම ඔබන්න .

  5. සියලුම වගු වල දත්ත සමුදා ප්‍රමාණය දැන් ඔබේ පරිගණකයේ ගොනුවක ගබඩා කර ඇත.

    රූප විස්තරය මෙහි ඇතුළත් කරන්න


2

මාක්_ස් පිළිතුරට ඉහළින් තවත් තීරු කිහිපයක් මම එකතු කළෙමි:

with fs
as
(
select i.object_id,
        p.rows AS RowCounts,
        SUM(a.total_pages) * 8 AS TotalSpaceKb
from     sys.indexes i INNER JOIN 
        sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id INNER JOIN 
         sys.allocation_units a ON p.partition_id = a.container_id
WHERE 
    i.OBJECT_ID > 255 
GROUP BY 
    i.object_id,
    p.rows
)

SELECT 
    t.NAME AS TableName,
    fs.RowCounts,
    fs.TotalSpaceKb,
    t.create_date,
    t.modify_date,
    ( select COUNT(1)
        from sys.columns c 
        where c.object_id = t.object_id ) TotalColumns    
FROM 
    sys.tables t INNER JOIN      
    fs  ON t.OBJECT_ID = fs.object_id
WHERE 
    t.NAME NOT LIKE 'dt%' 
    AND t.is_ms_shipped = 0
ORDER BY 
    t.Name

1

මගේ සටහන අදාළ වන්නේ SQL Server 2000 සඳහා පමණක් වන අතර එය මගේ පරිසරයේ වැඩ කිරීමට පරීක්ෂා කර ඇත.

මෙම කේතය ප්‍රවේශ වන්නේ එක් දත්ත සමුදායක් පමණක් නොව, එක් අවස්ථාවක ඇති විය හැකි සියලුම දත්ත සමුදායන් ය.

සුදුසු දත්ත එක්රැස් කිරීමට සහ ප්‍රති results ල එක් 'සජීවී' වගුවකට දැමීමට මම තාවකාලික වගු දෙකක් භාවිතා කරමි.

ආපසු ලබා දුන් දත්ත නම්: දත්ත සමුදා නාමය, දත්ත සමුදා ටේබල් නම, පේළි (වගුවේ), දත්ත (කේබී හි වගුවේ විශාලත්වය පෙනේ), ඇතුළත් කිරීමේ දත්ත (මම ස්ක්‍රිප්ට් එක අවසන් වරට ධාවනය කළේ කවදාදැයි දැන ගැනීමට මෙය ප්‍රයෝජනවත් වේ).

මෙම කේතයේ අවාසිය නම් 'දත්ත' ක්ෂේත්‍රය පූර්ණ ලෙස ගබඩා නොකිරීමයි ('කේබී' අක්ෂර එම ක්ෂේත්‍රයේ තබා ඇත), එය වර්ග කිරීම සඳහා ප්‍රයෝජනවත් වනු ඇත (නමුත් මුළුමනින්ම අවශ්‍ය නොවේ).

මෙම කේතය එහි සිටින කෙනෙකුට උදව් කර ඔවුන්ට යම් කාලයක් ඉතිරි කර දෙනු ඇතැයි අපේක්‍ෂා කරමු!

CREATE PROCEDURE [dbo].[usp_getAllDBTableSizes]

AS
BEGIN
   SET NOCOUNT OFF

   CREATE TABLE #DatabaseTables([dbname] sysname,TableName sysname)
   CREATE TABLE #AllDatabaseTableSizes(Name sysname,[rows] VARCHAR(18), reserved VARCHAR(18), data VARCHAR(18), index_size VARCHAR(18), unused VARCHAR(18))

   DECLARE @SQL nvarchar(4000)
   SET @SQL='select ''?'' AS [Database], Table_Name from [?].information_schema.tables WHERE TABLE_TYPE = ''BASE TABLE'' '

   INSERT INTO #DatabaseTables(DbName, TableName)
      EXECUTE sp_msforeachdb @Command1=@SQL

   DECLARE AllDatabaseTables CURSOR LOCAL READ_ONLY FOR   
   SELECT TableName FROM #DatabaseTables

   DECLARE AllDatabaseNames CURSOR LOCAL READ_ONLY FOR   
   SELECT DBName FROM #DatabaseTables

   DECLARE @DBName sysname  
   OPEN AllDatabaseNames  

   DECLARE @TName sysname
   OPEN AllDatabaseTables  

   WHILE 1=1 BEGIN 
      FETCH NEXT FROM AllDatabaseNames INTO @DBName  
      FETCH NEXT FROM AllDatabaseTables INTO @TName 
      IF @@FETCH_STATUS<>0 BREAK  
      INSERT INTO #AllDatabaseTableSizes
         EXEC ( 'EXEC ' + @DBName + '.dbo.sp_spaceused ' + @TName) 

   END 

   --http://msdn.microsoft.com/en-us/library/aa175920(v=sql.80).aspx
   INSERT INTO rsp_DatabaseTableSizes (DatabaseName, name, [rows], data)
      SELECT   [dbname], name, [rows],  data FROM #DatabaseTables
      INNER JOIN #AllDatabaseTableSizes
      ON #DatabaseTables.TableName = #AllDatabaseTableSizes.Name
      GROUP BY [dbname] , name, [rows],  data
      ORDER BY [dbname]
   --To be honest, I have no idea what exact duplicates we are dropping
    -- but in my case a near enough approach has been good enough.
   DELETE FROM [rsp_DatabaseTableSizes]
   WHERE name IN 
      ( 
      SELECT name 
      FROM [rsp_DatabaseTableSizes]
      GROUP BY name
      HAVING COUNT(*) > 1
      )

   DROP TABLE #DatabaseTables
   DROP TABLE #AllDatabaseTableSizes

   CLOSE AllDatabaseTables  
   DEALLOCATE AllDatabaseTables  

   CLOSE AllDatabaseNames  
   DEALLOCATE AllDatabaseNames      
END

--EXEC [dbo].[usp_getAllDBTableSizes] 

ඔබ දැනගත යුතු නම්, rsp_DatabaseTableSizes වගුව නිර්මාණය කළේ:

CREATE TABLE [dbo].[rsp_DatabaseSizes](
    [DatabaseName] [varchar](1000) NULL,
    [dbSize] [decimal](15, 2) NULL,
    [DateUpdated] [smalldatetime] NULL
) ON [PRIMARY]

GO

1

Marc_s හි පිළිතුර සඳහා සරල දිගුවක් ලෙස ( පිළිගෙන ඇති පිළිතුර ), මෙය තීරු ගණන ආපසු යැවීමට සකසා පෙරීමට ඉඩ දෙයි:

SELECT *
FROM
(

SELECT 
    t.NAME AS TableName,
    s.Name AS SchemaName,
    p.rows AS RowCounts,
    COUNT(DISTINCT c.COLUMN_NAME) as ColumnCount,
    SUM(a.total_pages) * 8 AS TotalSpaceKB, 
    (SUM(a.used_pages) * 8) AS UsedSpaceKB, 
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
INNER JOIN
    INFORMATION_SCHEMA.COLUMNS c ON t.NAME = c.TABLE_NAME
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
WHERE 
    t.NAME NOT LIKE 'dt%' 
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255
GROUP BY 
    t.Name, s.Name, p.Rows
) AS Result

WHERE
    RowCounts > 1000
    AND ColumnCount > 10
ORDER BY 
    UsedSpaceKB DESC

ඔබ තීරු වගුවට සම්බන්ධ වූ පසු, ඔබට තවදුරටත් නිවැරදි වගු ඉඩක් නොමැත. පිටත අයදුම් කිරීම නිවැරදි කිරීම වනු ඇත.
dreamca4er

0

ඉහත ark මාක් පිළිතුර මත රයිෆල් කරමින්, නවතම ප්‍රමාණ සංඛ්‍යාලේඛන ( https://msdn.microsoft.com/en-us/library/ms188776.aspx ) බල කිරීම සඳහා @ updateusage = 'true' එකතු කරන්න :

        SET NOCOUNT ON
        DECLARE @TableInfo TABLE (tablename varchar(255), rowcounts int, reserved varchar(255), DATA varchar(255), index_size varchar(255), unused varchar(255))
        DECLARE @cmd1 varchar(500)
        SET @cmd1 = 'exec sp_spaceused @objname =''?'', @updateusage =''true'' '

        INSERT INTO @TableInfo (tablename,rowcounts,reserved,DATA,index_size,unused)
        EXEC sp_msforeachtable @command1=@cmd1 
SELECT * FROM @TableInfo ORDER BY Convert(int,Replace(DATA,' KB','')) DESC

0

1GB ට වඩා විශාල වගු ප්‍රමාණයෙන් බැස ඇණවුම් කිරීම සඳහා නියැදි විමසුමක් මෙන්න.

USE YourDB
GO

DECLARE @Mult float = 8
SET @Mult = @Mult / POWER(2, 20) -- Use POWER(2, 10) for MBs

; WITH CTE AS
(
SELECT
    i.object_id,
    Rows = MAX(p.rows),
    TotalSpaceGB = ROUND(SUM(a.total_pages) * @Mult, 0),
    UsedSpaceGB = ROUND(SUM(a.used_pages) * @Mult, 0)
FROM 
    sys.indexes i
JOIN
    sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id
JOIN
    sys.allocation_units a ON p.partition_id = a.container_id
WHERE
    i.object_id > 255
GROUP BY
    i.object_id
HAVING
    SUM(a.total_pages) * @Mult > 1
)
SELECT 
    SchemaName = s.name,
    TableName = t.name,
    c.TotalSpaceGB,
    c.UsedSpaceGB,
    UnusedSpaceGB = c.TotalSpaceGB - c.UsedSpaceGB,
    [RowCount] = c.Rows
FROM 
    CTE c
JOIN    
    sys.tables t ON t.object_id = c.object_id
JOIN
    sys.schemas s ON t.schema_id = s.schema_id
ORDER BY
    c.TotalSpaceGB DESC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.