2008-10-06 5 views
72

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

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

ответ

91

sp_spaceused

+5

sp_spaceused принимает во внимание размер файла журнала, так что если у вас есть на самом деле небольшой дб и это очень большой файл журнала, Ресул t из sp_spaceused будет вводить в заблуждение при попытке определить, насколько вы близки к пределу 4 ГБ. – Lamar 2008-12-28 07:08:31

+0

Вопрос явно запрашивает файл журнала, который будет включен. Он ошибается в отношении файла журнала, применяемого к пределу 4 ГБ? – 2008-12-29 14:37:45

+1

+1 для короткого замыкания. Я люблю короткие ответы! – ren 2012-04-02 20:18:27

14

В SQL Management Studio щелкните правой кнопкой мыши на базе данных и выберите «Свойства» из контекстного меню. Посмотрите на цифру «Размер».

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 
+0

Это БОЛЬШОЙ ответ. Спасибо за скрипт - очень полезно! – 2011-05-19 03:28:51

74

sp_helpdb

не требуется подключение петлей, в отличие от sp_spaceused.

6

Лучшее решение может быть, чтобы вычислить размер каждого файла базы данных, используя вид sys.sysfiles, учитывая размер 8 Кбайт для каждой страницы, как показано ниже:

USE [myDatabase] 
GO 

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

Столбец [поле] представляет размер файла, на страницах (MSDN Reference to sysfiles).

Вы бы видели там будет по крайней мере два файла (MDF и LDF): сумма этих файлов даст вам правильный размер всей базы данных ...

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 [email protected] 

    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 [email protected] 
    Select @iCount [email protected] -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 
4

Я всегда любил ходить за ним непосредственно:

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) 
Смежные вопросы