2013-08-02 79 views
96

làm thế nào tôi có thể truy vấn máy chủ sql của tôi để chỉ nhận được kích thước của cơ sở dữ liệu?Chọn kích thước cơ sở dữ liệu SQL Server

Tôi sử dụng này:

use "MY_DB" 
exec sp_spaceused 

Tôi nhận điều này:

database_name database_size unallocated space 
My_DB   17899.13 MB 5309.39 MB 

Nó trả về cho tôi một vài cột rằng tôi không cần, có lẽ đó là một thủ thuật để chọn database_size cột từ lưu trữ này thủ tục?

Tôi cũng đã cố gắng mã này:

SELECT DB_NAME(database_id) AS DatabaseName, 
     Name AS Logical_Name, 
     Physical_Name, 
     (size * 8)/1024 SizeMB 
FROM sys.master_files 
WHERE DB_NAME(database_id) = 'MY_DB' 

Nó mang lại cho tôi kết quả này:

DatabaseName Logical_Name Physical_Name     SizeMB 
MY_DB   MY_DB   D:\MSSQL\Data\MY_DB.mdf   10613 
MY_DB   MY_DB_log  D:\MSSQL\Data\MY_DB.ldf   7286 

Vì vậy, tôi đã viết này:

SELECT SUM(SizeMB) 
FROM (
    SELECT DB_NAME(database_id) AS DatabaseName, 
      Name AS Logical_Name, 
      Physical_Name, 
      (size * 8)/1024 SizeMB 
    FROM sys.master_files 
    WHERE DB_NAME(database_id) = 'MY_DB' 
) AS TEMP 

tôi nhận: 1183

Vì vậy, nó hoạt động nhưng có thể có là một cách thích hợp để có được điều này?

+2

kết quả tương tự sẽ được với điều này 'SUM SELECT ((kích thước * 8)/1024) SIZEMB TỪ sys.master_files ĐÂU db_name (database_id) = 'YOUR_DB'' – sickUnit

+0

@LittlBobbyTables Làm thế nào tôi có thể thêm MB cột? Tôi muốn "MB" sau giá trị –

Trả lời

139

Hãy thử điều này một -

Query:

SELECT 
     database_name = DB_NAME(database_id) 
    , log_size_mb = CAST(SUM(CASE WHEN type_desc = 'LOG' THEN size END) * 8./1024 AS DECIMAL(8,2)) 
    , row_size_mb = CAST(SUM(CASE WHEN type_desc = 'ROWS' THEN size END) * 8./1024 AS DECIMAL(8,2)) 
    , total_size_mb = CAST(SUM(size) * 8./1024 AS DECIMAL(8,2)) 
FROM sys.master_files WITH(NOWAIT) 
WHERE database_id = DB_ID() -- for current db 
GROUP BY database_id 

Output:

-- my query 
name   log_size_mb row_size_mb total_size_mb 
-------------- ------------ ------------- ------------- 
xxxxxxxxxxx 512.00  302.81  814.81 

-- sp_spaceused 
database_name database_size  unallocated space 
---------------- ------------------ ------------------ 
xxxxxxxxxxx  814.81 MB   13.04 MB 

Chức năng:

ALTER FUNCTION [dbo].[GetDBSize] 
(
    @db_name NVARCHAR(100) 
) 
RETURNS TABLE 
AS 
RETURN 

    SELECT 
     database_name = DB_NAME(database_id) 
     , log_size_mb = CAST(SUM(CASE WHEN type_desc = 'LOG' THEN size END) * 8./1024 AS DECIMAL(8,2)) 
     , row_size_mb = CAST(SUM(CASE WHEN type_desc = 'ROWS' THEN size END) * 8./1024 AS DECIMAL(8,2)) 
     , total_size_mb = CAST(SUM(size) * 8./1024 AS DECIMAL(8,2)) 
    FROM sys.master_files WITH(NOWAIT) 
    WHERE database_id = DB_ID(@db_name) 
     OR @db_name IS NULL 
    GROUP BY database_id 

CẬP NHẬT 2016/01/22:

Hiển thị thông tin về kích thước, không gian trống, cơ sở dữ liệu cuối cùng sao lưu

IF OBJECT_ID('tempdb.dbo.#space') IS NOT NULL 
    DROP TABLE #space 

CREATE TABLE #space (
     database_id INT PRIMARY KEY 
    , data_used_size DECIMAL(18,2) 
    , log_used_size DECIMAL(18,2) 
) 

DECLARE @SQL NVARCHAR(MAX) 

SELECT @SQL = STUFF((
    SELECT ' 
    USE [' + d.name + '] 
    INSERT INTO #space (database_id, data_used_size, log_used_size) 
    SELECT 
      DB_ID() 
     , SUM(CASE WHEN [type] = 0 THEN space_used END) 
     , SUM(CASE WHEN [type] = 1 THEN space_used END) 
    FROM (
     SELECT s.[type], space_used = SUM(FILEPROPERTY(s.name, ''SpaceUsed'') * 8./1024) 
     FROM sys.database_files s 
     GROUP BY s.[type] 
    ) t;' 
    FROM sys.databases d 
    WHERE d.[state] = 0 
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') 

EXEC sys.sp_executesql @SQL 

SELECT 
     d.database_id 
    , d.name 
    , d.state_desc 
    , d.recovery_model_desc 
    , t.total_size 
    , t.data_size 
    , s.data_used_size 
    , t.log_size 
    , s.log_used_size 
    , bu.full_last_date 
    , bu.full_size 
    , bu.log_last_date 
    , bu.log_size 
FROM (
    SELECT 
      database_id 
     , log_size = CAST(SUM(CASE WHEN [type] = 1 THEN size END) * 8./1024 AS DECIMAL(18,2)) 
     , data_size = CAST(SUM(CASE WHEN [type] = 0 THEN size END) * 8./1024 AS DECIMAL(18,2)) 
     , total_size = CAST(SUM(size) * 8./1024 AS DECIMAL(18,2)) 
    FROM sys.master_files 
    GROUP BY database_id 
) t 
JOIN sys.databases d ON d.database_id = t.database_id 
LEFT JOIN #space s ON d.database_id = s.database_id 
LEFT JOIN (
    SELECT 
      database_name 
     , full_last_date = MAX(CASE WHEN [type] = 'D' THEN backup_finish_date END) 
     , full_size = MAX(CASE WHEN [type] = 'D' THEN backup_size END) 
     , log_last_date = MAX(CASE WHEN [type] = 'L' THEN backup_finish_date END) 
     , log_size = MAX(CASE WHEN [type] = 'L' THEN backup_size END) 
    FROM (
     SELECT 
       s.database_name 
      , s.[type] 
      , s.backup_finish_date 
      , backup_size = 
         CAST(CASE WHEN s.backup_size = s.compressed_backup_size 
            THEN s.backup_size 
            ELSE s.compressed_backup_size 
         END/1048576.0 AS DECIMAL(18,2)) 
      , RowNum = ROW_NUMBER() OVER (PARTITION BY s.database_name, s.[type] ORDER BY s.backup_finish_date DESC) 
     FROM msdb.dbo.backupset s 
     WHERE s.[type] IN ('D', 'L') 
    ) f 
    WHERE f.RowNum = 1 
    GROUP BY f.database_name 
) bu ON d.name = bu.database_name 
ORDER BY t.total_size DESC 

Output:

database_id name        state_desc recovery_model_desc total_size data_size data_used_size log_size log_used_size full_last_date   full_size log_last_date   log_size 
----------- -------------------------------- ------------ ------------------- ------------ ----------- --------------- ----------- -------------- ----------------------- ------------ ----------------------- --------- 
24   StackOverflow     ONLINE  SIMPLE    66339.88  65840.00 65102.06  499.88  5.05   NULL     NULL   NULL     NULL 
11   AdventureWorks2012    ONLINE  SIMPLE    16404.13  15213.00 192.69   1191.13  15.55   2015-11-10 10:51:02.000 44.59  NULL     NULL 
10   locateme       ONLINE  SIMPLE    1050.13  591.00  2.94   459.13  6.91   2015-11-06 15:08:34.000 17.25  NULL     NULL 
8   CL_Documents      ONLINE  FULL    793.13  334.00  333.69   459.13  12.95   2015-11-06 15:08:31.000 309.22  2015-11-06 13:15:39.000 0.01 
1   master       ONLINE  SIMPLE    554.00  492.06  4.31   61.94  5.20   2015-11-06 15:08:12.000 0.65   NULL     NULL 
9   Refactoring      ONLINE  SIMPLE    494.32  366.44  308.88   127.88  34.96   2016-01-05 18:59:10.000 37.53  NULL     NULL 
3   model       ONLINE  SIMPLE    349.06  4.06  2.56   345.00  0.97   2015-11-06 15:08:12.000 0.45   NULL     NULL 
13   sql-format.com     ONLINE  SIMPLE    216.81  181.38  149.00   35.44  3.06   2015-11-06 15:08:39.000 23.64  NULL     NULL 
23   users       ONLINE  FULL    173.25  73.25  3.25   100.00  5.66   2015-11-23 13:15:45.000 0.72   NULL     NULL 
4   msdb        ONLINE  SIMPLE    46.44  20.25  19.31   26.19  4.09   2015-11-06 15:08:12.000 2.96   NULL     NULL 
21   SSISDB       ONLINE  FULL    45.06  40.00  4.06   5.06  4.84   2014-05-14 18:27:11.000 3.08   NULL     NULL 
27   tSQLt       ONLINE  SIMPLE    9.00   5.00  3.06   4.00  0.75   NULL     NULL   NULL     NULL 
2   tempdb       ONLINE  SIMPLE    8.50   8.00  4.50   0.50  1.78   NULL     NULL   NULL     NULL 
+3

Người dùng đang thực hiện truy vấn phải có ít nhất vai trò máy chủ SQL ** sysadmin **, nếu không thì NULL sẽ được trả lại. –

+2

Tôi có một số VLDB gây ra DECIMAL (8,2) thành yeild "Lỗi tràn số học chuyển đổi số sang kiểu dữ liệu số." Thay đổi DECIMAL (8,2) thành DECIMAL (12,2) là bản sửa lỗi. – colbybhearn

+1

Đẹp nhất, sẽ hữu ích khi có Đơn vị trong tên cột. – Rod

1

BẠN kiểm tra như thế nào truy vấn này làm việc trong các liên kết dưới đây.

https://gallery.technet.microsoft.com/SIZE-OF-ALL-DATABASES-IN-0337f6d5/

IF OBJECT_ID('tempdb..#spacetable') IS NOT NULL 
DROP TABLE tempdb..#spacetable 
create table #spacetable 
(
database_name varchar(50) , 
total_size_data int, 
space_util_data int, 
space_data_left int, 
percent_fill_data float, 
total_size_data_log int, 
space_util_log int, 
space_log_left int, 
percent_fill_log char(50), 
[total db size] int, 
[total size used] int, 
[total size left] int 
) 
insert into #spacetable 
EXECUTE master.sys.sp_MSforeachdb 'USE [?]; 
select x.[DATABASE NAME],x.[total size data],x.[space util],x.[total size data]-x.[space util] [space left data], 
x.[percent fill],y.[total size log],y.[space util], 
y.[total size log]-y.[space util] [space left log],y.[percent fill], 
y.[total size log]+x.[total size data] ''total db size'' 
,x.[space util]+y.[space util] ''total size used'', 
(y.[total size log]+x.[total size data])-(y.[space util]+x.[space util]) ''total size left'' 
from (select DB_NAME() ''DATABASE NAME'', 
sum(size*8/1024) ''total size data'',sum(FILEPROPERTY(name,''SpaceUsed'')*8/1024) ''space util'' 
,case when sum(size*8/1024)=0 then ''divide by zero'' else 
substring(cast((sum(FILEPROPERTY(name,''SpaceUsed''))*1.0*100/sum(size)) as CHAR(50)),1,6) end ''percent fill'' 
from sys.master_files where database_id=DB_ID(DB_NAME()) and type=0 
group by type_desc ) as x , 
(select 
sum(size*8/1024) ''total size log'',sum(FILEPROPERTY(name,''SpaceUsed'')*8/1024) ''space util'' 
,case when sum(size*8/1024)=0 then ''divide by zero'' else 
substring(cast((sum(FILEPROPERTY(name,''SpaceUsed''))*1.0*100/sum(size)) as CHAR(50)),1,6) end ''percent fill'' 
from sys.master_files where database_id=DB_ID(DB_NAME()) and type=1 
group by type_desc )y' 
select * from #spacetable 
order by database_name 
drop table #spacetable 
25

Làm việc một cách hoàn hảo đối với tôi để tính toán SQL cơ sở dữ liệu kích thước trong SQL Server 2012

exec sp_spaceused 

enter image description here

+0

Điều này cũng hoạt động cho Azure SQL V12 (có thể V10 hoạt động, nhưng không được thử nghiệm). Đây nên là phương thức ưa thích để sử dụng với phiên bản mới hơn của MS SQL Server. +1 – Guilherme

+0

OK! tôi cũng không được thử nghiệm trên Azure Vx, hy vọng nó hoạt động trên Azure. –

4

Bạn chỉ có thể chạy như sau:

exec sp_spaceused

Nó sẽ cung cấp cho bạn tổng dung lượng được sử dụng cho cơ sở dữ liệu đó.

0
SELECT  sys.databases.name AS [Database Name], 
     CONVERT(VARCHAR,SUM(size)*8/1024)+' MB' AS [Size] 
    FROM  sys.databases 
    JOIN  sys.master_files 
    ON   sys.databases.database_id=sys.master_files.database_id 
    GROUP BY sys.databases.name 
    ORDER BY sys.databases.name 
Các vấn đề liên quan