Bagaimana cara menentukan ukuran database SQL Server saya?

29

Dasar: berapa ukuran pada disk MS SQL Server DB saya?
Lebih lanjut: dapatkah saya melihat dengan cepat di mana datanya? yaitu tabel, log, dll

adambox
sumber
Apa versi SQL?
SQLChicken
ini adalah pertanyaan yang terprogram, tunjukkan di StackOverflow! baca: stackoverflow.com/questions/914182
balexandre
1
Saya tidak setuju. Ini pada dasarnya pertanyaan sysadmin. Mengapa programmer peduli jika server kehabisan ruang disk?
Nick Kavadias
2
Saya setuju dengan Nick. Ini adalah salah satu atau salah satu pertanyaan. Pertanyaan DBA jelas menjadi milik di sini.
squillman
Keduanya: pemrogram peduli tentang penanganan pengecualian jika DB kehabisan ruang yang dapat digunakan; sysadmin peduli dengan alasan yang jelas. :)
JYelton

Jawaban:

35

Anda mungkin ingin memulai dengan perintah sp_spaceused.

Sebagai contoh:

sp_spaceused Mengembalikan informasi tentang ukuran total database

sp_spaceused 'MyTable' Mengembalikan informasi tentang ukuran MyTable

Baca dokumen untuk semua hal yang bisa Anda dapatkan informasinya. Anda juga dapat menggunakan perintah sp_msforeachtable untuk menjalankan sp_space digunakan terhadap semua tabel sekaligus.

Sunting: Hati-hati dengan perintah yang terkadang mengembalikan beberapa kumpulan data, setiap set berisi kumpulan statistik yang berbeda.

David
sumber
Hanya untuk menambahkan catatan, sp_spaceused mengembalikan jumlah halaman 8KB yang ditempati file database.
Dario Solera
3
Jika db Anda adalah 2000 maka Anda mungkin perlu menjalankan DBCC UPDATEUSAGE untuk mendapatkan angka yang tepat di sini. Harus selalu benar di tahun 2005
Nick Kavadias
16

Cara termudah (tanpa mengetik!): Di SQL 2005/8 dari Management Studio, klik kanan database, pilih Laporan, Laporan Standar, Penggunaan Disk (juga Berdasarkan Tabel Top, Tabel, dan Partisi).

pengguna3047
sumber
1

Anda dapat melihat file fisik di sys.database_files. Ini memiliki jalur ke file dan ukuran (dalam blok IIRC).

sp_spaceused akan menunjukkan berapa banyak ruang yang digunakan oleh objek individual.

ConcernedOfTunbridgeWells
sumber
1

jalankan ini untuk mendapatkan ukuran per tabel:

/******************************************************************************
**    File: “GetTableSpaceUsage.sql”
**    Name: Get Table Space Useage for a specific schema
**    Auth: Robert C. Cain
**    Date: 01/27/2008
**
**    Desc: Calls the sp_spaceused proc for each table in a schema and returns
**        the Table Name, Number of Rows, and space used for each table.
**
**    Called by:
**     n/a – As needed
**
**    Input Parameters:
**     In the code check the value of @schemaname, if you need it for a
**     schema other than dbo be sure to change it.
**
**    Output Parameters:
**     NA
*******************************************************************************/

/*—————————————————————————*/
/* Drop the temp table if it's there from a previous run                     */
/*—————————————————————————*/
if object_id(N'tempdb..[#TableSizes]') is not null
  drop table #TableSizes ;
go

/*—————————————————————————*/
/* Create the temp table                                                     */
/*—————————————————————————*/
create table #TableSizes
  (
    [Table Name] nvarchar(128)   /* Name of the table */
  , [Number of Rows] char(11)    /* Number of rows existing in the table. */
  , [Reserved Space] varchar(18) /* Reserved space for table. */
  , [Data Space] varchar(18)    /* Amount of space used by data in table. */
  , [Index Size] varchar(18)    /* Amount of space used by indexes in table. */
  , [Unused Space] varchar(18)   /* Amount of space reserved but not used. */
  ) ;
go

/*—————————————————————————*/
/* Load the temp table                                                        */
/*—————————————————————————*/
declare @schemaname varchar(256) ;
-- Make sure to set next line to the Schema name you want!
set @schemaname = 'dbo' ;

-- Create a cursor to cycle through the names of each table in the schema
declare curSchemaTable cursor
  for select sys.schemas.name + '.' + sys.objects.name
      from    sys.objects
            , sys.schemas
      where   object_id > 100
              and sys.schemas.name = @schemaname
              /* For a specific table uncomment next line and supply name */
              --and sys.objects.name = 'specific-table-name-here'    
              and type_desc = 'USER_TABLE'
              and sys.objects.schema_id = sys.schemas.schema_id ;

open curSchemaTable ;
declare @name varchar(256) ;  /* This holds the name of the current table*/

-- Now loop thru the cursor, calling the sp_spaceused for each table
fetch curSchemaTable into @name ;
while ( @@FETCH_STATUS = 0 )
  begin    
    insert into #TableSizes
            exec sp_spaceused @objname = @name ;       
    fetch curSchemaTable into @name ;   
  end

/* Important to both close and deallocate! */
close curSchemaTable ;     
deallocate curSchemaTable ;


/*—————————————————————————*/
/* Feed the results back                                                     */
/*—————————————————————————*/
select [Table Name]
      , [Number of Rows]
      , [Reserved Space]
      , [Data Space]
      , [Index Size]
      , [Unused Space]
from    [#TableSizes]
order by [Table Name] ;

/*—————————————————————————*/
/* Remove the temp table                                                     */
/*—————————————————————————*/
drop table #TableSizes ;

diambil dari blog Robert Caine

Kode ini untuk Microsoft SQL 2005+

balexandre
sumber
0

Jalankan Mulai \ Program \ Microsoft SQL Server \ Enterprise Manager. Buka lembar Database, di properti% databasename% Anda dapat melihat lokasi File data & file Transaksi.


sumber
Atau jika itu SQL Server 2005, 2008, dll, buka SQL Management Studio, klik kanan database, pilih properti dan kemudian klik item kedua pada tab kiri, file. Namun ini hanya akan mengembalikan ukuran file keseluruhan - yang bisa Anda lihat hanya dengan melihat di folder tempat data dan file log disimpan.
David
0

Ini adalah permintaan / tampilan yang mendapatkan semua informasi ini, dan banyak lagi, tanpa kursor atau loop "jahat". ;-)

    /*
    vwTableInfo - Table Information View

 This view display space and storage information for every table in a
SQL Server 2005 database.
Columns are:
    Schema
    Name
    Owner       may be different from Schema)
    Columns     count of the max number of columns ever used)
    HasClusIdx  1 if table has a clustered index, 0 otherwise
    RowCount
    IndexKB     space used by the table's indexes
    DataKB      space used by the table's data

 16-March-2008, [email protected]
 31-January-2009, Edited for better formatting
*/
--CREATE VIEW vwTableInfo
-- AS

    SELECT SCHEMA_NAME(tbl.schema_id) as [Schema]
    , tbl.Name
    , Coalesce((Select pr.name 
            From sys.database_principals pr 
            Where pr.principal_id = tbl.principal_id)
        , SCHEMA_NAME(tbl.schema_id)) as [Owner]
    , tbl.max_column_id_used as [Columns]
    , CAST(CASE idx.index_id WHEN 1 THEN 1 ELSE 0 END AS bit) AS [HasClusIdx]
    , Coalesce( (Select sum (spart.rows) from sys.partitions spart 
        Where spart.object_id = tbl.object_id and spart.index_id < 2), 0) AS [RowCount]

    , Coalesce( (Select Cast(v.low/1024.0 as float) 
        * SUM(a.used_pages - CASE WHEN a.type <> 1 THEN a.used_pages WHEN p.index_id < 2 THEN a.data_pages ELSE 0 END) 
            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.object_id = tbl.object_id  )
        , 0.0) AS [IndexKB]

    , Coalesce( (Select Cast(v.low/1024.0 as float)
        * SUM(CASE WHEN a.type <> 1 THEN a.used_pages WHEN p.index_id < 2 THEN a.data_pages ELSE 0 END) 
            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.object_id = tbl.object_id)
        , 0.0) AS [DataKB]
    , tbl.create_date, tbl.modify_date

     FROM sys.tables AS tbl
      INNER JOIN sys.indexes AS idx ON (idx.object_id = tbl.object_id and idx.index_id < 2)
      INNER JOIN master.dbo.spt_values v ON (v.number=1 and v.type='E')

Nikmati.

RBarryYoung
sumber
-1

Ada beberapa deskripsi tentang cara melakukannya dari GUI.

Tahu DBA nyata: GUI adalah untuk orang bodoh

sp_helpdb

Mengembalikan set rekaman semua nama file, lokasi, ruang pada disk, dan ketik.

Anda juga dapat mengambil nama file dari tabel sysfiles masing-masing database.


sumber