SQL Server 2005/2008速成版每個數據庫的限制爲4 GB。據我所知,數據庫引擎僅考慮數據,因此不包括日誌文件,未使用的空間和索引大小。確定SQL Server數據庫大小
根據SQL Server的限制,獲取MDF文件的長度不應給出正確的數據庫大小。我的問題是如何獲得數據庫大小?
SQL Server 2005/2008速成版每個數據庫的限制爲4 GB。據我所知,數據庫引擎僅考慮數據,因此不包括日誌文件,未使用的空間和索引大小。確定SQL Server數據庫大小
根據SQL Server的限制,獲取MDF文件的長度不應給出正確的數據庫大小。我的問題是如何獲得數據庫大小?
註釋sp_spaceused
在SQL Management Studio中,在數據庫上單擊鼠標右鍵,然後從上下文菜單中選擇「屬性」。看看「大小」圖。
根據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
這是一個很好的答案。感謝您的腳本 - 非常有幫助! – 2011-05-19 03:28:51
的sp_helpdb
沒有循環需要,不像註釋sp_spaceused。
最好的解決方案是可能計算每個數據庫文件的大小,使用sys.sysfiles視圖,考慮的尺寸8 KB對於每一頁的,如下所示:
USE [myDatabase]
GO
SELECT
[size] * 8
, [filename]
FROM sysfiles
的〔字段]列表示文件的大小,以頁爲單位(MSDN Reference to sysfiles)。
你會看到會有至少兩個文件(MDF和LDF):這些文件的總和會給你整個數據庫的正確大小......
您可以使用此老式作爲一個嗯...
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
我總是喜歡直接後打算:
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)
註釋sp_spaceused考慮到日誌文件的大小,所以如果你有一個非常小的DB和一個非常大的日誌文件中, resul當試圖確定您距離4GB限制有多近時,來自sp_spaceused的t將會產生誤導。 – Lamar 2008-12-28 07:08:31
該問題明確要求包含日誌文件。日誌文件是否適用於4 GB限制? – 2008-12-29 14:37:45
+1爲簡短。我喜歡簡短的答案! – ren 2012-04-02 20:18:27