কীভাবে আপনি বলতে পারেন যে টেবিলগুলি কোনও এসকিউএল সার্ভার 2005 ডেটাবেসে সবচেয়ে বেশি জায়গা নিচ্ছে?


91

কীভাবে আপনি বলতে পারেন যে টেবিলগুলি কোনও এসকিউএল সার্ভার 2005 ডেটাবেসে সবচেয়ে বেশি জায়গা নিচ্ছে?

আমি নিশ্চিত যে এখানে কিছু সিস্টেম সঞ্চিত প্রক্রিয়া রয়েছে যা এই তথ্যটি দেখায়।

আমার কাছে একটি টেস্ট ডাটাবেস রয়েছে যা 1tb থেকে 23tb এ বেড়েছে। আমরা বর্তমানে ডাটাবেসে প্রচুর ক্লায়েন্ট রূপান্তর পরীক্ষার কাজ করছি যা একই রূপান্তর সঞ্চিত পদ্ধতি একাধিকবার চালিত করে ails এটি হ্রাস করে যা আমি নিশ্চিত যে লেনদেন লগ বাড়িয়ে নিচ্ছে। তবে এটি আমাকে এই প্রশ্নটি জিজ্ঞাসা করার জন্য ভাবছে।

তথ্য

বড় সমস্যাটি ডিবিও.ডাউনলোড টেবিল, এটি বিশাল স্টোরেজ তৈরি করে যা আসলে প্রয়োজন হয় না, এটি কেটে দেওয়ার আগে আমার 3 জিবি ছিল, তারপর ৫২ এমবি;)


4
মার্কস এবং ব্যারি এর উত্তর যেখানে অসামান্য তাই আমি দুজনকেই উজ্জীবিত করেছিলাম এবং অপেক্ষা করছিলাম কোনটি সবচেয়ে বেশি পদক্ষেপ পেয়েছে তাই আমি সেই "পুরষ্কারিত উত্তর" দিয়ে পুরস্কৃত করতে পারি। তবে তারা উভয়ই 5 এ বাঁধা ছিল তাই আমি কেবল একটি বেছে নিয়েছি তবে আমি উভয়ই ব্যবহার করেছি used আপনাকে অনেক ধন্যবাদ মার্ক_স এবং ব্যারি!
গেরহার্ড ওয়েইস

উত্তর:


209

এই স্ক্রিপ্টটি ব্যবহার করে দেখুন - এটি আপনার ডাটাবেসের সমস্ত সারণীর জন্য সারি সংখ্যা এবং ডেটা সারি দ্বারা ব্যবহৃত স্থান (এবং ব্যবহৃত মোট স্থান) তালিকাভুক্ত করবে:

SELECT 
 t.NAME AS TableName,
 i.name AS indexName,
 SUM(p.rows) AS RowCounts,
 SUM(a.total_pages) AS TotalPages, 
 SUM(a.used_pages) AS UsedPages, 
 SUM(a.data_pages) AS DataPages,
 (SUM(a.total_pages) * 8) / 1024 AS TotalSpaceMB, 
 (SUM(a.used_pages) * 8) / 1024 AS UsedSpaceMB, 
 (SUM(a.data_pages) * 8) / 1024 AS DataSpaceMB
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
WHERE 
 t.NAME NOT LIKE 'dt%' AND
 i.OBJECT_ID > 255 AND  
 i.index_id <= 1
GROUP BY 
 t.NAME, i.object_id, i.index_id, i.name 
ORDER BY 
 OBJECT_NAME(i.object_id) 

6
+1 উজ্জ্বল। মনে রাখবেন যে এতে ডেটা সূচকের আকার অন্তর্ভুক্ত নয়। আমার জন্য, যদিও এটি কাজটি সম্পন্ন হয়েছে।
এরিক রবার্টসন

40
আমি এটি জানতাম না, তবে আপনি যদি ম্যানেজমেন্ট স্টুডিও ব্যবহার করছেন তবে আপনি একই ফলাফলের জন্য ডাবল ডাটাবেসে ডান ক্লিক করতে পারেন এবং রিপোর্টগুলিতে> টেবিলে ডিস্ক ব্যবহার করতে পারেন।
রোসসিডেড

@ ক্রিসিডেড, এটি জানার জন্য হাসিখুশি তথ্য। ধন্যবাদ!
নিকমাভিচ

আমি পেয়েছি 'টেবিল' sys.tables 'উপস্থিত নেই'
Seano

@ সিয়ানো: এসকিউএল সার্ভারের সংস্করণটি আপনি কী ব্যবহার করছেন? ( SELECT @@VERSIONএটির জন্য রান করুন ) আপনার ডাটাবেসে কোন ডাটাবেসের সামঞ্জস্যের স্তর রয়েছে ??
marc_s

33

Sp_spectedUsed ব্যবহার করুন

Exec sp_spaceused N'YourTableName'

অথবা আপনি যদি sp_spaceusedনিজের ডাটাবেসে প্রতিটি টেবিলের জন্য এক্সিকিউট করতে চান তবে আপনি এই এসকিউএল ব্যবহার করতে পারেন:

set nocount on
create table #spaceused (
  name nvarchar(120),
  rows char(11),
  reserved varchar(18),
  data varchar(18),
  index_size varchar(18),
  unused varchar(18)
)

declare Tables cursor for
  select name
  from sysobjects where type='U'
  order by name asc

OPEN Tables
DECLARE @table varchar(128)

FETCH NEXT FROM Tables INTO @table

WHILE @@FETCH_STATUS = 0
BEGIN
  insert into #spaceused exec sp_spaceused @table
  FETCH NEXT FROM Tables INTO @table
END

CLOSE Tables
DEALLOCATE Tables 

select * from #spaceused
drop table #spaceused

exec sp_spaceused

উপরের এসকিউএল এখান থেকে


7
এসকিউএল সার্ভারের নতুন সংস্করণগুলির জন্য আপনি ব্যবহার করতে পারেনexec sp_msforeachtable 'exec sp_spaceused N''?'''
জেএনকে

4
sp_msforeachtableকমপক্ষে এসকিউএল সার্ভার 2000
এসকিউএলমেনিস

@ এসকিউএলমেনেস - তথ্যের জন্য ধন্যবাদ। আমি পোস্ট করার আগে এটি কতটা পুরানো হয়েছিল তা নিয়ে গবেষণা করেছিলাম না, তবে নিশ্চিত ছিলাম না যে এটি অনিবন্ধিত হিসাবে এটি খুঁজে পাব।
জেএনকে

4
একটি সামান্য সরল উদাহরণ: আপনি পছন্দ করেন ঠিক তেমন করে আপনি EXEC গুলি এবং অভিনব উদ্ধৃতি এড়িয়ে চলে sp_msforeachtable 'sp_spaceused [?]'যেতে পারেন। SQL2000 এ যাচাই করা হয়েছে।
চিহ্নিত করুন

এই পদ্ধতিতে সমস্যা চিহ্নিত করুন এটি একক ফলাফল সেট হিসাবে ফিরে আসে না
পল

8

রসিসিয়েডের মন্তব্য এই প্রশ্নের উত্তরটি আমার পক্ষে সবচেয়ে ভাল, আমি আশা করি এটি কোনও মন্তব্যে দাফন না করা হয়েছিল। আমার মতো লোকেদের পক্ষে সমাধানটি স্ক্রিপ্ট করার চেষ্টা না করার জন্য এটি কার্যকর হবে (ওপি কোড স্নিপেট চেয়েছিল না )

আপনি যদি ম্যানেজমেন্ট স্টুডিও ব্যবহার করছেন তবে আপনি একই ডাটাবেসে ডান ক্লিক করতে পারেন এবং একই ফলাফলের জন্য টেবিল দ্বারা রিপোর্ট -> ডিস্ক ব্যবহার করতে পারেন


জোর দেওয়ার জন্য: সার্ভার ইনস্ট্যান্স নয় , ডাটাবেসটিতে ডান ক্লিক করুন
26োলেনবেক

4

উত্তরের জন্য @মার্ক_সকে ধন্যবাদ সূচি স্পেসের তুলনায় আমাকে ডেটা জানা দরকার ছিল তাই আমি এটিকে অন্তর্ভুক্ত করার জন্য ক্যোয়ারিতে এগিয়ে গিয়ে প্রসারিত হয়েছি।

SELECT TableName
    , SUM(DataRowCounts) AS DataRowCounts
    , SUM(DataTotalSpaceGB) AS DataTotalSpaceGB
    , SUM(DataSpaceUsedGB) AS DataSpaceUsedGB
    , SUM(DataUnusedSpaceGB) AS DataUnusedSpaceGB
    , SUM(IndexRowCounts) AS IndexRowCounts
    , SUM(IndexTotalSpaceGB) AS IndexTotalSpaceGB
    , SUM(IndexSpaceUsedGB) AS IndexSpaceUsedGB
    , SUM(IndexUnusedSpaceGB) AS IndexUnusedSpaceGB
    , SUM(DataTotalSpaceGB) + SUM(IndexTotalSpaceGB) AS TotalSpaceGB
FROM
(
SELECT t.NAME AS TableName
    , i.type_desc AS IndexType
    , CASE WHEN i.type_desc IN ('CLUSTERED', 'CLUSTERED COLUMNSTORE', 'HEAP') THEN CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2)/1000 AS NUMERIC(36, 2)) ELSE 0 END AS DataTotalSpaceGB
    , CASE WHEN i.type_desc IN ('CLUSTERED', 'CLUSTERED COLUMNSTORE', 'HEAP') THEN CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2)/1000 AS NUMERIC(36, 2))  ELSE 0 END AS DataSpaceUsedGB    
    , CASE WHEN i.type_desc IN ('CLUSTERED', 'CLUSTERED COLUMNSTORE', 'HEAP') THEN CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2)/1000 AS NUMERIC(36, 2)) ELSE 0 END AS DataUnusedSpaceGB
    , CASE WHEN i.type_desc IN ('CLUSTERED', 'CLUSTERED COLUMNSTORE', 'HEAP') THEN SUM(p.Rows) ELSE 0 END AS DataRowCounts
    , CASE WHEN i.type_desc = 'NONCLUSTERED' THEN CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2)/1000 AS NUMERIC(36, 2)) ELSE 0 END AS IndexTotalSpaceGB
    , CASE WHEN i.type_desc = 'NONCLUSTERED' THEN CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2)/1000 AS NUMERIC(36, 2))  ELSE 0 END AS IndexSpaceUsedGB    
    , CASE WHEN i.type_desc = 'NONCLUSTERED' THEN CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2)/1000 AS NUMERIC(36, 2)) ELSE 0 END AS IndexUnusedSpaceGB  
    , CASE WHEN i.type_desc = 'NONCLUSTERED' THEN SUM(p.Rows) ELSE 0 END AS IndexRowCounts
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 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
    AND s.Name = 'dbo' --update this filter
    AND t.Name = 'MyTable'
GROUP BY t.Name
    , i.type_desc
) x
GROUP BY TableName
ORDER BY TotalSpaceGB DESC
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.