Truy vấn sau đây sẽ cho bạn biết tỷ lệ phần trăm của @SpaceAllotted đang được sử dụng bởi dữ liệu bằng cách xem có bao nhiêu trang được phân bổ bởi các đối tượng của cơ sở dữ liệu.
Không đáng để đo mức sử dụng ở cấp hàng, vì SQL Server phân bổ tất cả không gian ở cấp độ. Mỗi phạm vi bao gồm tám trang dữ liệu 8KB. Vì vậy, nếu cơ sở dữ liệu của bạn chỉ có một hàng và hàng đó có 4 byte dữ liệu, toàn bộ phạm vi vẫn cần phải được cấp phát để giữ 4 byte đó (hoặc mức hiện tại với các trang chưa được phân bổ sẽ được sử dụng.).
DECLARE @SpaceAllotted FLOAT
-- 2MB converted to kilobytes...
SET @SpaceAllotted = 2048
SELECT
-- Allocation is done on the extent-level.
-- Each extent contains eight 8KB data pages.
((1/(@SpaceAllotted)) * CEILING(CAST(SUM([ips].[page_count]) AS FLOAT)/8) * 64) * 100 AS PercentageUsed
FROM
[sys].[dm_db_index_physical_stats](DB_ID(), NULL, NULL, NULL, NULL) ips
-- This will allow us to retrieve the page count of all tables in the
-- current database, regardless of whether or not they have clustered
-- indexes and/or non-clustered indexes.
INNER JOIN
[sys].[indexes] i
ON
[ips].[object_id] = [i].[object_id]
AND [ips].[index_id] = [i].[index_id]
Kể từ khi chúng tôi có khả năng mức độ hỗn hợp, và không tốt chiều (có nhiều cách, nhưng họ sẽ không được khá) xác định những gì trang được phân bổ cho những gì mức độ, isn này chính xác 100%. Ngoài ra, các phạm vi mở rộng thậm chí có thể có các trang miễn phí (được dành riêng và do đó vẫn chiếm dung lượng đĩa), vì vậy thông thường, ước tính này sẽ luôn ở mức thấp. Tuy nhiên, nó có lẽ là tốt nhất bạn sẽ nhận được mà không cần viết một cái gì đó để kiểm tra cơ sở dữ liệu ở cấp độ trang.
Có, hãy xem các câu trả lời khác, đây là một tùy chọn khác. Điều này về cơ bản sẽ xem xét tất cả các kích thước hiện tại của các tập tin dữ liệu trong các trang, và xác định tỷ lệ phần trăm của không gian mà họ đã tiêu thụ. Bây giờ, hãy cẩn thận ở đây ...
- Nếu không có kích thước tối đa quy định cho cơ sở dữ liệu (autogrowth được kích hoạt và không hạn chế), điều này sẽ không bay, kể từ MAX_SIZE sẽ được trả lại như -1.
- Một lần nữa, chúng tôi không thể xác định chính xác khoảng không gian được sử dụng bởi dữ liệu thực tế. Ở đây chúng tôi đang xem xét bao nhiêu không gian thực sự được sử dụng trên hệ thống tập tin.
- Chúng tôi không xem xét dung lượng tệp nhật ký. Có, điều đó vẫn tiêu thụ không gian đĩa.
Hy vọng một trong số này sẽ giải quyết được vấn đề của bạn.
SELECT
((1/CAST(SUM([df].[max_size]) AS FLOAT)) * CAST(SUM([df].[size]) AS FLOAT)) * 100 AS PercentUsed
FROM
[sys].dm_io_virtual_file_stats(DB_ID(), NULL) vfs
INNER JOIN
[sys].[database_files] df
ON
[vfs].[file_id] = [df].[file_id]
WHERE
[df].[type] = 0
này "không gian" là gì sử dụng cho? –
Bạn phân vùng dữ liệu người dùng của mình như thế nào? Có tất cả trong cùng một bảng không? Hay mỗi người dùng có bảng riêng của họ? –
Tôi có một Bảng nơi lưu tất cả dữ liệu người dùng. UserId được sử dụng để phân biệt dữ liệu người dùng cá nhân –