Czy możemy mieć zapytanie SQL, które w zasadzie pomoże w przeglądaniu rozmiarów tabel i indeksów w SQl Server.
W jaki sposób serwer SQL utrzymuje wykorzystanie pamięci dla tabel / indeksów?
sql-server
Kamal Joshi
źródło
źródło
sp_helpdb
Przydatna może być również procedura składowanaOdpowiedzi:
exec sp_spaceused
Bez parametru przedstawiono podsumowanie dla całej bazy danych. Rozwiązanie z możliwością planowania generuje jeden zestaw wyników na tabelę - który SSMS może nie być w stanie obsłużyć, jeśli masz zbyt wiele tabel.Stworzyłem skrypt, który zbiera informacje z tabeli za pośrednictwem
sp_spaceused
i wyświetla podsumowanie w jednym zestawie rekordów, posortowane według rozmiaru.create table #t ( name nvarchar(128), rows varchar(50), reserved varchar(50), data varchar(50), index_size varchar(50), unused varchar(50) ) declare @id nvarchar(128) declare c cursor for select '[' + sc.name + '].[' + s.name + ']' FROM sysobjects s INNER JOIN sys.schemas sc ON s.uid = sc.schema_id where s.xtype='U' open c fetch c into @id while @@fetch_status = 0 begin insert into #t exec sp_spaceused @id fetch c into @id end close c deallocate c select * from #t order by convert(int, substring(data, 1, len(data)-3)) desc drop table #t
źródło
#
.sp_spaceused podaje rozmiar wszystkich indeksów łącznie.
Jeśli chcesz określić rozmiar każdego indeksu dla tabeli, użyj jednego z tych dwóch zapytań:
SELECT i.name AS IndexName, SUM(s.used_page_count) * 8 AS IndexSizeKB FROM sys.dm_db_partition_stats AS s JOIN sys.indexes AS i ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id WHERE s.[object_id] = object_id('dbo.TableName') GROUP BY i.name ORDER BY i.name SELECT i.name AS IndexName, SUM(page_count * 8) AS IndexSizeKB FROM sys.dm_db_index_physical_stats( db_id(), object_id('dbo.TableName'), NULL, NULL, 'DETAILED') AS s JOIN sys.indexes AS i ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id GROUP BY i.name ORDER BY i.name
Wyniki są zwykle nieco inne, ale mieszczą się w granicach 1%.
źródło
Msg 102, Level 15, State 1, Line 5 - Incorrect syntax near '('.
mi się drugie zapytanie , ale nie widzę żadnych problemów ze składnią. Dowolny pomysł?W SQL 2012 uzyskanie tych informacji na poziomie tabeli stało się cudownie proste:
SQL Management Studio -> Kliknij prawym przyciskiem myszy Db -> Raporty -> Raporty standardowe -> Wykorzystanie dysku według tabeli!
Cieszyć się
źródło
źródło
{ }
) na pasku narzędzi edytora, aby ładnie go sformatować i podświetlić składnią!--Gets the size of each index for the specified table DECLARE @TableName sysname = N'SomeTable'; SELECT i.name AS IndexName ,8 * SUM(s.used_page_count) AS IndexSizeKB FROM sys.indexes AS i INNER JOIN sys.dm_db_partition_stats AS s ON i.[object_id] = s.[object_id] AND i.index_id = s.index_id WHERE s.[object_id] = OBJECT_ID(@TableName, N'U') GROUP BY i.name ORDER BY i.name; SELECT i.name AS IndexName ,8 * SUM(a.used_pages) AS IndexSizeKB FROM sys.indexes AS i INNER JOIN sys.partitions AS p ON i.[object_id] = p.[object_id] AND i.index_id = p.index_id INNER JOIN sys.allocation_units AS a ON p.partition_id = a.container_id WHERE i.[object_id] = OBJECT_ID(@TableName, N'U') GROUP BY i.name ORDER BY i.name;
źródło
Oto bardziej kompaktowa wersja najbardziej udanej odpowiedzi:
create table #tbl( name nvarchar(128), rows varchar(50), reserved varchar(50), data varchar(50), index_size varchar(50), unused varchar(50) ) exec sp_msforeachtable 'insert into #tbl exec sp_spaceused [?]' select * from #tbl order by convert(int, substring(data, 1, len(data)-3)) desc drop table #tbl
źródło
minęło dużo czasu od stworzenia tego posta, ale chciałem podzielić się moim skryptem:
WITH CteIndex AS ( SELECT reservedpages = (reserved_page_count) ,usedpages = (used_page_count) ,pages = ( CASE WHEN (s.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 ) ,s.object_id ,i.index_id ,i.type_desc AS IndexType ,i.name AS indexname FROM sys.dm_db_partition_stats s INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id ) SELECT DISTINCT DB_NAME(DB_ID()) AS DatabaseName ,o.name AS TableName ,o.object_id ,ct.indexname ,ct.IndexType ,ct.index_id , IndexSpace = LTRIM (STR ((CASE WHEN usedpages > pages THEN CASE WHEN ct.index_id < 2 THEN pages ELSE (usedpages - pages) END ELSE 0 END) * 8, 15, 0) + ' KB') FROM CteIndex ct INNER JOIN sys.objects o ON o.object_id = ct.object_id INNER JOIN sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL , NULL) ps ON ps.object_id = o.object_id AND ps.index_id = ct.index_id ORDER BY name ASC
to działa dla:
źródło
Istnieje rozszerzona procedura składowana,
sp_spaceused
która pobiera te informacje. Robienie tego ze słownika danych jest dość skomplikowane, ale to łącze prowadzi do skryptu, który to robi. To pytanie o przepełnienie stosu ma pewne rozwinięcie do informacji o bazowych strukturach danych, których można użyć do konstruowania szacunków wielkości tabel i indeksów na potrzeby planowania wielkości.źródło
To zapytanie pochodzi z dwóch innych odpowiedzi:
Uzyskaj rozmiar wszystkich tabel w bazie danych
Jak znaleźć największe obiekty w bazie danych SQL Server?
, ale ulepszyłem to, aby było uniwersalne. Używa
sys.objects
słownika:SELECT s.NAME as SCHEMA_NAME, t.NAME AS OBJ_NAME, t.type_desc as OBJ_TYPE, 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.objects t INNER JOIN sys.schemas s ON t.SCHEMA_ID = s.SCHEMA_ID 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 s.NAME, t.NAME, t.type_desc, i.object_id, i.index_id, i.name ORDER BY sum(a.total_pages) DESC ;
źródło