Pertanyaan Dapatkan ukuran semua tabel dalam basis data


Saya telah mewarisi database SQL Server yang cukup besar. Tampaknya mengambil lebih banyak ruang dari yang saya harapkan, mengingat data yang dikandungnya.

Apakah ada cara mudah untuk menentukan berapa banyak ruang pada disk yang dikonsumsi setiap tabel?


896
2017-10-25 16:14


asal


Jawaban:


SELECT 
    t.NAME AS TableName,
    s.Name AS SchemaName,
    p.rows AS RowCounts,
    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 
    t.Name

1883
2017-10-25 16:16



Jika Anda menggunakan SQL Server Management Studio (SSMS), alih-alih menjalankan kueri (yang dalam kasus saya mengembalikan baris duplikat) Anda dapat menjalankan laporan standar.

  1. Klik kanan pada database
  2. Navigasi ke Laporan> Laporan Standar> Penggunaan Disk Dengan Tabel

Catatan: Tingkat kompatibilitas basis data harus diatur ke 90 atau lebih tinggi agar ini berfungsi dengan benar. Lihat http://msdn.microsoft.com/en-gb/library/bb510680.aspx


402
2018-04-24 13:46



sp_spaceused dapat memberi Anda informasi tentang ruang disk yang digunakan oleh tabel, tampilan terindeks, atau seluruh basis data.

Sebagai contoh:

USE MyDatabase; GO

EXEC sp_spaceused N'User.ContactInfo'; GO

Ini melaporkan informasi penggunaan disk untuk tabel ContactInfo.

Untuk menggunakan ini untuk semua tabel sekaligus:

USE MyDatabase; GO

sp_msforeachtable 'EXEC sp_spaceused [?]' GO

Anda juga bisa mendapatkan penggunaan disk dari dalam fungsi Klik Standar Standar kanan dari SQL Server. Untuk mendapatkan laporan ini, navigasikan dari objek server di Object Explorer, pindah ke objek Databases, lalu klik kanan database apa pun. Dari menu yang muncul, pilih Laporan, lalu Laporan Standar, lalu "Disk Usage by Partition: [DatabaseName]".


78
2017-10-25 16:24



 exec  sp_spaceused N'dbo.MyTable'

Untuk semua tabel, gunakan .. (tambahkan dari komentar Paul)

exec sp_MSForEachTable 'exec sp_spaceused [?]'

26
2017-10-25 16:17



Setelah beberapa pencarian, saya tidak dapat menemukan cara mudah untuk mendapatkan informasi tentang semua tabel. Ada prosedur tersimpan yang berguna bernama sp_spaceused yang akan mengembalikan semua ruang yang digunakan oleh database. Jika disediakan dengan nama tabel, itu mengembalikan ruang yang digunakan oleh tabel itu. Namun, hasil yang dikembalikan oleh prosedur yang tersimpan tidak dapat diurutkan, karena kolom adalah nilai karakter.

Naskah berikut akan menghasilkan informasi yang saya cari.

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

25
2017-10-25 16:17



Berikut ini metode lain: menggunakan SQL Server Management Studio, di Obyek Explorer, buka database Anda dan pilih Meja

enter image description here

Kemudian buka Rincian Obyek Explorer (baik dengan menekan F7 atau pergi ke Lihat-> Rincian Obyek Explorer). Di halaman detail objek explorer, klik kanan pada tajuk kolom dan aktifkan kolom yang ingin Anda lihat di halaman. Anda dapat mengurutkan data berdasarkan kolom apa pun.

enter image description here


17
2018-01-18 17:11



Kueri di atas bagus untuk menemukan jumlah ruang yang digunakan oleh tabel (termasuk indeks), tetapi jika Anda ingin membandingkan berapa banyak ruang yang digunakan oleh indeks di tabel, gunakan kueri ini:

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
GROUP BY
    i.OBJECT_ID,
    i.index_id,
    i.name
ORDER BY
    OBJECT_NAME(i.OBJECT_ID),
    i.index_id

13
2017-07-11 18:36