Nếu bạn đang sử dụng công cụ GUI, chẳng hạn như SSMS để quản lý cơ sở dữ liệu của mình, bạn có thể dễ dàng kiểm tra kích thước cơ sở dữ liệu của mình bằng cách nhấp theo cách của bạn thông qua GUI (nhấp chuột phải vào cơ sở dữ liệu, trỏ tới Báo cáo , sau đó đến Báo cáo chuẩn, và sau đó nhấp vào Sử dụng đĩa ).
Tuy nhiên, nếu bạn muốn sử dụng T-SQL để quản lý cơ sở dữ liệu của mình, bạn sẽ cần chạy một truy vấn trả về thông tin này.
Bài viết này trình bày sáu cách để kiểm tra kích thước của cơ sở dữ liệu SQL Server bằng T-SQL.
Thủ tục lưu trữ sp_spaceused
Đây là một thủ tục được lưu trữ trong hệ thống hiển thị số hàng, dung lượng đĩa dành riêng và dung lượng đĩa được sử dụng bởi bảng, dạng xem được lập chỉ mục hoặc hàng đợi Service Broker trong cơ sở dữ liệu hiện tại hoặc hiển thị dung lượng đĩa được toàn bộ cơ sở dữ liệu dự trữ và sử dụng.
Để sử dụng nó, chỉ cần chuyển sang cơ sở dữ liệu liên quan và thực hiện quy trình. Như thế này:
USE WideWorldImporters; EXEC sp_spaceused;
Kết quả:
database_name database_size unallocated space ------------------ ------------- ----------------- WideWorldImporters 3172.00 MB 2511.76 MB 1 row(s) returned reserved data index_size unused --------- --------- ---------- ------- 573688 KB 461728 KB 104120 KB 7840 KB 1 row(s) returned
Điều này trả về hai tập hợp kết quả cung cấp thông tin liên quan.
Bạn cũng có thể cung cấp tên đối tượng để trả về dữ liệu trên một đối tượng cụ thể trong cơ sở dữ liệu. Trong trường hợp này, chỉ một tập hợp kết quả sẽ được trả về.
Ví dụ:
USE WideWorldImporters; EXEC sp_spaceused N'Application.Cities';
Kết quả:
name rows reserved data index_size unused ------ -------------------- -------- ------- ---------- ------ Cities 37940 4880 KB 3960 KB 896 KB 24 KB
Trong ví dụ này, chúng tôi trả lại thông tin về Cities
chỉ bảng.
Thủ tục lưu trữ sp_helpdb
Một quy trình khác được lưu trữ trong hệ thống là sp_helpdb
.
Dưới đây là một ví dụ về cách gọi đó:
EXEC sp_helpdb N'WideWorldImporters';
Kết quả:
name fileid filename filegroup size maxsize growth usage ------------ ------ ---------------- --------- ---------- ------------- -------- --------- WWI_Primary 1 /data/WWI.mdf PRIMARY 1048576 KB Unlimited 65536 KB data only WWI_Log 2 /data/WWI.ldf null 102400 KB 2147483648 KB 65536 KB log only WWI_UserData 3 /data/WWI_UD.ndf USERDATA 2097152 KB Unlimited 65536 KB data only
Trong trường hợp này, chúng tôi chuyển tên của cơ sở dữ liệu làm đối số. Chúng tôi cũng có thể gọi sp_helpdb
mà không cung cấp một đối số. Nếu chúng tôi làm điều này, nó sẽ trả về thông tin trên tất cả các cơ sở dữ liệu trong sys.databases
xem danh mục.
Thủ tục lưu trữ sp_databases
Tuy nhiên, một tùy chọn khác là sp_databases
hệ thống lưu trữ thủ tục. Thủ tục được lưu trữ này liệt kê các cơ sở dữ liệu nằm trong một phiên bản của SQL Server hoặc có thể truy cập được thông qua cổng cơ sở dữ liệu.
Đây là cách thực thi nó:
EXEC sp_databases;
Kết quả:
DATABASE_NAME DATABASE_SIZE REMARKS ------------------ ------------- ------- master 6848 null model 16384 null msdb 15616 null Music 16384 null Nature 16384 null Solutions 47104 null tempdb 16384 null Test 16384 null WideWorldImporters 3248128 null world 16384 null WorldData 16384 null
Chế độ xem sys.master_files
Quy trình được lưu trữ ở trên truy vấn sys.master_files
lượt xem. Vì vậy, một giải pháp thay thế là đi thẳng đến chế độ xem và chọn các cột của bạn:
SELECT name, size, size * 8/1024 'Size (MB)', max_size FROM sys.master_files WHERE DB_NAME(database_id) = 'WideWorldImporters';
Kết quả:
name size Size (MB) max_size ------------ ------ --------- --------- WWI_Primary 131072 1024 -1 WWI_Log 12800 100 268435456 WWI_UserData 262144 2048 -1
Trong trường hợp này, chúng tôi có thể thấy kích thước của từng tệp dữ liệu và tệp nhật ký, vì chúng được liệt kê riêng. Bạn cũng sẽ nhận thấy rằng tôi thực hiện một phép tính trên size
để chuyển đổi giá trị thành megabyte (MB).
Chế độ xem sys.database_files
Ngoài ra còn có một chế độ xem hệ thống được gọi là sys.database_files
. Chúng tôi có thể sử dụng chế độ xem này để trả về cùng một thông tin như ví dụ trước:
USE WideWorldImporters; SELECT name, size, size * 8/1024 'Size (MB)', max_size FROM sys.database_files;
Kết quả:
name size Size (MB) max_size ------------ ------ --------- --------- WWI_Primary 131072 1024 -1 WWI_Log 12800 100 268435456 WWI_UserData 262144 2048 -1
Sử dụng chức năng cửa sổ
Một vấn đề tiềm ẩn với hai ví dụ trước là chúng liệt kê kích thước của từng tệp riêng biệt. Điều này có thể được coi là tích cực hoặc tiêu cực tùy thuộc vào những gì bạn muốn đạt được.
Cũng có thể lập luận rằng ba giải pháp đầu tiên trên trang này có vấn đề, vì chúng chỉ cung cấp tổng số của tất cả các tệp - chúng không liệt kê ra từng tệp riêng lẻ cùng với kích thước của nó.
Vì vậy, điều gì xảy ra nếu bạn muốn xem cả kích thước của từng tệp riêng lẻ, và tổng số tất cả các tệp cho mỗi cơ sở dữ liệu?
Bạn có thể sử dụng OVER
mệnh đề để thực hiện chính xác điều đó.
Đây là một ví dụ:
SELECT d.name AS 'Database', m.name AS 'File', m.size, m.size * 8/1024 'Size (MB)', SUM(m.size * 8/1024) OVER (PARTITION BY d.name) AS 'Database Total', m.max_size FROM sys.master_files m INNER JOIN sys.databases d ON d.database_id = m.database_id;
Kết quả:
Database File Size (MB) Database Total ------------------ --------------- --------- -------------- master master 4 6 master mastlog 2 6 model modeldev 8 16 model modellog 8 16 msdb MSDBData 14 14 msdb MSDBLog 0 14 Music Music 8 16 Music Music_log 8 16 Nature Nature 8 16 Nature Nature_log 8 16 Solutions Solutions 8 46 Solutions Solutions_log 8 46 Solutions Solutions_dat_2 10 46 Solutions Solutions_dat_3 10 46 Solutions Solutions_log_2 10 46 tempdb tempdev 8 16 tempdb templog 8 16 WideWorldImporters WWI_Primary 1024 3172 WideWorldImporters WWI_Log 100 3172 WideWorldImporters WWI_UserData 2048 3172 world world 8 16 world world_log 8 16
Phần này liệt kê từng cơ sở dữ liệu, các tệp cho mỗi cơ sở dữ liệu, kích thước tệp cho mỗi tệp, cũng như tổng số tất cả các tệp cho mỗi cơ sở dữ liệu. Điều này yêu cầu mỗi cơ sở dữ liệu (và tổng kích thước của chúng) được liệt kê nhiều lần (một lần cho mỗi tệp).