Визначте розмір бази даних SQL Server


77

Випуск SQL Server 2005/2008 Express має обмеження 4 ГБ на базу даних. Наскільки мені відомо, механізм баз даних враховує лише дані, таким чином виключаючи файли журналів, невикористаний простір та розмір індексу.

Отримання довжини файлу MDF не повинно дати правильного розміру бази даних з точки зору обмежень SQL Server. Моє питання полягає в тому, як отримати розмір бази даних?

Відповіді:


102

sp_spaceused


7
sp_spaceused враховує розмір файлу журналу, тому, якщо у вас дійсно невеликий db і дуже великий файл журналу, результат від sp_spaceused буде вводити в оману при спробі визначити, наскільки близько ви до обмеження 4 ГБ.
Ламар

77

sp_helpdb

не потрібні цикли, на відміну від sp_spaceused.


5
Видає виділений розмір БД (розмір mdf-файлу), а не фактичний використаний розмір.
Mrchief

16

Відповідно до довідки SQL2000, sp_spaceused включає дані та індекси.

Цей сценарій повинен робити:

CREATE TABLE #t (name SYSNAME, rows CHAR(11), reserved VARCHAR(18), 
data VARCHAR(18), index_size VARCHAR(18), unused VARCHAR(18))

EXEC sp_msforeachtable 'INSERT INTO #t EXEC sp_spaceused ''?'''
-- SELECT * FROM #t ORDER BY name
-- SELECT name, CONVERT(INT, SUBSTRING(data, 1, LEN(data)-3)) FROM #t ORDER BY name
SELECT SUM(CONVERT(INT, SUBSTRING(data, 1, LEN(data)-3))) FROM #t
DROP TABLE #t

Це ВЕЛИКА відповідь. Дякую за сценарій - дуже корисно!
Кевін Бабкок,

14

У SQL Management Studio клацніть правою кнопкою миші на базі даних і виберіть "Властивості" в контекстному меню. Подивіться на малюнок "Розмір".


8

Найкраще рішення - це, можливо, розрахувати розмір кожного файлу бази даних, використовуючи подання sys.sysfiles, враховуючи розмір 8 КБ для кожної сторінки, наступним чином:

USE [myDatabase]
GO

SELECT
    [size] * 8
    , [filename]
FROM sysfiles

Стовпець [поле] відображає розмір файлу на сторінках ( посилання MSDN на файли sysfiles ).

Ви б побачили, що буде принаймні два файли (MDF та LDF): сума цих файлів дасть вам правильний розмір всієї бази даних ...


6
+1 SELECT SUM(size)/128.0 AS size FROM sysfilesповертає те саме значення sp_spaceused, що й аналізувати, але може бути простіше для автоматичного аналізу.
Євген Рябцев

5

Мені завжди подобалося прямим шляхом:

SELECT 
    DB_NAME( dbid ) AS DatabaseName, 
    CAST( ( SUM( size ) * 8 ) / ( 1024.0 * 1024.0 ) AS decimal( 10, 2 ) ) AS DbSizeGb 
FROM 
    sys.sysaltfiles 
GROUP BY 
    DB_NAME( dbid )

2
Майте на увазі, що в SQL 2005 + файли sysalt не можуть бути прочитані основним обліковим записом користувача (тобто таким, що не має спеціальних дозволів). Навіть якщо ви додасте логін до основної бази даних і GRANT SELECT на master..sysaltfiles або sys.sysaltfiles, оператор select у цій таблиці поверне порожній набір записів. Немає проблем із використанням облікового запису sysadmin.
Mike

2

Ви можете використати і цей старомодний ...

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

DECLARE @iCount int, @iMax int, @DatabaseName varchar(200), @SQL varchar (8000)

Select NAME, DBID, crdate, filename, version 
INTO #TEMP
from MAster..SYSDatabASES 

SELECT @iCount = Count(DBID) FROM #TEMP

Select @SQL='Create Table ##iFile1 ( DBName varchar( 200) NULL, Fileid INT, FileGroup int, TotalExtents INT , USedExtents INT , 
Name varchar(100), vFile varchar (300), AllocatedSpace int NUll, UsedSpace int Null, PercentageFree int Null ) '+ char(10)
exec (@SQL)


Create Table ##iTotals ( ServerName varchar(100), DBName varchar( 200) NULL, FileType varchar(10),Fileid INT, FileGroup int, TotalExtents INT , USedExtents INT , 
Name varchar(100), vFile varchar (300), AllocatedSpace int NUll, UsedSpace int Null, PercentageFree int Null ) 


WHILE @iCount>0
BEGIN    
    SELECT @iMax =Max(dbid) FROM #TEMP
    Select @DatabaseName = Name FROM #TEMP where dbid =@iMax

    SELECT @SQL = 'INSERT INTO ##iFile1(Fileid , FileGroup , TotalExtents  , USedExtents  , Name , vFile)
     EXEC (''USE [' + @DatabaseName +  '] DBCC showfilestats'')    ' + char(10)

    Print  (@SQL)
    EXEC (@SQL)


    SELECT @SQL = 'UPDATE ##iFile1 SET DBName ='''+ @DatabaseName +''' WHERE DBName IS NULL'
    EXEC  (@SQL)


    DELETE FROM #TEMP WHERE dbid =@iMax
    Select @iCount =@iCount -1
END
UPDATE ##iFile1
SET AllocatedSpace = (TotalExtents * 64.0 / 1024.0 ), UsedSpace =(USedExtents * 64.0 / 1024.0 )

UPDATE ##iFile1
SET PercentageFree = 100-Convert(float,UsedSpace)/Convert(float,AllocatedSpace   )* 100
WHERE USEDSPACE>0

CREATE TABLE #logspace (
   DBName varchar( 100),
   LogSize float,
   PrcntUsed float,
   status int
   )
INSERT INTO #logspace
EXEC ('DBCC sqlperf( logspace)')



INSERT INTO ##iTotals(ServerName, DBName, FileType,Name, vFile,PercentageFree,AllocatedSpace)
select @@ServerName ,DBNAME,  'Data' as FileType,Name, vFile, PercentageFree  , AllocatedSpace
from ##iFile1
UNION
select @@ServerName ,DBNAME, 'Log' as FileType ,DBName,'' as vFile ,PrcntUsed  , LogSize
from #logspace

Select * from ##iTotals

select ServerName ,DBNAME,  FileType, Sum( AllocatedSpace) as AllocatedSpaceMB
from ##iTotals
Group By  ServerName ,DBNAME, FileType
Order By  ServerName ,DBNAME, FileType


select ServerName ,DBNAME,  Sum( AllocatedSpace) as AllocatedSpaceMB
from ##iTotals
Group By  ServerName ,DBNAME
Order By  ServerName ,DBNAME



drop table ##iFile1
drop table #logspace
drop table #TEMP
drop table ##iTotals

0

Загальний запит для перевірки розміру бази даних у SQL Server, який підтримує як Azure, так і On-Premises-

Спосіб 1 - Використання перегляду системи 'sys.database_files'

SELECT
    DB_NAME() AS [database_name],
    CONCAT(CAST(SUM(
        CAST( (size * 8.0/1024) AS DECIMAL(15,2) )
    ) AS VARCHAR(20)),' MB') AS [database_size]
FROM sys.database_files;

Спосіб 2 - Використання збереженої в системі процедури 'sp_spaceused'

EXEC sp_spaceused ;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.